写点什么

那些值得称赞的 python 小亮点,断言,with 语句,格式化字符串,听我道来

发布于: 刚刚

断言

python 断言具备调试与检验的功能,它用于判断某些条件,当断言条件为 True 时,程序正常运行;当断言条件为 False 时,引发 AssertionError 异常。


例如在游戏里面设置一个未满 18 岁禁止访问的功能。


def overage18(age):    assert age >= 18, "对不起未满18岁,无法进行游戏"    print("享受欢乐游戏时光")
if __name__ == '__main__': overage18(15)
复制代码


但是这个案例并不是一个完美的案例,因为断言是为了告知 开发人员 ,你写的程序发生异常了。如果一个潜在错误在程序编写前就能考虑到,例如程序运行时网络中断,这个场景就不需要使用断言。


断言主要为调试辅助而生,为的是程序自检,并不是为了处理错误,程序 BUG 还是要依赖 try... except 解决。


由于断言是给 开发人员看的,所以下述案例的断言是有效的。


def something():  """该函数执行了很多操作"""  my_list = [] # 声明了一个空列表  # do something  return my_list
def func(): """调用 something 函数,基于结果实现某些逻辑""" ret = something() assert len(ret) == 18, "列表元素数量不对" # 完成某些操作
复制代码


使用断言要注意: 不要用断言验证用户的输入,这是因为 python 通过命令行运行时,如果增加 -O 标识,断言就被全局禁止了,你的所有验证就都丢失了。

with 语句与上下文管理器

with 语句是一个非常有用的 python 特性,它可以大幅的减少代码行数,除此之外还能有效的避免程序 BUG。


不使用 with 语句操作一个文件的代码如下:


f = open('./橡皮擦.txt','w',encoding="utf-8")try:    f.write("梦想橡皮擦")except Exception as e:    passfinally:    f.close()
复制代码


使用了 with 语句之后,代码修改为:


with open('./橡皮擦.txt','w',encoding="utf-8") as f:    f.write("梦想橡皮擦")
复制代码


与之对比的还有 threading 模块中的 Lock 对象。


lock = threading.Lock()with lock:  # do something
复制代码


自己实现上下文管理器with 语句可作用于,任意一个具备 上下文管理器 的类或者函数,所生成的对象,只需要在类的内部实现 __enter____exit__ 函数即可。


例如手动写一个属于自己的文件操作类。


class MyFileOP(object):    def __init__(self, name, mode):        self._name = name        self._mode = mode
def __enter__(self): self._file = open(self._name, self._mode, encoding="utf-8") return self._file
def __exit__(self, exc_type, exc_val, exc_tb): if self._file: self._file.close()

if __name__ == '__main__': with MyFileOP("./橡皮擦.txt", 'r') as f: print(f.read()
复制代码


当程序执行到 with 语句上下文时,首先调用的是 __enter__ 函数,完成资源初始化 ,当 with 语句执行完毕时,调用 __exit__ ,完成资源释放。


编写一个测试代码运行时间的上下文管理器主要通过封装 time 模块下相关方法实现,代码进入 with 语句时,调用 __enter__ 获取资源,离开时,调用 __exit__ 释放资源。


import time

class RunTime(object):
def __enter__(self): self._start_time = time.perf_counter()
def __exit__(self, exc_type, exc_val, exc_tb): self._duration = time.perf_counter() - self._start_time print("代码运行时间", self._duration)

if __name__ == '__main__': with RunTime(): for i in range(100000): print("橡皮擦",end="") print("")
复制代码

4 种格式化字符串浅析

通过 % 格式化字符串在学习 python 时,很多地方都会提及 % 格式化字符串,这是由于 python 继承了 C 语言的部分写法,因此出现该种操作。


print("hello %s" % "world")
复制代码


该写法随着时间的发展,可以慢慢被遗忘掉了。


通过 字符串.format 方法格式化字符串format 方法在 python3 引入,该方法较于之前的 % 写法,多了一种位置格式化操作。


print("hello {}".format("world"))
复制代码


通过 f-strings (格式化字符串字面值)从 python3.6 开始,又增加了一种格式化字符串的方法,通过在字符串前面添加特殊标识 f ,实现在字符中嵌入任意表达式。


name = "橡皮擦"print(f"{name} hello world {1 + 1}")
复制代码


通过 模板字符串实现格式化该用法不太常用,导入 string 模块的 Template 类进行实现。


from string import Template
t = Template("hello $str") # 声明一个字符串模板my_str = t.substitute(str="world") # 模板替换print(my_str)
复制代码


如何选择字符串格式化的方法,遵循一个原则即可,安全用 Template,其余用新的

发布于: 刚刚阅读数: 2
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
那些值得称赞的 python 小亮点,断言,with 语句,格式化字符串,听我道来