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.