рдореЗрд░реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдЪреИрдирд▓ @pythonetc рд╕реЗ рдЯрд┐рдкреНрд╕ рдПрдВрдб рдЯреНрд░рд┐рдХреНрд╕, рдорд╛рд░реНрдЪ 2019

рдЫрд╡рд┐

рдпрд╣ рдореЗрд░реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо-рдЪреИрдирд▓ @pythonetc рд╕реЗ рдкрд╛рдпрдерди рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдЭрд╛рд╡реЛрдВ рдФрд░ рдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдПрдХ рдирдпрд╛ рдЪрдпрди рд╣реИред

рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рди ред

0_0


0_0 рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реИрдз рдкрд╛рдпрдерди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред

рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рд╕реВрдЪреА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛


None рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реВрдЪреА рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рдЪреБрдиреМрддреАрдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

 In [1]: data = [ ...: dict(a=1), ...: None, ...: dict(a=-3), ...: dict(a=2), ...: None, ...: ] In [2]: sorted(data, key=lambda x: x['a']) ... TypeError: 'NoneType' object is not subscriptable 

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реВрдЪреА рдХреЗ рдЕрдВрдд рдпрд╛ рд╕реВрдЪреА рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:

 In [3]: sorted( ...: (d for d in data if d is not None), ...: key=lambda x: x['a'] ...: ) + [ ...: d for d in data if d is None ...: ] Out[3]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None] 

рд╡рд╣ рдПрдХ рдХреМрд░ рд╣реИред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ key рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рд╣реИ:

 In [4]: sorted(data, key=lambda x: float('inf') if x is None else x['a']) Out[4]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None] 

рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдХреЛрдИ рдЕрдирдиреНрддрддрд╛ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЯреБрдкрд▓реНрд╕ рдХреЛ рд╕реЙрд░реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 In [5]: sorted(data, key=lambda x: (1, None) if x is None else (0, x['a'])) Out[5]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None] 

рдХреЙрд▓рд┐рдВрдЧ random.seed ()


рдЬрдм рдЖрдк рдЕрдкрдиреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд╛рдВрдЯрд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЬрд┐рд╕ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмреАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдирдХрд▓ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЙрд╕реА "рдпрд╛рджреГрдЪреНрдЫрд┐рдХ" рдкрд░рд┐рдгрд╛рдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ random.seed() рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓ random.seed() ред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдпрджрд┐ рдЖрдк multiprocessing рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдмрд┐рд▓рдХреБрд▓ рд╕рд╣реА рд╣реИред

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 import multiprocessing import random import os import sys def test(a): print(random.choice(a), end=' ') a = [1, 2, 3, 4, 5] for _ in range(5): test(a) print() for _ in range(5): p = multiprocessing.Process( target=test, args=(a,) ) p.start() p.join() print() for _ in range(5): pid = os.fork() if pid == 0: test(a) sys.exit() else: os.wait() print() 

рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 4 4 4 5 5 1 4 1 3 3 2 2 2 2 2 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдк Python 3.7 рдпрд╛ рдирдП рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ at_fork рдирдП at_fork рд╣реБрдХ рдХреЗ рд▓рд┐рдП рднреА рдзрдиреНрдпрд╡рд╛рдж рджреЗрддрд╛ рд╣реИред

рдкрд╛рдпрдерди 3.7 рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ:

 1 2 2 1 5 4 4 4 5 5 2 4 1 3 1 

0 рдореЗрдВ рдЬреЛрдбрд╝рдирд╛


рдпрд╣ sum([a, b, c]) рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ a + b + c рдмрд░рд╛рдмрд░ рд╣реИ, рдЬрдмрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ 0 + a + b + c ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ 0 рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ:

 class MyInt: def __init__(self, value): self.value = value def __add__(self, other): return type(self)(self.value + other.value) def __radd__(self, other): return self + other def __repr__(self): class_name = type(self).__name__ return f'{class_name}({self.value})' In : sum([MyInt(1), MyInt(2)]) ... AttributeError: 'int' object has no attribute 'value' 

рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдк рдХрд╕реНрдЯрдо рд╕реНрдЯрд╛рд░реНрдЯ рддрддреНрд╡ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ 0 рдмрдЬрд╛рдп рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 In : sum([MyInt(1), MyInt(2)], MyInt(0)) Out: MyInt(3) 

sum float рдФрд░ int рдкреНрд░рдХрд╛рд░ рдХреЗ рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╕реНрдЯрдо рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ bytes рдХреЛ bytes рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП bytearray рдФрд░ bytearray рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 In : sum(['a', 'b'], '') ... TypeError: sum() can't sum strings [use ''.join(seq) instead] In : ints = [x for x in range(10_000)] In : my_ints = [Int(x) for x in ints] In : %timeit sum(ints) 68.3 ┬╡s ┬▒ 142 ns per loop (mean ┬▒ std. dev. of 7 runs, 10000 loops each) In : %timeit sum(my_ints, Int(0)) 5.81 ms ┬▒ 20.5 ┬╡s per loop (mean ┬▒ std. dev. of 7 runs, 100 loops each) 



рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рд╕реВрдЪрдХрд╛рдВрдХ рдкреВрд░реНрдгрддрд╛


рдЖрдк рдЬрд┐рдкреНрдерд░ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдкреВрд░реНрдгрддрд╛ рдХреЛ _ipython_key_completions_ method рдкреНрд░рджрд╛рди рдХрд░рдХреЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЖрдк рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдЖрдк d["x рдЬреИрд╕реА рдЪреАрдЬрд╝ рдХреЗ рдмрд╛рдж рдЯреИрдм рджрдмрд╛рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ:



рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд┐рдзрд┐ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред

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


All Articles