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


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

Publikasi sebelumnya


Jika Anda ingin mengulangi beberapa iterables 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}') 

Keluaran:

 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 


Generator bisa dihentikan. Anda dapat secara eksplisit memanggil g.close() tetapi biasanya pemulung melakukan itu untuk Anda. Begitu close dipanggil, GeneratorExit dinaikkan pada titik di mana fungsi generator dijeda:

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

Pikirkan tiga hal. Pertama, Anda tidak dapat menghasilkan nilai saat menangani GeneratorExit :

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

Kedua, pengecualian tidak dinaikkan jika generator belum dimulai, tetapi generator masih 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:

 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-strings memungkinkan Anda menentukan lebar untuk nilai yang dicetak serta penentu format lainnya:

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

Mereka juga dapat berisi ekspresi yang dievaluasi yang dapat berguna ketika lebar tidak diketahui di muka:

 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) 

Keluaran:

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


Jika kelas Anda berasal dari yang lain, 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 ide yang bagus untuk mendapatkan metaclass dari kelas lain itu secara otomatis:

 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 tepat setelah pembuatan. Jika Anda ingin mengontrol apa yang dibuat, Anda harus menggunakan __new__ sebagai gantinya:

 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/id475686/


All Articles