Ini adalah pilihan baru tips dan trik tentang Python dan pemrograman dari saluran-Telegram saya @pythonetc.
â
Publikasi sebelumnyaSimbol
\
dalam string biasa memiliki arti khusus.
\t
adalah karakter tab,
\r
carriage return dan sebagainya.
Anda dapat menggunakan string mentah untuk menonaktifkan perilaku ini.
r'\t'
hanya backslash dan
t
.
Anda jelas tidak dapat menggunakan
'
inside
r'...'
. Namun, itu masih bisa diloloskan oleh
\
, tetapi
\
dipertahankan dalam string:
>>> print(r'It\'s insane!') It\'s insane!
Pemahaman daftar dapat berisi lebih dari satu
for
dan
if
klausa:
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)]
Juga, ekspresi apa pun di dalam
for
dan
if
dapat menggunakan semua variabel yang didefinisikan 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
s dan
for
Anda inginkan:
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 Anda menyediakan metode kustom untuk menyortir. Ini dilakukan dengan argumen
key
, yang menjelaskan cara mengonversi nilai asli ke nilai yang sebenarnya dibandingkan:
>>> 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 berfungsi dengan perbandingan mendukung sesuatu seperti argumen
key
ini. Contoh penting adalah
heapq
(dukungan parsial) dan
bisect
(tidak ada dukungan).
Ada dua cara untuk menghadapi situasi ini. Yang pertama adalah menggunakan objek kustom 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 harus membuat beberapa versi dari kelas tersebut karena ada lebih dari satu cara untuk membandingkan objek. Ini bisa melelahkan, tetapi bisa dengan mudah dipecahkan dengan cara kedua.
Alih-alih membuat objek khusus, Anda dapat menggunakan tupel
(a, b)
dengan nilai untuk membandingkan (alias prioirty) 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 fungsi dan definisi generator adalah keberadaan kata kunci
yield
di badan fungsi:
In : def f(): ...: pass ...: In : def g(): ...: yield ...: In : type(f()) Out: NoneType In : type(g()) Out: generator
Itu berarti bahwa untuk membuat generator kosong Anda harus melakukan sesuatu seperti ini:
In : def g(): ...: if False: ...: yield ...: In : list(g()) Out: []
Namun, karena
yield from
dukungan iterator sederhana maka versi yang terlihat lebih baik adalah ini:
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 valid secara matematis, Anda dapat mencampur
>
dan
<
:
>>> 0 < 1 > 2 False >>> 0 < 1 < 2 > 1 > 0 True
Operator lain seperti
==
,
is
dan
in
juga didukung:
>>> [] is not 3 in [1, 2, 3] True
Setiap operator diterapkan ke dua operan terdekat.
a OP1 b OP2 c
benar-benar sama dengan
(a OP1 b) AND (b OP2 c)
. Tidak ada perbandingan antara
a
dan
c
yang tersirat:
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)
Keluaran:
1 < 2 2 <= 3 3 == 3 True