@Pythonetc kompilasi, Oktober 2019


Pilihan baru tips dan pemrograman Python dari umpan @pythonetc saya.

Koleksi sebelumnya


Jika Anda ingin mengulangi beberapa objek yang dapat diulang sekaligus, Anda dapat menggunakan fungsi zip (tidak ada hubungannya dengan format file ZIP):

 from datetime import timedelta names = [ 'Eleven. Return and Revert', 'Wilderness', 'The Menagerie Inside', 'Evaporate', ] years = [ 2010, 2013, 2015, 2018, ] durations = [ timedelta(minutes=57, seconds=38), timedelta(minutes=48, seconds=5), timedelta(minutes=46, seconds=34), timedelta(minutes=43, seconds=25), ] print('Midas Fall LPs:') for name, year, duration in zip( names, years, durations ): print(f' * {name} ({year}) — {duration}') 

Hasil:

 Midas Fall LPs: * Eleven. Return and Revert (2010) — 0:57:38 * Wilderness (2013) — 0:48:05 * The Menagerie Inside (2015) — 0:46:34 * Evaporate (2018) — 0:43:25 


Anda dapat menghentikan generator dengan memanggil g.close() secara eksplisit, tetapi lebih sering daripada tidak, pemulung melakukan ini untuk Anda. Setelah memanggil close , pada titik di mana fungsi pembangkit dijeda, GeneratorExit dimulai:

 def gen(): try: yield 1 yield 2 finally: print('END') g = gen() print(next(g)) # prints '1' g.close() # prints 'END' 

Jangan lupakan tiga aspek. Pertama, Anda tidak dapat terus menghasilkan nilai saat memproses GeneratorExit :

 def gen(): try: yield 1 finally: yield 3 g = gen() next(g) g.close() # RuntimeError 

Kedua, jika generator belum berjalan, maka pengecualian tidak akan dibuang, tetapi generator masih akan masuk ke status "berhenti":

 def gen(): try: yield 1 finally: print('END') g = gen() g.close() # nothing print(list(g)) # prints '[]' 

Ketiga, close tidak melakukan apa-apa jika generator sudah selesai bekerja:

 def gen(): try: yield 1 yield 2 finally: print('END') g = gen() print(list(g)) print('Closing now') g.close() # END # [1, 2] # Closing now 


f-lines memungkinkan Anda untuk menentukan lebar nilai yang ditampilkan, serta penentu format lainnya:

 >>> x = 42 >>> f'{x:5}+{x:15f}' ' 42+ 42.000000' 

Mereka juga dapat berisi ekspresi yang dihitung, yang berguna ketika lebarnya tidak diketahui sebelumnya:

 def print_table(matrix): cols_width = [ max(len(str(row[col])) for row in matrix) for col in range(len(matrix[0])) ] for row in matrix: for i, cell in enumerate(row): print( f'{cell:{cols_width[i]}} ', end='' ) print() albums = [ ['Eleven. Return and Revert', 2010], ['Wilderness', 2013], ['The Menagerie Inside', 2015], ['Evaporate', 2018], ] print_table(albums) 

Hasil:

 Eleven. Return and Revert 2010 Wilderness 2013 The Menagerie Inside 2015 Evaporate 2018 


Jika kelas Anda berasal dari yang lain, maka metaclass dari kelas Anda juga harus berasal dari metaclass dari kelas itu:

 from collections import UserDict from abc import ABCMeta # ABCMeta is a metaclass of UserDict class MyDictMeta(ABCMeta): def __new__(cls, name, bases, dct): return super().__new__(cls, name, bases, dct) class MyDict(UserDict, metaclass=MyDictMeta): pass 

Mungkin disarankan untuk secara otomatis mendapatkan metaclass dari kelas lain ini:

 def create_my_dict_class(parents): class MyDictMeta(*[type(c) for c in parents]): def __new__(cls, name, bases, dct): return super().__new__(cls, name, bases, dct) class MyDict(*parents, metaclass=MyDictMeta): pass MyDict = create_my_dict_class((UserDict,)) 


__init__ memungkinkan Anda untuk memodifikasi objek segera setelah dibuat. Jika Anda ingin mengontrol apa yang telah dibuat, maka gunakan __new__ :

 from typing import Tuple, Dict from cached_property import cached_property class Numbers: _LOADED: Dict[Tuple[int, ...], 'Numbers'] = {} def __new__(cls, ints: Tuple[int, ...]): if ints not in cls._LOADED: obj = super().__new__(cls) cls._LOADED[ints] = obj return cls._LOADED[ints] def __init__(self, ints: Tuple[int, ...]): self._ints = ints @cached_property def biggest(self): print('calculating...') return max(self._ints) print(Numbers((4, 3, 5)).biggest) print(Numbers((4, 3, 5)).biggest) print(Numbers((4, 3, 6)).biggest) 

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


All Articles