这是新开发人员的常见误解。假设您创建一个列表“x”,然后向列表分配一个新变量:
x = [9,8,7] y = x
现在,尝试在列表中附加一个新值y,然后打印两个列表:
y.append(6) print(y) # 打印 [9,8,7,6] print(x) # 打印 [9,8,7,6]
你一定想知道为什么新值已附加到两个列表中!发生这种情况是因为在Python中分配列表时,除非没有说明,否则不会复制列表。相反,会创建这个列表的新引用,即;y 只是对列表的引用。
这意味着两个变量中的操作将反映在同一个列表中。要复制列表,您需要使用以下.copy()方法:
x = [9,8,7] y = x.copy() y.append(6) print(y) # 打印 [9,8,7,6] print(x) # 打印 [9,8,7]
上下文管理器是 python 中的一个很棒的工具,有助于资源管理。它们允许您在需要时分配和释放资源。上下文管理器确保资源的所有方面都得到正确的处理。上下文管理器最常用和最常用深受认可的示例是with语句。with主要用于打开和关闭文件。
file = open(‘data.txt’,’w’)try: file.write(“Follow Me”)except: file.close()
在上下文管理器的帮助下,您可以完成以写入模式打开文件的任务,并且如果只出现一行问题,还可以关闭该文件。使用的主要优点是它确保我们的文件最终会被关闭with。
with open ('data.txt','w') as f: f.write(“我来”)
请注意,我们从未调用过该f.close()方法。上下文管理器会自动为我们处理它,并且即使引发异常,它也可以尝试这样做。可以使用上下文管理器的例子有很多即aiohttp.ClientSession可以),当然,您创建自己的上下文管理器。
生成器是一个返回可迭代对象的函数。它至少包含一个yield声明。yield是Python中的一个关键字,用于从函数返回值而不破坏其当前状态或对局部变量的引用。带参数的关键字函数yield称为生成器。生成器只在需要时生成一次项目。它们的内存效率非常高,并且占用的内存空间也很少。
示例(使用生成器的斐波那契数列)
def fib(limit): a,b = 0,1 while a < limit: yield a a, b = b, a + bfor x in fib(10): print (x)
yield 和 return 之间的区别在于 return 终止函数,但yield 只是暂停函数的执行并每次返回对应的值。
类型提示使您能够编写干净且不言自明的代码。应用它的方式是“暗示”参数的类型和函数的返回值。例如,我们想要验证用户输入的文本始终是整数。为了实现这一点,我们编写得到了一个返回True或False基于我们的验证的函数:
def validate_func(input): ...
现在知道了这个函数但是的作用,通过查看定义就很容易理解了。,如果没有上面的描述,事情就不会那么容易了。参数的类型是什么input?它从何而来?它已经是一个整数了吗?如果不是怎么办?该函数是否返回任何内容,或者只是引发异常?这些问题可以通过将代码重构为以下内容来回答:
def validate_func(input: str) -> bool: ...
现在,即使是第一次阅读此函数的人也更容易解释该函数。
日志记录是完成捕获代码执行流程的过程。日志记录有助于轻松调试代码。它通常在文件中,以便我们以后可以检索它们。在Python中,我们有一个库logging可以帮助我们将日志写入文件。日志记录有五个级别: