最近看到一段 python 代码
1 2 3 4
| f = [lambda x: x[i] for i in range(2)] x = [1, 2] print(f[0](x)) print(f[1](x))
|
输出的结果是
这里创建 f 的过程是一个 python 比较高级的写法。在 python 里,高级写法不仅能够让代码简洁,也能让执行效率更高,现在总结一下 python 中常见的一些高级写法
列表推导式
创建列表的时候,使用推导式更简洁,也更高效,而传统的 for 循环加 append 方式执行效率也不高
1 2 3 4 5 6 7 8 9 10
| # 传统方式 array = ['a', 'b', 'c']
_item = [] for i in array: if i == 'a': _item.append(i)
# 列表推导式 _item2 = [item for item in array if item == 'a']
|
有的场景还需要使用索引,配合 enumerate 函数的列表推导式可以摆脱 for 的依赖
1 2 3 4
| _item_index = [index for index, value in enumerate(array)]
# 输出 [0,1,2]
|
lamda 表达式
python 中使用 def 来定义函数,并提供 lamda 表达式来定义匿名函数,当函数体比较简单的时候推荐使用
比如定义一个 lamda 函数来返回文件路径
传统写法
1 2 3 4
| def get_path(p): return os.path.join(os.getcwd(), p) _path = get_path('test')
|
lamda 写法
1 2 3
| PATH = lambda p: os.path.join(os.getcwd(), p)
_path = PATH('test')
|
lamda 表达式用在 map() 中,使得代码更简洁
1 2 3
| # 将字符串列表转换为整型列表 str_array = ['1', '2', '3'] int_array = list(map(lambda ele: int(ele), str_array))
|
装饰器
装饰器用来修饰一个函数,但不会破坏该函数本身逻辑,一般用来给函数添加一些必要的 log 或者耗时统计
添加 log 提示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| def decorator(func): def __wrapper__(): print('%s start' % func.__name__) func() print('%s end' % func.__name__)
return __wrapper__
def f(): print('fff')
decor_func = decorator(f) # 执行 func decor_func()
# 输出 f start fff f end
|
这样就不必在所有的函数中添加执行和结束提示了,但这样在使用上就比较繁琐,简化一下装饰器,通过 @ 符号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| from functools import wraps
def decorator(func): @wraps(func) def __wrapper__(): print('%s start' % func.__name__) func() print('%s end' % func.__name__)
return __wrapper__
# 在需要调用的函数上使用装饰器符号 @decorator def f(): print('fff')
# 调用时不必再调用装饰器函数 f()
|
注意到使用了 @wraps 来装饰,这是避免 f.__name__ 返回的是 __wrapper__
今天介绍了 python 的一部分高级的用法,后续会再继续总结一些其他的高级用法