python 中的高级用法 1

Feb 05 2020

最近看到一段 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))

输出的结果是

1
2
2
2

这里创建 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 的一部分高级的用法,后续会再继续总结一些其他的高级用法