
рдПрдХ рд╕рдВрдХреЗрдд рд╣реИ рдХрд┐ рд╡рд╕реНрддреБ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП - рдЕрдЧрд░ рдЗрд╕рдХреА рдХреЗрд╡рд▓ 2 рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЖрд░рдВрднреАрдХрд░рдг, __init__ред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕реЛрдЪреЗрдВ: "рдореБрдЭреЗ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред"
рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдПрдХ рд▓рд┐рдЦрд┐рдд рдХрдХреНрд╖рд╛ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рддреБрд░рдВрдд рдЗрд╕реЗ рдлреЗрдВрдХ рджреЗрдВ, рдЖрдкрдХреЛ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП: "рдУрд╣, рдореБрдЭреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рднрд░рдирд╛ рдЪрд╛рд╣рд┐рдП! рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╣реБрдд рдЖрд╕рд╛рди! "
рдЬреИрдХ рдбрд┐рдбреНрд░рд┐рдХ рдХреА рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдЕрдиреБрд╡рд╛рдж, рдкрд╛рдпрдерди рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рдореБрдЦ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХред рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ 9 рдорд╛рд░реНрдЪ, 2012 рдХреЛ PyCon US рд╕рдореНрдореЗрд▓рди рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ редрдЖрдк рд╕рднреА рдиреЗ
рдЬрд╝реЗрди рдкрд╛рдпрдерди рдХреЛ рдкрдврд╝рд╛ рд╣реЛрдЧрд╛, рд╢рд╛рдпрдж рдХрдИ рдмрд╛рд░ред рдпрд╣рд╛рдБ рд╕реЗ рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реИрдВ:
- рд╕рд░рд▓ рдЬрдЯрд┐рд▓ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ
- рдлреНрд▓реИрдЯ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИ
- рдкрдардиреАрдпрддрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ
- рдпрджрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдордЭрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рддреЛ рдпрд╣ рдмреБрд░рд╛ рд╣реИ
- рдпрджрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рддреЛ рдпрд╣ рд╢рд╛рдпрдж рдЕрдЪреНрдЫрд╛ рд╣реИ
рдпрд╣ рдкрд╛рда рдЯрд┐рдо рдкреАрдЯрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╣ рдЖрдкрд╕реЗ рдФрд░ рдореБрдЭрд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╣реЛрд╢рд┐рдпрд╛рд░ рд╣реИред рдЖрдк рдХрд┐рддрдиреЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рдж рдЫрдБрдЯрд╛рдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ? рдпрд╣рд╛рдВ рдРрд╕реЗ рд╣реА рдПрдХ рдЖрджрдореА рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЗрди рдкрд╛рдпрдердиред рдФрд░ рд╕рднреА рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ: тАЬрдореБрд╢реНрдХрд┐рд▓ рдордд рдХрд░реЛред рдмрд╕ рдХрд░реЛред тАЭрдЗрд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдЗрд╕рд▓рд┐рдП, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рди рдмрдирд╛рдПрдВ, рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдЖрд╕рд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдХреНрд╖рд╛рдПрдВ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИрдВ рдпрд╛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдЗрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ, рд╣рдо рдереЛрдбрд╝рд╛ рдХреЛрдб рдкрдврд╝реЗрдВрдЧреЗ рдФрд░ рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдиреЛрдЯрд┐рд╕ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рдкрд╕ рдХреИрд╕реЗ рдЖрдПрдВред
рдЕрдкрдиреЗ рдХрд╛рдо рдкрд░, рдореИрдВ рдЕрдкрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ: "рдореБрдЭреЗ рдХреЛрдб рд╕реЗ рдирдлрд░рдд рд╣реИ, рдФрд░ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЫреЛрдЯрд╛ рд╣реЛред" рд╣рдо рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмреЗрдЪрддреЗ рд╣реИрдВ, рдХреЛрдб рдирд╣реАрдВред рд╣рдорд╛рд░реЗ рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдХреЗ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡реНрдпрд╛рдкрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реИрдВред рд╣рд░ рдмрд╛рд░ рдХреЛрдб рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╣рдо рдореЗрдВ рд╕реЗ рдЪрд╛рд░ рд╣реИрдВ, рдФрд░ рдкрд┐рдЫрд▓реЗ рд╡рд░реНрд╖ рдореЗрдВ рд╣рдордиреЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдирдирд╛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╣рдо рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВред
рдХрдХреНрд╖рд╛рдПрдВ
рдЗрд╕ рд░рд┐рдкреЛрд░реНрдЯ рд╕реЗ, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╡рд░реНрдЧ рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИред
class Greeting(object): def __init__(self, word='Hello'): self.word = word def greet(self, name): return '%s, %s!' % (self.word, name) >>> greeting = Greeting('Hola') >>> greeting.greet('Jorge') Hola, Jorge!
рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдирд╛рдо рдПрдХ рд╕рдВрдЬреНрдЮрд╛ рд╣реИ, "рдЕрднрд┐рд╡рд╛рджрдиред" рдпрд╣ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ __in__ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╣рд╛рдБ, рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрдврд╝рддреА рд╣реИ рдФрд░ рдХреБрдЫ рдФрд░ рдХрд░рддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВред рдиреАрдЪреЗ рдпрд╣ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрднрд┐рд╡рд╛рджрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕ рдЕрднрд┐рд╡рд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред
рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдПрдХ рд╕рдВрдХреЗрдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдХреЗрд╡рд▓ 2 рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЖрд░рдВрднреАрдХрд░рдг, __init__ред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕реЛрдЪреЗрдВ: "рдореБрдЭреЗ рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред"
рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдПрдХ рд▓рд┐рдЦрд┐рдд рдХрдХреНрд╖рд╛ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рддреБрд░рдВрдд рдЗрд╕реЗ рдлреЗрдВрдХ рджреЗрдВ, рдЖрдкрдХреЛ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП: "рдУрд╣, рдореБрдЭреЗ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рднрд░рдирд╛ рдЪрд╛рд╣рд┐рдП! рдЖрдк рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╣реБрдд рдЖрд╕рд╛рди! "
def greet(name): ob = Greeting('') print ob.greet(name) return
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреЛрдб рдХреА 4 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреЗрд╡рд▓ 2 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
def greet(greeting, name): return '%s, %s!' % (greeting, name) import functools greet = functools.partial(greet, '') greet('')
рдпрджрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рд╕рдорд╛рди рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдЙрдкрдХрд░рдг рд╣реЛрддрд╛ рд╣реИ! functools.partialред рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ: рдПрдХ рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХрдИ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рдХреЗ рдкрд╛рд╕ рдЖрдИрдЯреА рдореЗрдВ рдбрд┐рдЧреНрд░реА рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИред рдореИрдВрдиреЗ рдЬреИрд╕реЗ рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╕рд┐рдЦрд╛рдП
- рд╢рдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдкреГрдердХреНрдХрд░рдг
- рдХреЛрдб рд╕реБрд╕рдВрдЧрддрддрд╛ рдореЗрдВ рдХрдореА
- рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди
- рдмрд┐рдХреНрд░реА рдХрд╛ рдЕрд▓рдЧрд╛рд╡
рдЬрдм рд╕реЗ рдореИрдВрдиреЗ рд╕реНрдирд╛рддрдХ рдХреА рдЙрдкрд╛рдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА рд╣реИ, рдореИрдВрдиреЗ 15 рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдЗрди рд╢рд░реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдЗрди рд╢рдмреНрджреЛрдВ рдХреЛ рд╕реБрдирдХрд░, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдмреЗрд╡рдХреВрдл рдмрдирд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЗрди рд╢рд░реНрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдкреНрд░рддрд┐ рд╕реЗред рдпрджрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓реЛрдЧреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪреАрдЬреЛрдВ рд╕реЗ рдорддрд▓рдм рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдмрд╛рддрдЪреАрдд рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг: рдкреИрдВрдЯ рдмрд╛рд░реА ...
рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рд▓реЛрдЧ рдЕрдкрдиреЗ рджреИрдирд┐рдХ рдХрд╛рд░реНрдп рдореЗрдВ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧреБрдгрд╡рддреНрддрд╛ рд╣реИ, рдХреНрдпрд╛ рдЙрдирдХреЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╣реИрдВред рдЗрд╕реЗ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреАред рдХрднреА-рдХрднреА рдХреЛрдб рдкрдврд╝рдирд╛ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИред
рдПрдХ рддреГрддреАрдп-рдкрдХреНрд╖ рдПрдкреАрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЪрд▓реЛ рдЗрд╕реЗ рд╢реМрд░рдореЗрд▓ рдХрд╣рддреЗ рд╣реИрдВ, рдЗрд╕рдореЗрдВ 1 рдкреИрдХреЗрдЬ, 22 рдореЙрдбреНрдпреВрд▓, 20 рдХрдХреНрд╖рд╛рдПрдВ рдФрд░ рдХреЛрдб рдХреА 660 рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрддреНрдкрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдпрд╣ рд╕рдм рдкрдврд╝рдирд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдирдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдкреАрдЖрдИ рдереА, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓
рдХрд┐рдпрд╛ ред рдЬрд┐рддрдиреА рдмрд╛рд░ рдПрдкреАрдЖрдИ рдЕрдкрдбреЗрдЯ рдЖрдпрд╛, рдореБрдЭреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреЗрдЦрдирд╛ рдкрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдмрджрд▓рддреЗ рд╣реИрдВред рдЖрдкрдиреЗ рдкреИрдЪ рднреЗрдЬреЗ - рдХреНрдпрд╛ рд╡реЗ рдЕрдкрдбреЗрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП?
рдХреЛрдб рдХреА 660 рд▓рд╛рдЗрдиреЗрдВ, 20 рдХрдХреНрд╖рд╛рдПрдВ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рд╣реИрдВ рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдХреЗрд╡рд▓ рдИрдореЗрд▓ рдкрддреЗ, рдкрддреНрд░ рдХреЗ рдкрд╛рда рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдиреЗ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реЗ рдкрддреНрд░ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗ, рдФрд░ рдХреМрди рдмрд┐рдирд╛ рд╕рджрд╕реНрдпрддрд╛ рдХреЗред
рд╡рд░реНрдЧ рджреБрд░реНрд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реИ? рдЕрдХреНрд╕рд░ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреБрдЫ рдЪрд╛рд╣рд┐рдП рд╣реЛрдЧрд╛ред ... рдЬрд░реВрд░рдд рдирд╣реАрдВред рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦреЗрдВред ShaurMail рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ ShaurHash рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЛрдб рдХреА 2 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ:
class ShaurHash(dict): pass
рдХрд┐рд╕реА рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдРрдб-рдСрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рдереА, рд▓реЗрдХрд┐рди рдХреЛрдб рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рд▓рд╛рдЗрдиреЗрдВ рдереАрдВ:
my_hash = ShaurMail.ShaurHash.ShaurHash(id='cat') d = dict(id='cat') d = {'id': 'cat'}
рдХреЛрдб рдХреА рджреВрд╕рд░реА рдФрд░ рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ - рдХрд┐рд╕реА рдХреЛ рднреА рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди, рдпрд╣ рдордВрддреНрд░ "рд╢реМрд░рдореЗрд▓-рд╢реМрд░реНрдпрд╢-рд╢реМрд░реНрдпрд╢" рд╣рд░ рдЬрдЧрд╣ рджреЛрд╣рд░рд╛рдпрд╛ рдЧрдпрд╛ред рд╢рдмреНрдж "рд╢реМрд░" рдХреА рддреАрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЕрддрд┐рд░рд┐рдХреНрддрддрд╛ рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрдХреЗрдд рд╣реИред рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рд╕рднреА рдХреЛ рдХреЗрд╡рд▓ рдиреБрдХрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рддреАрди рдмрд╛рд░ "рд╢реМрд░" рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдХреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддреЗ рд╣реИрдВред (рдпрд╣ рдЕрд╕рд▓реА рдХрдВрдкрдиреА рдХрд╛ рдирд╛рдо рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИред)
рддрдм рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рдЖрджрдореА рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдФрд░ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдХрд╛рдо рдкрд░ рд░рдЦ рд▓рд┐рдпрд╛ рдЬреЛ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдкреАрдЖрдИ рдХрд╛ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:
class API: def __init__(self, key): self.header = dict(apikey=key) def call(self, method, params): request = urllib2.Request( self.url + method[0] + '/' + method[1], urllib.urlencode(params), self.header ) try: response = json.loads(urllib2.urlopen(request).read()) return response except urllib2.HTTPError as error: return dict(Error=str(error))
рдЙрд╕ рдПрдХ рдХреА 660 рд▓рд╛рдЗрдиреЗрдВ рдереАрдВ, рдЗрд╕ рдПрдХ рдХреА 15. рд╕рдм рдХреБрдЫ рдерд╛ рдЬреЛ рдпрд╣ рдХреЛрдб рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ, рдЖрд╕рд╛рдиреА рд╕реЗ, рд╕реЗрдХрдВрдб рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдк рддреБрд░рдВрдд рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╡реИрд╕реЗ, рдЗрд╕рдореЗрдВ 20 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рднреА рдерд╛ред рдпрд╣рд╛рдБ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред рдЬрдм рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдкреАрдЖрдИ рдХреЛ рдЕрджреНрдпрддрди рдХрд┐рдпрд╛, рддреЛ рдореИрдВ рд╕рдЪрдореБрдЪ рдХреБрдЫ рд╕реЗрдХрдВрдб рдореЗрдВ рдмрджрд▓рд╛рд╡ рдкрдврд╝ рд╕рдХрддрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрдк рд╕рдорд╕реНрдпрд╛ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдХреНрд╖рд╛ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ __init__ рд╣реИред рд▓реЗрдЦрдХреЛрдВ рдиреЗ рдЗрд╕реЗ рдЫрд┐рдкрд╛рдпрд╛ рдирд╣реАрдВред рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдХреЙрд▓ рд╣реИ, "рдХреЙрд▓ рдХрд░реЗрдВред" рдпрд╣рд╛рдБ рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ:
ShaurMail.API(key=' ').call(('mailing', 'statistics'), {'id': 1})
рд▓рд╛рдЗрди рд▓рдВрдмреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рдЙрдкрдирд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрдИ рдмрд╛рд░ рдХрд╣рддреЗ рд╣реИрдВ:
ShaurMail.request = ShaurMail.API(key=' ').call ShaurMail.request(('mailing', 'statistics'), {'id': 1})
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рдПрдХ рдлрдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЬрд╛рди рд▓реЗрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХрдХреНрд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдПрдкреАрдЖрдИ рдХрд╛ рддреАрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рднреЗрдЬрд╛:
ShaurMail_API = url = 'https://api.shaurmail.com/%s/%s' ShaurMail_API_KEY = ' ' def request(noun, verb, **params): headers = {'apikey': ShaurMail_API_KEY} request = urllib2.Request(ShaurMail_API % (noun, verb), urllib.urlencode(params), headers) return json.loads(urllib2.urlopen(request).read())
рдпрд╣ рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдлрд╛рдЗрд▓ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдЗрд╕реЗ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдбрд╛рд▓рд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ рдЬреЛ 15-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдиреЗ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ 660-рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдкреАрдЖрдИ рдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛ рдерд╛ред
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдордиреЗ рд╢реБрд░реБрдЖрдд рдХреА рдереА рдФрд░ рд╣рдо рдпрд╣рд╛рдВ рдЖрдП рдереЗ:
- 1 рдкреИрдХреЗрдЬ + 20 рдореЙрдбреНрдпреВрд▓ => 1 рдореЙрдбреНрдпреВрд▓
- 20 рдХрдХреНрд╖рд╛рдПрдВ => 1 рд╡рд░реНрдЧ => 0 рд╡рд░реНрдЧ
- 130 рд╡рд┐рдзрд┐рдпрд╛рдБ => 2 рд╡рд┐рдзрд┐рдпрд╛рдБ => 1 рдХрд╛рд░реНрдп
- 660 рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдХреЛрдб => 15 рд▓рд╛рдЗрдиреЗрдВ => 5 рд▓рд╛рдЗрдиреЗрдВ
рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди, рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рди, рдХрд┐рд╕реА рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИред
рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп
рдЬреЛ рдХреЛрдИ рднреА рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рд╕реЗ рдЖрдпрд╛ рд╣реИ рд╡рд╣ рд╕реЛрдЪ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд╡рд░реНрдЧреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рд╕рдЪ рдирд╣реАрдВ рд╣реИред рдорд┐рд▓рд╛рди рдирд╛рдореЛрдВ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреА рдЧрд╣рд░реА рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИ, рддреЛ рдпрд╣ рдХрд┐рд╕реА рдХреЛ рднреА рдХреБрдЫ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред ShaurMail.ShaurHash.ShaurHash рдХреЗрд╡рд▓ рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рдмреНрдж рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд▓реЛрдЧреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦрдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкрд╛рдпрдерди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ, рдирд╛рдо рд╕реНрдерд╛рди рдмрд╣реБрдд рдЙрдерд▓рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдпрд╛ рддреЛ рдпрд╛рдж рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЖрдкрдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рдЖрдкрдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреИрдХреЗрдЬ рджреЗрдЦрдирд╛ рд╣реИ, рддреЛ рдЙрд╕рдореЗрдВ рдХреМрди рд╕рд╛ рдкреИрдХреЗрдЬ рд╣реИ, рдХрд┐рд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдХреНрдпрд╛ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╢рд░реНрдо рдХреА рдмрд╛рдд рд╣реИ, рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдХреЛрдб рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдФрд░ рдПрдХ рд╣реА рдкрд╛рдк рдпрд╣рд╛рдБ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
services.crawler.crawlerexceptions.ArticleNotFoundException
рдПрдХ рдкреИрдХреЗрдЬ рдЬрд┐рд╕рдореЗрдВ 2-рд▓рд╛рдЗрди рдореЙрдбреНрдпреВрд▓, рдПрдХ рдЕрдкрд╡рд╛рдж рд╡рд░реНрдЧ рдФрд░ "рдкрд╛рд╕" рд╣реИред рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рджреЛ рдмрд╛рд░ "рдХреНрд░реЙрд▓рд░" рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рджреЛ рдмрд╛рд░ "рдЕрдкрд╡рд╛рдж" рд╢рдмреНрджред ArticleNotFoundException рдирд╛рдо рд╣реА рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред рддреЛ рдордд рдХрд░реЛред рдпрджрд┐ рдЖрдк рдЕрдкрд╡рд╛рдж рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ EmptyBeer, BeerError, BeerNotFound рд╣реЛрдиреЗ рджреЗрдВ, рд▓реЗрдХрд┐рди BeerNotFoundError рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдХреБрдЫ рд╣реИред
рдЖрдк рдмрд╕ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЕрдкрд╡рд╛рдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИрдВред рдЬрдм рддрдХ рдЖрдкрдХреЛ рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рд▓реБрдХрдЕрдкрдСрдпрд░ рдареАрдХ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдореЗрд▓ рдореЗрдВ рдЧрдВрджрдЧреА рдорд┐рд▓реА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЕрднреА рднреА рдЗрд╕реЗ рдкрдврд╝рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреЛрдб рдореЗрдВ рдЕрдкрд╡рд╛рдж рдЖрдорддреМрд░ рдкрд░ рдЙрдард╛рдиреЗ рдФрд░ рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд╛рдж рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╣рд░ рдХреЛрдИ рддреБрд░рдВрдд рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдЕрдкрд╡рд╛рдж рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдирд╛рдо рдореЗрдВ "рдЕрдкрд╡рд╛рдж" рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдкрд╛рдпрдерди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬрдВрдЧ рд▓рдЧреЗ рд╣рд┐рд╕реНрд╕реЗ рднреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреЛрдб рд╕рдВрдЧрдарди рдХрд╛ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
- рдХреЛрдб рдХреА 200,000 рд▓рд╛рдЗрдиреЗрдВ
- 200 рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдХреЗ рдореЙрдбреНрдпреВрд▓
- рдкреНрд░рддрд┐ рдкреИрдХреЗрдЬ рдФрд╕рддрди 10 рдлрд╛рдЗрд▓реЗрдВ
- 165 рдЕрдкрд╡рд╛рдж
рдПрдХ рдкреИрдХреЗрдЬ рдореЗрдВ 10 рдлрд╛рдЗрд▓реЗрдВ рдмрд╣реБрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдХреБрдЫ рддреГрддреАрдп-рдкрдХреНрд╖ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рдЬрд╣рд╛рдВ рдХреЗрд╡рд▓ 2 рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдереЗред рдпрджрд┐ рдЖрдк рдПрдХ рдирдпрд╛ рдЕрдкрд╡рд╛рдж рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдмреЗрд╣рддрд░ рд╕реЛрдЪреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдХреЛрдб рдХреА 1200 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП 1 рдЕрдкрд╡рд╛рдж рд╣реИред
рдореИрдВ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВред рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдЬрдм рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмрджрд▓рддреЗ рдбреЗрдЯрд╛ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдХрд╛рдо рдореЗрдВ рдЕрдХреНрд╕рд░ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рд╡рд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреБрдХреНрдд рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рд╡реЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦреЗ рдЬрд╛ рдЪреБрдХреЗ рд╣реИрдВред
рдкрд╛рдпрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЕрдкрд╡рд╛рдж рд╣реАрдк рдореЙрдбреНрдпреВрд▓ рд╣реИред рдПрдХ рдвреЗрд░ рдХрддрд╛рд░, рдПрдХ рдвреЗрд░ рдХрддрд╛рд░, рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рд╣рд▓ рд╣реЛрддреА рд╣реИред рд╣реАрдкреЗрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдПрдХ рджрд░реНрдЬрди рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рд╕рднреА рдПрдХ рд╣реА рдвреЗрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рд░рд╣рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд░реНрдЧ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреАрдЦ рдорд╛рдБрдЧрддрд╛ рд╣реИред
heapify(data) pushleft(data, item) popleft(data) pushright(data, item) popright(data)
рдЖрджрд┐
рдЬрдм рднреА рдореБрдЭреЗ heapq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдореИрдВ рдЕрдкрдиреЗ рдЯреВрд▓рдХрд┐рдЯ рд╕реЗ рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рддрд╛ рд╣реВрдВред
class Heap(object): def __init__(self, data=None, key=lambda x: None): self.heap = data or [] heapq.heapify(self.heap) self.key = key def pushleft(self, item): if self.key: item = (self.key(item), item) heapq.pushleft(self.heap, item) def popleft(self): return heapq.popleft(self.heap)[1]
рдХрдХреНрд╖рд╛рдПрдВ рдорд╛рддрдо рдХреА рддрд░рд╣ рдмрдврд╝рддреА рд╣реИрдВ
рдкрд╛рдпрдерди рдореЗрдВ OAuth рдХреА рд╕реНрдерд┐рддрд┐ рдорд╣рддреНрд╡рд╣реАрди рд╣реИред рдлрд┐рд░, рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВрдиреЗ Google рдХреЗ url reducer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛: рдореБрдЭреЗ urls рд▓реЗрдиреЗ рдФрд░ рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдЯрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред Google рдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 10,000 рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВред 115 рдореЙрдбреНрдпреВрд▓ рдФрд░ 207 рдХрдХреНрд╖рд╛рдПрдВред рдореИрдВрдиреЗ
Google + рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ
рдЦрдВрдбрди рд▓рд┐рдЦрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ рдЗрд╕реЗ рджреЗрдЦрд╛, рдФрд░ рдЧреБрдЗрдбреЛ
(рд╡реИрди рд░реЛрд╕реБрдо - рд▓рдЧрднрдЧред) рдЯрд┐рдкреНрдкрдгреА рдХреА: "рдореИрдВ Google рдХреЗ рдПрдкреАрдЖрдИ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рд▓реЗрддрд╛ рд╣реВрдВред" рдХреЛрдб рдХреА 10,000 рд▓рд╛рдЗрдиреЗрдВ - рдХреБрдЫ рд╣реЛрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд╣реИред - рд╢реМрд░рдорд▓реЗ рдЬреИрд╕рд╛ рдХреБрдЫред рдпрд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлреНрд▓реЛ рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдиреНрдп рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
class Flow(object): pass class Storage(object): def put(self, data): _abstract() def get(self): _abstract() def _abstract(): raise NotImplementedError
рд╡рд╣ рдЦрд╛рд▓реА рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдФрд░ рд╣рд░ рдмрд╛рд░ рдЙрд╕ рд╡рд░реНрдЧ рдХреЛ рдкрдврд╝рдирд╛ рдЬреЛ рдЙрд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ, рдЖрдкрдХреЛ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЙрд╕ рдлрд╛рдЗрд▓ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд╣ рдХрдХреНрд╖рд╛ рдЦрд╛рд▓реА рд╣реИред рдХрд┐рд╕реА рдиреЗ рднрд╡рд┐рд╖реНрдп рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛: "рдЕрдм рдореИрдВ рдХреЛрдб рдХреА 3 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦреВрдВрдЧрд╛, рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдпреЗ 3 рдкрд░рд┐рд╡рд░реНрддрди рди рд╣реЛрдВред" рдФрд░ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд▓реЛрдЧреЛрдВ рд╕реЗ рд╕рдордп рд▓рд┐рдпрд╛ред рд╕реНрдЯреЛрд░реЗрдЬ рдХреНрд▓рд╛рд╕ рднреА рд╣реИ, рдЬреЛ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирдХ рдЕрдкрд╡рд╛рджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдЙрдкрдирд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
OAuth2 рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдПрдХ рд╕рдкреНрддрд╛рд╣ рдХрд╛ рд╕рдордп рд▓рдЧрд╛ред рдХреЛрдб рдХреА рджрд╕ рд╣рдЬрд╛рд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдореЗрдВ рдореБрдЭреЗ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХрд╛ рд╕рдордп рд▓рдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХреАред рдкрд╛рдпрд╛ рдЕрдЬрдЧрд░- oauth2 рдпрд╣ рдЕрдЬрдЧрд░-рдУрдПрде рдХрд╛ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ OAuth2 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдЬреЛ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп Google рд╕реЗ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рд╣реИ: рдХреЗрд╡рд▓ 540 рд▓рд╛рдЗрдиреЗрдВ рдФрд░ 15 рдХрдХреНрд╖рд╛рдПрдВред
рдореИрдВрдиреЗ рдЗрд╕реЗ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрддрд╛рдпрд╛ рдФрд░
рдЕрдЬрдЧрд░-рдлреЛрд╣рд╛рде 2 рдХрд╣рд╛ред рдХреЛрдб рдФрд░ рей рд╡рд░реНрдЧреЛрдВ рдХреА резрейрел рд▓рд╛рдЗрдиреЗрдВ, рдФрд░ рдпрд╣ рдЕрднреА рднреА рдмрд╣реБрдд рдХреБрдЫ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдпрд╣рд╛рдБ рдЗрди рддреАрди рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:
class Error(Exception): pass
рдЕрдкрдорд╛рди!
рдЬреАрд╡рди

рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдгред рдЖрдк рд╕рднреА рдиреЗ
рдХреЙрдирд╡реЗ рдХрд╛ рдЬреАрд╡рди рдЦреЗрд▓ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рдЖрдкрдХреЛ рдЙрд╕рдХрд╛ рдирд╛рдо рдкрддрд╛ рди рд╣реЛред рдПрдХ рдЪреЗрдХрд░ рдХреНрд╖реЗрддреНрд░ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рд▓ рдЬрд┐рд╕реЗ рдЖрдк рдорд╛рдирддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдирд┐рдХрдЯ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ рдЬреАрд╡рд┐рдд рдпрд╛ рдореГрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдЖрдкрдХреЛ рдЧреНрд▓рд╛рдЗрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реБрдВрджрд░ рд╕реНрдерд┐рд░ рдкреИрдЯрд░реНрди рдорд┐рд▓рддреЗ рд╣реИрдВ: рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╕рд╛рдордиреЗ рдЖрддреА рд╣реИрдВ рдФрд░ рдкреАрда рдореЗрдВ рдорд░ рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдЧреНрд▓рд╛рдЗрдбрд░ рдкреВрд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЙрдбрд╝рдиреЗ рд▓рдЧрддрд╛ рд╣реИред

рдЦреЗрд▓ "рдЬреАрд╡рди" рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдПрдХ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рдЬреЛрдбрд╝рд╛ред рд╣рдо рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдкреВрдЫрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдХрдИ рд▓реЛрдЧ рддреБрд░рдВрдд рдХрд╣рддреЗ рд╣реИрдВ, тАЬрдПрдХ рдХреЛрд╢рд┐рдХрд╛ рдПрдХ рд╕рдВрдЬреНрдЮрд╛ рд╣реИред рд╡рд░реНрдЧ рдХреА рдЬрд░реВрд░рдд рд╣реИред тАЭрдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдХреНрдпрд╛ рдЧреБрдг рд╣реИрдВ? рдЬрдЧрд╣, рдЬреАрд╡рд┐рдд рдпрд╛ рдирд╣реАрдВ, рд░рд╛рдЬреНрдп рдЕрдЧрд▓реА рдмрд╛рд░реА, рд╕рдм рдХреБрдЫ? рдЕрднреА рднреА рдкрдбрд╝реЛрд╕реА рд╣реИрдВред рдлрд┐рд░ рд╡реЗ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдХреНрд╖реЗрддреНрд░ рдмрд╣реБрдд рд╕рд╛рд░реА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдЧреНрд░рд┐рдб рд╣реИ, рдЗрд╕рдХреА рдПрдХ "рдЧрдгрдирд╛" рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЕрдВрджрд░ рд╕реЗ рдЧрд┐рдирддреА рд╣реИред
class Cell(object): def __init__(self, x, y, alive=True): self.x = x self.y = y self.alive = alive self.next = None def neigbors(self): for i, j in itertools.product(range(-1, 2), repeat=2): if (i, j) != (0, 0): yield (self.x + i, self.y + j) class Board(object): def __init__(self): self.cells = {}
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ "рд░реЛрдХ" рдХрд╣рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдлрд╝реАрд▓реНрдб рдХреНрд▓рд╛рд╕ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ 2 рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ: __init__ рдФрд░ "рдПрдХ рдЪрд╛рд▓ рдХрд░реЗрдВ"ред рдЗрд╕рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реИ - рдПрдХ рд╢рдмреНрджрдХреЛрд╢, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдмрд┐рдВрджреБ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рд╣реИрдВред рдПрдХ рдЬреАрд╡рд┐рдд рдмрд┐рдВрджреБ рдпрд╛ рдирд╣реАрдВ рдмрд╕ рдПрдХ рдмреВрд▓рд┐рдпрди рдореВрд▓реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдФрд░ рдЪреВрдВрдХрд┐ рдХреЗрд╡рд▓ рдЯреНрд░реВ рд╢рдмреНрджрдХреЛрд╖ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рд╢рдмреНрджрдХреЛрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдПрдХ рдирдП рд░рд╛рдЬреНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдмрд╕ рдЬреАрд╡рд┐рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
def neigbors(point): x, y = point for i, j in itertools.product(range(-1, 2), repeat=2): if any((i, j)): yield (x + i, y + j) def advance(board): newstate = set() recalc = board | set(itertools.chain(*map(neighbors, board))) for point in recalc: count = sum((neigh in board) for neigh in neighbors(point)) if count == 3 or (count == 2 and point in board): newstate.add(point) return newstate glider = set([(0, 0), (1, 0), (2, 0), (0, 1), (1, 2)]) for i in range(1000): glider = advance(glider) print glider

рдпрд╣ рдЦреЗрд▓ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрд╣рд╛рдВ рджреЛ рд╡рд░реНрдЧреЛрдВ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдиреАрдЪреЗ - рдЧреНрд▓рд╛рдЗрдбрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рдЙрдиреНрд╣реЗрдВ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЧреНрд▓рд╛рдЗрдбрд░ рдЙрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣ рд╕рдм рд╣реИред рдпрд╣ рдЦреЗрд▓ "рдЬреАрд╡рди" рдХрд╛
рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рд╕рд╛рд░рд╛рдВрд╢
1. рдпрджрд┐ рдЖрдк __init__ рд╕рд╣рд┐рдд рджреЛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИред
2. рдЕрдЧрд░ рдЬрд░реВрд░рдд рди рд╣реЛ (рдФрд░ рдЙрдирдХреА рдЬрд░реВрд░рдд рди рд╣реЛ) рдирдП рдЕрдкрд╡рд╛рдж рди рдмрдирд╛рдПрдВред
3. рдХрдард┐рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдПрдВред
рдПрдХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ, рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХрдИ рдиреЗ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ PLO рдХреЗ рдкреВрд░реНрдг рдЦрдВрдбрди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рд╣реИред рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИред рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд┐рдВрджреБ 1 рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИред рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред