Python常被误用的语法

48 阅读2分钟

从书上看到了,然后就跑了一下,再记录一下,或许能记住。

使用enumerate而不是range

遍历List或其他可迭代对象时,如果需要索引,我们可能会使用range

nums = [1, 2, 3, 4, 5]
for i in range(len(nums)):
    print(i, nums[i])

上面的写法比较直接,但是不够简洁,推荐使用enumerate方法

nums = [1, 2, 3, 4, 5]
for i, j in enumerate(nums):
    print(i, j)

enumerate(nums)会每次返回一个元组,包含当前索引与数据。如果只需要遍历数据,而不需要索引,可以直接用for...in

nums = [1, 2, 3, 4, 5]
for i in nums:
    print(i)

使用with语句代替open()与close()

在操作文件的时候,我们使用open函数打开文件并得到一个文件对象,使用完成后再通过调用文件对象的close方法关闭文件,以方便其他程序的使用。

file = open('spam.txt', 'w')
file.write('Hello, World')
file.close()

如果在操作文件的过程中出现异常,close方法没有被调用到,那么该文件可能被损毁。

try:
    file = open('spam.txt', 'w')
    eggs = 42 / 0 # 抛异常
    file.write(str(eggs))
    file.close()
except Exception as e:
    print(e)

使用with语句可以不用显示调用close方法,如下

with open('spam.txt', 'w') as file:
    file.write('Hello, World')

使用is跟None做比较而不是用==

==是比较值,is是比较引用地址,两个对象可以有相同的值,但它们可能是两个不同的对象。

nums1 = [1, 2]
nums2 = [1, 2]
nums3 = nums1

print(nums1 == nums2)  # True
print(nums1 is nums2)  # False
print(nums1 is nums3)  # True

所以比较某个对象是否是None时,必须使用is,如果你使用了==,PEP8也会提示你

PEP 8: E711 comparison to None should be 'if cond is None:'

a = None
print(a == None)  # PEP8会提示
print(a is None)