Python 基础 | 语法糖和一些关键字

Python 中一共有33个关键字,本文介绍一些不常用的关键字. Python 中也使用了大量的语法糖, 掌握后写代码时可以更加便捷.

with关键字

with语句在Python中可以实现上下文管理协议。写法较try-catch-finally更加简洁。

1
2
with context [as var]
操作语句

with语句定义了一个上下文. 执行 with 语句时, 首先调用上下文对象 context 的 enter(), 其返回值赋值给 var; 离开 with 语句块时, 最后调用 context 的 exit(), 确保释放资源.

下面的例子是一个为文本添加行号并打印的程序:

1
2
3
4
5
6
7
8
import sys
filename = sys.argv[0] # 读取并输出的文件就是本程序
line_no = 0
with open(filename, 'r', encoding='utf8') as f:
for line in f:
line_no += 1
print(line_no, ":", line) # 打印行号和该行内容
f.close()

del

Python中的 del 关键字与 C++ 的 delete 并不一样.

由于 Python 中所有的变量都是引用, 所以 del 关键字只是删除了引用的变量名, 并没有删除数据真正占据的内存空间. 比如:

1
2
3
a = 1
b = a
del a

这时候, 1的内存空间并未被释放, b 仍然指向 1. 所以可以使用 print(b) 打印出来结果是1.

yield

yield 关键字用于产生一个迭代器.

定义一个迭代器函数iterfun, 需要将其中return替换为yield.

调用时的写法 for i in iterfun():

https://liam0205.me/2017/06/30/understanding-yield-in-python/

倒序索引

定义了一个数组 a. a[0]表示正序第一个元素, a[-1] 表示倒序第一个元素.

列表解析表达式

列表解析表达式用于遍历 for 循环结果

1
signal = [fun(x) for x in range(10)]

举例

1
2
3
4
5
6
7
8
9
>>> [i**2 for i in range(10)] # 平方值
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [i for i in range(10) if i%2==0] # 取偶数
[0, 2, 4, 6, 8]
>>> [(x,y,x*y) for x in range(1,4) for y in range(1,4) if x>=y] # 二重循环
[(1, 1, 1), (2, 1, 2), (2, 2, 4), (3, 1, 3), (3, 2, 6), (3, 3, 9)]
>>> features = {'name': 'shane', 'age': 23, 'sex': 'male', 'figure': 'medium'}
>>> {k:v for k,v in dict(features).items()} # list all items of a dictionary
{'age': 23, 'figure': 'medium', 'name': 'shane', 'sex': 'male'} # equal to features

函数参数类型检查

类似 C/C++/Java 在进行函数调用时都会有严格的函数参数类型检查. 在 Python 3.5 以后也加入了函数类型审查机制, 建议以后写函数时加上. 比如

1
2
3
4
5
6
7
def addint(num1: int, num2: int = 5):
print(num1+num2)


addint(2,1)
addint(1)
addint("Hello")

编译器会在最后一行报错.

对于有些类型, 不太好限定数据类型, 但是可以使用字符串进行注释表达意思

1
2
3
4
5
6
7
def test_fun(end: "in ['pad', 'cut', None]" = 'cut'):
print(end)


test_fun()
test_fun('pad')
test_fun(10)

这个函数提示我们参数应该为 ‘pad’, ‘cut’, 或者不填, 默认参数是’cut’. 但是如果参数不在这些范围之内, 函数也能运行, 并且在目前的版本里不会报错.

Python 科学计算 | 三维数组的转置运算 Numpy中einsum函数的一个bug

评论

You forgot to set the shortname for Disqus. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×