这是我的Telegram频道@pythonetc中有关Python和编程的一些新技巧和窍门。
←
以前的出版物常规字符串中的
\
符号具有特殊含义。
\t
是制表符,
\r
是回车,依此类推。
您可以使用原始字符串禁用此行为。
r'\t'
只是反斜杠和
t
。
您显然不能使用
'
inside
r'...'
。 但是,它仍然可以通过
\
进行转义,但是
\
保留在字符串中:
>>> print(r'It\'s insane!') It\'s insane!
列表推导可能包含多个
for
和
if
子句:
In : [(x, y) for x in range(3) for y in range(3)] Out: [ (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2) ] In : [ (x, y) for x in range(3) for y in range(3) if x != 0 if y != 0 ] Out: [(1, 1), (1, 2), (2, 1), (2, 2)]
同样,
for
和
if
任何表达式都可以使用之前定义的所有变量:
In : [ (x, y) for x in range(3) for y in range(x + 2) if x != y ] Out: [ (0, 1), (1, 0), (1, 2), (2, 0), (2, 1), (2, 3) ]
您可以根据需要将
if
和s混合
if
:
In : [ (x, y) for x in range(5) if x % 2 for y in range(x + 2) if x != y ] Out: [ (1, 0), (1, 2), (3, 0), (3, 1), (3, 2), (3, 4) ]
sorted
功能允许您提供自定义方法进行排序。 这是通过
key
参数完成的,该参数描述了如何将原始值转换为实际比较的值:
>>> x = [dict(name='Vadim', age=29), dict(name='Alex', age=4)] >>> sorted(x, key=lambda v: v['age']) [{'age': 4, 'name': 'Alex'}, {'age': 29, 'name': 'Vadim'}]
las,并非所有可用于比较的库都支持类似此
key
参数的内容。 值得注意的例子是
heapq
(部分支持)和
bisect
(不支持)。
有两种方法可以处理这种情况。 第一种是使用支持正确比较的自定义对象:
>>> class User: ... def __init__(self, name, age): ... self.name = name ... self.age = age ... def __lt__(self, other): ... return self.age < other.age ... >>> x = [User('Vadim', 29), User('Alex', 4)] >>> [x.name for x in sorted(x)] ['Alex', 'Vadim']
但是,您可能必须创建此类的多个版本,因为比较对象的方法不止一种。 这可能很累,但可以通过第二种方法轻松解决。
您可以使用元组
(a, b)
代替创建自定义对象
(a, b)
其中
a
是要比较的值(又名prioirty),
b
是原始值:
>>> users = [dict(name='Vadim', age=29), dict(name='Alex', age=4)] >>> to_sort = [(u['age'], u) for u in users] >>> [x[1]['name'] for x in sorted(to_sort)] ['Alex', 'Vadim']
函数定义和生成器定义之间的区别在于,函数主体中存在
yield
关键字:
In : def f(): ...: pass ...: In : def g(): ...: yield ...: In : type(f()) Out: NoneType In : type(g()) Out: generator
这意味着要创建一个空的生成器,您必须执行以下操作:
In : def g(): ...: if False: ...: yield ...: In : list(g()) Out: []
但是,由于
yield from
支持简单的迭代器,因此外观更好的版本是:
def g(): yield from []
在Python中,您可以链接比较运算符:
>>> 0 < 1 < 2 True >>> 0 < 1 < 0 False
这样的链不必在数学上有效,您可以将
>
和
<
混合使用:
>>> 0 < 1 > 2 False >>> 0 < 1 < 2 > 1 > 0 True
还支持其他运算符,例如
==
,
is
和
in
:
>>> [] is not 3 in [1, 2, 3] True
每个运算符都应用于两个最接近的操作数。
a OP1 b OP2 c
严格等于
(a OP1 b) AND (b OP2 c)
。 没有暗示
a
和
c
之间
a
比较:
class Spy: def __init__(self, x): self.x = x def __eq__(self, other): print(f'{self.x} == {other.x}') return self.x == other.x def __ne__(self, other): print(f'{self.x} != {other.x}') return self.x != other.x def __lt__(self, other): print(f'{self.x} < {other.x}') return self.x < other.x def __le__(self, other): print(f'{self.x} <= {other.x}') return self.x <= other.x def __gt__(self, other): print(f'{self.x} > {other.x}') return self.x > other.x def __ge__(self, other): print(f'{self.x} >= {other.x}') return self.x >= other.x s1 = Spy(1) s2 = Spy(2) s3 = Spy(3) print(s1 is s1 < s2 <= s3 == s3)
输出:
1 < 2 2 <= 3 3 == 3 True