作为一门优秀的脚本语言,Python 在语法层面提供了很多好玩又实用的语法,俗称语法糖
,正确的使用这些技巧能让代码看起来更优雅,更 Pythonic,这里列举几个。
1
2
3
4
5
6
7
8
9
10
11
|
#!/usr/bin/env python3
def main():
animals = ['cat','dog','bird','pig']
if "dog" in animals:
print("dog 在列表里")
else:
print("dog 不在列表里")
if __name__ == '__main__':
main()
|
以上代码明显代码行数比较多,可以简化为如下写法
1
2
3
4
5
6
7
8
|
#!/usr/bin/env python3
def main():
animals = ['cat','dog','bird','pig']
print("dog 在列表里") if "dog" in animals else print("dog 不在列表里")
if __name__ == '__main__':
main()
|
先看一段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/usr/bin/env python3
def main():
flag = False
animals = ['cat','dog','bird','pig']
for o in animals:
if o == "dog":
flag = True
break
if flag == True:
print("dog 在列表里")
if __name__ == '__main__':
main()
|
代码很简单,需要使用 for 循环执行一段逻辑,如果命中某个条件,则使用一个变量 flag 做下标记,并且终止 for 循环,循环结束之后,判断 flag 是否等于 True 来执行另一段逻辑。这种场景,借助了一个额外的变量,比较啰嗦,在 Python 里有个更优雅的写法。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/usr/bin/env python3
def main():
animals = ['cat','dog','bird','pig']
for o in animals:
if o == "dog":
break
else:
print("dog 不在列表里")
if __name__ == '__main__':
main()
|
这段代码的意思就是,for 循环执行过程中,如果遇到了 break 语句,则退出 for 循环之后,就不再执行 else 部分的代码。
打开文件,遍历文件,然后再关闭文件句柄,我们一般会这么写
1
2
3
4
5
6
7
8
9
10
11
12
|
#!/usr/bin/env python3
def main():
f = open("a.txt")
try:
for line in f:
print(line)
finally:
f.close()
if __name__ '__main__':
main()
|
上述写法需要自己去调用 close 方法,保证句柄被正常释放。
使用 python 中的 with 方法,就不用显示的去调用 close 了,并且即使中间出现异常,也可以。
1
2
3
4
5
6
7
8
9
|
#!/usr/bin/env python3
def main():
with open("a.txt") as f:
for line in f:
print(line)
if __name__ '__main__':
main()
|
实际上 with 方法并不是帮你调用了 close 方法,而是调用了 with 返回对象的__exit__()
方法。
如果一个类实现了 close() 方法,就可以借助 with 和 contextlib.closing() 帮你自动调用 close 函数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#!/usr/bin/env python3
import contextlib
class Request(object):
def __init__(self):
pass
def do(self):
print("do something")
def close(self):
print("close")
def main():
with contextlib.closing(Request()) as r:
r.do()
if __name__ == '__main__':
main()
|