Python工程师要知道的Python使用技巧
一、 Python之禅
Python之禅(又名PEP20)是由Tim Peters编写的一小段文字,文中展示了设计和使用Python的指导原则。你可以在Python网站上找到这段文字,也可以在控制台或Jupyter otebook中通过一条语句来显示这段话。
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
二、链式赋值如果需要让多个变量引用同一个对象,则可以使用链式赋值:
>>> x = y = z = 2
>>> x, y, z
(2, 2, 2)
非常有逻辑且优雅,对吧?
三、链式比较多个比较语句也可以合成一个Python表达式,只需将多个比较运算符连起来即可。下面的表达式只有在所有比较都成立时返回True,否则返回False:
>>> x = 5
>>> 2 < x ≤ 8
True
>>> 6 < x ≤ 8
False
这个表达式相当于(2 < x)且 (x ≤ 8) 且 (x ≤ 8),但更为紧凑,而且只需执行一次x求值。
如下写法也是正确的:
>>> 2 < x > 4
True
甚至可以将多个比较连起来:
>>> x = 2
>>> y = 8
>>> 0 < x < 4 < y < 16
True
四、多重赋值你可以使用元组解包,在一条语句中给多个变量赋值:
>>> x, y, z = 2, 4, 8
>>> x
2
>>> y
4
>>> z
8
注意*一条语句中的2, 4, 8相当于一个元组(2, 4, 8)。
五、更*的多重赋值
Python的多重赋值远不止于普通赋值。赋值左右两侧的元素数量甚至可以不一样:
>>> x, *y, z = 2, 4, 8, 16
>>> x
2
>>> y
[4, 8]
>>> z
16
在这段代码中,x对应于*一个值2,因为2是首先出现的。z是较后一个,所以取较后一个值8。y以列表形式取中间的所有值,因为它带有星号(y*)。
六、交变量
利用多重赋值可以精确、优雅地交换任何两个变量,而且无需引入第三个变量:
>>> x, y = 2, 8
>>> x
2
>>> y
8
>>> x, y = y, x
>>> x
8
>>> y 2
七、合并字典
合并两个字典的方法之*就是将它们解包到一个新的字典中:
>>> x = {'u': 1}
>>> y = {'v': 2}
>>> z = {**x, **y, 'w': 4}
>>> z
{'u': 1, 'v': 2, 'w': 4}
八、连接字符串
如果需要连接多个字符串,每个字符串之间使用同一个字符或同一组字符来连接,则可以使用str.join()方法:
>>> x = ['u', 'v', 'w']
>>> y = '-*-'.join(x)
>>> y
'u-*-v-*-w'
九、*遍历
如果需要遍历一个序列,同时还需要每个元素和相应的索引,则可以使用enumerate:
>>> for i, item in enumerate(['u', 'v', 'w']):
... print('index:', i, 'element:', item)
...
index: 0 element: u
index: 1 element: v
index: 2 element: w
每次遍历你都会获得一个元组,其中包括索引值和对应的元素。
十、反向遍历
如果你需要反向遍历一个序列,则可以使用reversed:
>>> for item in reversed(['u', 'v', 'w']):
... print(item)
...
w
v
u
十一、元素结合
如果你需要将来自多个序列的元素结合起来,可以使用zip:
>>> x = [1, 2, 4]
>>> y = ('u', 'v', 'w')
>>> z = zip(x, y)
>>> z
>>> list(z)
[(1, 'u'), (2, 'v'), (4, 'w')]
你可以遍历返回的zip对象,或者将其变成一个列表或元祖。
十二、矩阵转置
虽然在处理矩阵时人们通常会使用numpy(或类似的库),但利用zip也可以实现矩阵转置:
>>> x = [(1, 2, 4), ('u', 'v', 'w')]
>>> y = zip(*x)
>>> z = list(y)
>>> z
[(1, 'u'), (2, 'v'), (4, 'w')]
十三、值
如果元素的顺序不重要,那么从列表中去除重复值的方法是将其转换成一个集合,以获得的值:
>>> x = [1, 2, 1, 4, 8]
>>> y = set(x)
>>> y
{8, 1, 2, 4}
>>> z = list(y)
>>> z
[8, 1, 2, 4]
十四、序列排序
默认情况下序列按照*一个元素的顺序排序:
>>> x = (1, 'v')
>>> y = (4, 'u')
>>> z = (2, 'w')
>>> sorted([x, y, z])
[(1, 'v'), (2, 'w'), (4, 'u')]
但是,如果你希望按照第二个元素(或其他元素)排序,则可以使用key参数和适当的lambda函数作为第二个参数:
>>> sorted([x, y, z], key=lambda item: item[1])
[(4, 'u'), (1, 'v'), (2, 'w')]
反向排序时也使用类似的方法:
>>> sorted([x, y, z], key=lambda item: item[1], reverse=True)
[(2, 'w'), (1, 'v'), (4, 'u')]
十五、字典排序
可以用类似方法,对字典的.items()方法返回的键值对进行排序:
>>> x = {'u': 4, 'w': 2, 'v': 1}
>>> sorted(x.items())
[('u', 4), ('v', 1), ('w', 2)]
它们按照键的顺序进行排序。如果你希望按照值排序,则应该指定相应的key参数。反向排序也类似。
>>> sorted(x.items(), key=lambda item: item[1])
[('v', 1), ('w', 2), ('u', 4)]
>>> sorted(x.items(), key=lambda item: item[1], reverse=True)
[('u', 4), ('w', 2), ('v', 1)]
十六、格式化raw字符串
PEP498和Python 3.6引入了“有格式字符串”的概念,或者称为“f字符串”。这种字符串内部可以嵌入表达式。字符串可以同时作为raw字符串和有格式字符串使用,只需使用前缀fr:
>>> fr'u \ n v w={2 + 8}'
'u \\ n v w=10'
十七、获取当前日期和时间
Python有一个内置的datetime模块,非常适合各种涉及到日期和时间的任务。方法之*.now()能够返回当前日期和时间:
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2019, 5, 20, 1, 12, 31, 230217)
十八、获取较大(或较小)元素的索引
Python没有提供直接获取较大(或较小)元素索引的函数。*,至少有两种方法可以优雅地实现这一点:
>>> x = [2, 1, 4, 16, 8]
>>> max((item, i) for i, item in enumerate(x))[1]
3
如果有两个或多个元素都是较大值,那么该方法返回较后一个的索引:
>>> y = [2, 1, 4, 8, 8]
>>> max((item, i) for i, item in enumerate(y))[1]
4
如果想获取*一个,则可以对上面的语句稍作改动:
>>> -max((item, -i) for i, item in enumerate(y))[1]
3
另一种方法可能更优雅:
>>> x = [2, 1, 4, 16, 8]
>>> max(range(len(x)), key=lambda i: x[i])
3
>>> y = [2, 1, 4, 8, 8]
>>> max(range(len(y)), key=lambda i: x[i])
3
如果想获得较小元素的索引,则只需用min替换上面的max。
十九、获取笛卡尔积
内置的itertools模块提供了许多非常实用的类。其中之*就是product函数,你可以通过这个函数来获得笛卡尔积:
>>> import itertools
>>> x, y, z = (2, 8), ['u', 'v', 'w'], {True, False}
>>> list(itertools.product(x, y, z))
[(2, 'u', False), (2, 'u', True), (2, 'v', False), (2, 'v', True),
(2, 'w', False), (2, 'w', True), (8, 'u', False), (8, 'u', True),
(8, 'v', False), (8, 'v', True), (8, 'w', False), (8, 'w', True)]
二十、矩阵乘法操作符
PEP465和Python 3.5引入了专用的矩阵乘法运算符@。你可以在自己的类中实现matmul、rmatmul和imatmul来支持这个操作符。使用该操作符进行向量或矩阵乘法非常优雅:
>>> import numpy as np
>>> x, y = np.array([1, 3, 5]), np.array([2, 4, 6])
>>> z = x @ y
>>> z
44
更多培训课程,学习资讯,课程优惠等学校信息,请进入 西安阎良区Web培训西安临潼区Python培训西安长安区Linux云计算培训 网站详细了解,免费咨询电话:400-998-6158