Ini adalah pilihan tips dan pemrograman Python kesebelas dari feed @pythonetc saya.
โ 
Koleksi sebelumnyaKarakter 
\ pada baris reguler memiliki arti khusus. 
\t adalah karakter tab, 
\r adalah break baris, dan sebagainya.
Untuk menonaktifkan perilaku ini, Anda dapat menggunakan string mentah. Kemudian 
r'\t' akan berubah menjadi hanya garis miring terbalik dan 
t .
Jelas, Anda tidak dapat menggunakan 
' inside 
r'...' . Dan meskipun pembatasan ini dapat dielakkan dengan 
\ , namun, garis 
\ akan tetap:
 >>> print(r'It\'s insane!') It\'s insane! 
Daftar generator dapat berisi lebih dari satu pasang 
for dan 
if ekspresi:
 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)] 
Selain itu, ekspresi apa pun di dalam 
for dan 
if dapat menggunakan semua variabel yang ditentukan sebelumnya:
 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) ] 
Anda dapat mencampur 
if dan sesuai keinginan:
 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) ] 
Fungsi yang 
sorted memungkinkan 
sorted menentukan metode penyortiran khusus. Ini dilakukan dengan menggunakan argumen 
key , yang menjelaskan cara mengonversi nilai asli untuk perbandingan nanti:
 >>> 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'}] 
Sayangnya, tidak semua perpustakaan yang bekerja dengan perbandingan mendukung argumen 
key . Dari mereka yang dikabarkan, 
heapq (dukungan parsial) dan 
bisect (tidak ada dukungan) dapat disebutkan.
Ada dua cara untuk dilakukan dalam situasi ini. Anda dapat menggunakan objek khusus yang mendukung perbandingan yang tepat:
 >>> 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'] 
Namun, Anda mungkin perlu membuat beberapa versi kelas seperti itu, karena objek dapat dibandingkan dengan cara yang berbeda. Ini bisa merepotkan, jadi ada cara kedua.
Alih-alih membuat objek khusus, Anda dapat menggunakan tupel 
(a, b) , di mana 
a adalah nilai untuk membandingkan (prioritas), dan 
b adalah nilai asli:
 >>> 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'] 
Perbedaan antara definisi dan fungsi generator adalah adanya kata kunci 
yield di badan fungsi:
 In : def f(): ...: pass ...: In : def g(): ...: yield ...: In : type(f()) Out: NoneType In : type(g()) Out: generator 
Ini berarti bahwa untuk membuat generator kosong Anda perlu melakukan ini:
 In : def g(): ...: if False: ...: yield ...: In : list(g()) Out: [] 
Tetapi karena 
yield from dukungan iterators sederhana, yaitu versi yang lebih bagus:
 def g(): yield from [] 
Dengan Python, Anda dapat membuat rantai operator perbandingan:
 >>> 0 < 1 < 2 True >>> 0 < 1 < 0 False 
Rantai seperti itu tidak harus benar secara matematis, Anda dapat mencampur 
> dan 
< :
 >>> 0 < 1 > 2 False >>> 0 < 1 < 2 > 1 > 0 True 
== operator juga didukung. 
is dan 
in :
 >>> [] is not 3 in [1, 2, 3] True 
Setiap operator berlaku untuk dua operan yang berdekatan. 
a OP1 b OP2 c benar 
a OP1 b OP2 c benar setara dengan 
(a OP1 b) AND (b OP2 c) . Perbandingan 
a dan 
c tidak dilakukan:
 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) 
Hasil:
 1 < 2 2 <= 3 3 == 3 True