@Pythonetc рдирд╡рдВрдмрд░ 2018


рдпрд╣ рдореЗрд░реА @pythonetc рдлреАрдб рд╕реЗ рдкрд╛рдпрдерди рдЯрд┐рдкреНрд╕ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЫрдард╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИред

рдкрд┐рдЫрд▓реЗ рдЪрдпрди:



рдПрдЯрд┐рдкрд┐рдХрд▓ рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕


рдлрд╝рдВрдХреНрд╢рди рдбреЗрдХреЛрд░реЗрдЯрд░реНрд╕ рдХреЛ рдХреЗрд╡рд▓ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

def call(*args, **kwargs): def decorator(func): return func(*args, **kwargs) return decorator @call(15) def sqr_15(x): return x * x assert sqr_15 == 225 

рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкреБрдирд░реНрднрд░рдг рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рд░рд▓ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

 from abc import ABCMeta, abstractmethod class BinaryOperation(metaclass=ABCMeta): def __init__(self, left, right): self._left = left self._right = right def __repr__(self): klass = type(self).__name__ left = self._left right = self._right return f'{klass}({left}, {right})' @abstractmethod def do(self): pass @classmethod def make(cls, do_function): return type( do_function.__name__, (BinaryOperation,), dict(do=do_function), ) class Addition(BinaryOperation): def do(self): return self._left + self._right @BinaryOperation.make def Subtraction(self): return self._left - self._right 


__length_hint__


PEP 424 рдЬрдирд░реЗрдЯрд░ рдФрд░ рдЕрдиреНрдп рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЕрдиреБрдорд╛рдирд┐рдд рд▓рдВрдмрд╛рдИ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреВрд░реНрд╡ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрдирд░реЗрдЯрд░ рд╕рдВрднрд╡рддрдГ рд▓рдЧрднрдЧ 50 рддрддреНрд╡реЛрдВ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛:

 (x for x in range(100) if random() > 0.5) 

рдпрджрд┐ рдЖрдк рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдиреБрдорд╛рдирд┐рдд рд▓рдВрдмрд╛рдИ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ __length_hint__ рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдФрд░ рдпрджрд┐ рдЖрдкрдХреЛ рд╕рдЯреАрдХ рд▓рдВрдмрд╛рдИ рдкрддрд╛ рд╣реИ, рддреЛ __len__ рдЙрдкрдпреЛрдЧ __len__ ред рдпрджрд┐ рдЖрдк рдПрдХ рдЪрд▓рдиреЗ рдпреЛрдЧреНрдп рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрдм рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ operator.length_hint рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ operator.length_hint ред

рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде


рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: x in g ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкрд╛рдпрдерди g рдкрд░ x рддрдХ x рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ x рдпрд╛ рдЬрдм рддрдХ g рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

 >>> def g(): ... print(1) ... yield 1 ... print(2) ... yield 2 ... print(3) ... yield 3 ... >>> 2 in g() 1 2 True 

range() , рд╣рд╛рд▓рд╛рдВрдХрд┐, рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдореИрдЬрд┐рдХ рдУрд╡рд░рд░рд╛рдЗрдб рд╡рд┐рдзрд┐ __contains__ , рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬрдЯрд┐рд▓рддрд╛ O (1) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИ:

 In [1]: %timeit 10**20 in range(10**30) 375 ns ┬▒ 10.7 ns per loop 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдкрд╛рдпрдерди 2 рд╕реЗ xrange() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рд╕рдВрдЪрд╛рд▓рдХ + = рдФрд░ +


рдЕрдЬрдЧрд░ рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЪрд╛рд▓рдХ рд╣реИрдВ: += рдФрд░ + ред __iadd__ рдФрд░ __add__ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЙрдирдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдХреНрд░рдорд╢рдГ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред

 class A: def __init__(self, x): self.x = x def __iadd__(self, another): self.x += another.x return self def __add__(self, another): return type(self)(self.x + another.x) 

рдпрджрд┐ __iadd__ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ a += b a = a + b рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

+= рдФрд░ + рдмреАрдЪ рд╢рдмреНрджрд╛рд░реНрде рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рд╡реНрдпрдХреНрддрд┐ рд╡рд╕реНрддреБ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рдирдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ:

 >>> a = [1, 2, 3] >>> b = a >>> a += [4] >>> a [1, 2, 3, 4] >>> b [1, 2, 3, 4] >>> a = a + [5] >>> a [1, 2, 3, 4, 5] >>> b [1, 2, 3, 4] 

рдПрдХ рд╡рд░реНрдЧ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп


рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 >>> class A: ... CALLBACK = lambda x: x ** x ... >>> A.CALLBACK <function A.<lambda> at 0x7f68b01ab6a8> >>> A().CALLBACK <bound method A.<lambda> of <__main__.A object at 0x7f68b01aea20>> >>> A().CALLBACK(4) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: <lambda>() takes 1 positional argument but 2 were given 

рдЖрдк рдПрдХ рддреБрдЪреНрдЫ рд╡рд┐рд╡рд░рдгрдХ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдзреЛрдЦрд╛ рдФрд░ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ:

 >>> class FunctionHolder: ... def __init__(self, f): ... self._f = f ... def __get__(self, obj, objtype): ... return self._f ... >>> class A: ... CALLBACK = FunctionHolder(lambda x: x ** x) ... >>> A().CALLBACK <function A.<lambda> at 0x7f68b01ab950> 

рдЖрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрдЬрд╛рдп рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХрддреЗ рд╣реИрдВред

 class A: @classmethod def _get_callback(cls): return lambda x: x ** x 

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


All Articles