Kiat dan trik dari saluran Telegram saya @pythonetc, Juni 2019


Ini adalah pilihan baru tips dan trik tentang Python dan pemrograman dari saluran-Telegram saya @pythonetc.

← Publikasi sebelumnya


Simbol \ 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 

Source: https://habr.com/ru/post/id458688/


All Articles