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

Posted 梦想橡皮擦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了那些值得称赞的 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:
    pass
finally:
    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,其余用新的

写在后面

以上内容就是本文的全部内容,希望对学习路上的你有所帮助~

今天是持续写作的第 234 / 365 天。
期待 关注点赞评论收藏

更多精彩

以上是关于那些值得称赞的 python 小亮点,断言,with 语句,格式化字符串,听我道来的主要内容,如果未能解决你的问题,请参考以下文章

2017年值得回首的那些事(文末有新春好礼相送)

Maven Clinic:母乳运输是亮点,这家获8800万美元融资的女性数字健康公司值得一看海外案例

小白自学Python时踩的那些坑,你值得拥有

HDC即将开始,有哪些亮点值得期待?

HDC即将开始,有哪些亮点值得期待?

HDC即将开始,有哪些亮点值得期待?