рдпрд╣ рдореЗрд░реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдЪреИрдирд▓ @pythonetc рд╕реЗ рдкрд╛рдпрдерди рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рдЪрдпрди рд╣реИред
Ations
рдкрд┐рдЫрд▓рд╛ рдкреНрд░рдХрд╛рд╢рдирдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рде рдХрдИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк
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}')
рдЖрдЙрдЯрдкреБрдЯ:
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
рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
g.close()
рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдорддреМрд░ рдкрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░
close
рдмрд╛рдж, рдЬреЗрдирд░реЗрдЯрд░рдПрдХреНрд╕рд┐рдЯ рдХреЛ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЬрдирд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд░реЛрдХрд╛ рдЧрдпрд╛ рдерд╛:
def gen(): try: yield 1 yield 2 finally: print('END') g = gen() print(next(g))
рддреАрди рдЪреАрдЬреЛрдВ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦреЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк
GeneratorExit
рдХреЛ рд╕рдВрднрд╛рд▓рддреЗ рд╕рдордп рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
def gen(): try: yield 1 finally: yield 3 g = gen() next(g) g.close()
рджреВрд╕рд░рд╛, рдпрджрд┐ рдХреЛрдИ рдЬрдирд░реЗрдЯрд░ рдЕрднреА рддрдХ рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ, рддреЛ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рдЙрдард╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдирд░реЗрдЯрд░ рдЕрднреА рднреА рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ:
def gen(): try: yield 1 finally: print('END') g = gen() g.close()
рддреАрд╕рд░рд╛, рдЕрдЧрд░ рдЬрдирд░реЗрдЯрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ:
def gen(): try: yield 1 yield 2 finally: print('END') g = gen() print(list(g)) print('Closing now') g.close()
рдПрдл-рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдЖрдкрдХреЛ рдореБрджреНрд░рд┐рдд рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдиреНрдп рдкреНрд░рд╛рд░реВрдк рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреМрдбрд╝рд╛рдИ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
>>> x = 42 >>> f'{x:5}+{x:15f}' ' 42+ 42.000000'
рд╡реЗ рдореВрд▓реНрдпрд╛рдВрдХрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ рднреА рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬрдм рдЪреМрдбрд╝рд╛рдИ рдЕрдЬреНрдЮрд╛рдд рд╣реЛ:
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)
рдЖрдЙрдЯрдкреБрдЯ:
Eleven. Return and Revert 2010 Wilderness 2013 The Menagerie Inside 2015 Evaporate 2018
рдпрджрд┐ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рджреВрд╕рд░реЗ рд╕реЗ рд▓реА рдЧрдИ рд╣реИ, рддреЛ рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдХреЗ рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХреЛ рднреА рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ:
from collections import UserDict from abc import ABCMeta
рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдореЗрдЯрд╛рдХреНрд▓рд╛рд╕ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
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__
рдЖрдкрдХреЛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдареАрдХ рдмрд╛рдж рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп
__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)