@Pythonetc kompilasi Maret 2019


Ini adalah kumpulan kesepuluh tips Python dan pemrograman dari umpan @pythonetc saya.

Pilihan sebelumnya .

0_0


0_0 adalah ekspresi yang sepenuhnya benar dalam Python.

Urutkan daftar dengan Tidak Ada


Menyortir daftar dengan nilai None bisa menjadi tugas yang menakutkan:

 In [1]: data = [  ...: dict(a=1),  ...: None,  ...: dict(a=-3),  ...: dict(a=2),  ...: None,  ...: ] In [2]: sorted(data, key=lambda x: x['a']) ... TypeError: 'NoneType' object is not subscriptable 

Anda dapat mencoba untuk menghapus semua Tidak Ada dan mengembalikannya kembali setelah mengurutkan (ke awal atau ke akhir daftar, tergantung pada tugas):

 In [3]: sorted(  ...: (d for d in data if d is not None),  ...: key=lambda x: x['a']  ...: ) + [  ...: d for d in data if d is None  ...: ] Out[3]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None] 

Tapi itu tidak nyaman. Lebih baik gunakan key yang lebih kompleks:

 In [4]: sorted(data, key=lambda x: float('inf') if x is None else x['a']) Out[4]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None] 

Jika kita berbicara tentang jenis yang infinitynya tidak dapat diterima, Anda dapat mengurutkan tupel:

 In [5]: sorted(data, key=lambda x: (1, None) if x is None else (0, x['a'])) Out[5]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None] 

Panggil random.seed ()


Saat Anda memotong proses, seed acak yang Anda gunakan akan disalin ke semua proses yang dihasilkan. Akibatnya, hasil "acak" yang sama dapat dihasilkan di dalamnya.

Untuk menghindari hal ini, Anda perlu memanggil random.seed() secara manual dalam setiap proses. Tetapi jika Anda menggunakan modul multiprocessing , maka itu akan melakukannya untuk Anda.

Sebagai contoh:

 import multiprocessing        import random                 import os                     import sys                    def test(a):                  print(random.choice(a), end=' ') a = [1, 2, 3, 4, 5]           for _ in range(5):            test(a)                   print()                       for _ in range(5):            p = multiprocessing.Process(   target=test, args=(a,) )                         p.start()                 p.join()                  print()                       for _ in range(5):            pid = os.fork()           if pid == 0:              test(a)               sys.exit()            else:                     os.wait()             print() 

Dapatkan sesuatu seperti ini:

 4 4 4 5 5 1 4 1 3 3 2 2 2 2 2 

Selain itu, jika Anda menggunakan Python 3.7 dan lebih tinggi, maka berkat at_fork at_fork Anda dapat melakukan hal yang sama dengan os.fork .

Kode Python 3.7 di atas memberikan hasil ini:

 1 2 2 1 5 4 4 4 5 5 2 4 1 3 1 

Tambahan ke 0


Pada pandangan pertama, tampaknya sum([a, b, c]) setara dengan a + b + c , meskipun sebenarnya padanannya adalah 0 + a + b + c . Jadi ungkapan ini tidak dapat berfungsi dengan tipe yang tidak mendukung penambahan ke 0 :

 class MyInt: def __init__(self, value): self.value = value def __add__(self, other): return type(self)(self.value + other.value) def __radd__(self, other): return self + other def __repr__(self): class_name = type(self).__name__ return f'{class_name}({self.value})' In : sum([MyInt(1), MyInt(2)]) ... AttributeError: 'int' object has no attribute 'value' 

Untuk memperbaikinya, Anda bisa memberikan elemen awal khusus yang akan digunakan alih-alih 0 :

 In : sum([MyInt(1), MyInt(2)], MyInt(0)) Out: MyInt(3) 

sum dirancang untuk menambahkan tipe float dan int , meskipun dapat bekerja dengan tipe kustom lainnya. Namun, ia menolak untuk menambahkan bytes , bytearray dan str , karena join untuk tujuan ini:

 In : sum(['a', 'b'], '') ... TypeError: sum() can't sum strings [use ''.join(seq) instead] In : ints = [x for x in range(10_000)] In : my_ints = [Int(x) for x in ints] In : %timeit sum(ints) 68.3 ยตs ยฑ 142 ns per loop (mean ยฑ std. dev. of 7 runs, 10000 loops each) In : %timeit sum(my_ints, Int(0)) 5.81 ms ยฑ 20.5 ยตs per loop (mean ยฑ std. dev. of 7 runs, 100 loops each) 



Penyelesaian Indeks dalam Notebook Jupyter


Dengan menggunakan metode _ipython_key_completions_ , _ipython_key_completions_ dapat menyesuaikan penyelesaian indeks dalam Notebook Jupyter. Dengan cara ini Anda dapat mengontrol apa yang ditampilkan di layar jika Anda menekan Tab setelah sesuatu seperti d["x :



Perhatikan bahwa metode ini tidak menerima string yang akan dicari sebagai argumen.

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


All Articles