断言
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 = []
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:
pass
finally:
f.close()
使用了 with 语句之后,代码修改为:
with open('./橡皮擦.txt','w',encoding="utf-8") as f:
f.write("梦想橡皮擦")
与之对比的还有 threading 模块中的 Lock 对象。
lock = threading.Lock()
with lock:
自己实现上下文管理器 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,其余用新的
写在后面
以上内容就是本文的全部内容,希望对学习路上的你有所帮助~
今天是持续写作的第 234 / 365 天。 期待 关注,点赞、评论、收藏。
更多精彩
|