рдпрд╣ рдореЗрд░реА @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