рдпрд╣ рдореЗрд░реА @pythonetc рдлреАрдб рд╕реЗ рдкрд╛рдпрдерди рдЯрд┐рдкреНрд╕ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдиреМрд╡рд╛рдВ рд╕рдВрдЧреНрд░рд╣ рд╣реИред
рдкрд┐рдЫрд▓реЗ рдЪрдпрди ред
рд╕рдВрд░рдЪрдирд╛рддреНрдордХ рддреБрд▓рдирд╛
рдХрднреА-рдХрднреА рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рдореВрд▓реНрдпреЛрдВ рдХреА рдЕрдирджреЗрдЦреА рдХрд░рддреЗ рд╣реБрдП, рдЬрдЯрд┐рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
>>> d = dict(a=1, b=2, c=3) >>> assert d['a'] == 1 >>> assert d['c'] == 3
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ:
>>> assert d == dict(a=1, b=ANY, c=3)
рдпрд╣
__eq__
рдореИрдЬрд┐рдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
>>> class AnyClass: ... def __eq__(self, another): ... return True ... >>> ANY = AnyClass()
stdout
sys.stdout рдПрдХ рд░реИрдкрд░ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд▓рд┐рдЦрдиреЗ рджреЗрддрд╛ рд╣реИ, рдмрд╛рдЗрдЯреНрд╕ рдирд╣реАрдВред рдпреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ
sys.stdout.encoding
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдиреНрдХреЛрдбреЗрдб рд╣реИрдВ:
>>> sys.stdout.write('Stra├Яe\n') Stra├Яe >>> sys.stdout.encoding 'UTF-8' sys.stdout.encoding
рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдмрд░рд╛рдмрд░, рдЬрд┐рд╕реЗ
PYTHONIOENCODING
рдкрд░реНрдпрд╛рд╡рд░рдг
PYTHONIOENCODING
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
$ PYTHONIOENCODING=cp1251 python3 Python 3.6.6 (default, Aug 13 2018, 18:24:23) [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.stdout.encoding 'cp1251'
рдпрджрд┐ рдЖрдк рдмрд╛рдЗрдЯреНрд╕ рдХреЛ
sys.stdout.buffer
рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд░реИрдкрд░ рдореЗрдВ рд░рдЦреЗ рдмрдлрд░ рдХреЗ
sys.stdout.buffer
рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
>>> sys.stdout <_io.TextIOWrapper name='<stdut>' mode='w' encoding='cp1251'> >>> sys.stdout.buffer <_io.BufferedWriter name='<stdut>'> >>> sys.stdout.buffer.write(b'Stra\xc3\x9fe\n') Stra├Яe sys.stdout.buffer
рдПрдХ рдЖрд╡рд░рдг рднреАред рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдХреЛ
sys.stdout.buffer.raw
рд╕рд╛рде рд╕рдВрдкрд░реНрдХ рдХрд░рдХреЗ рдмрд╛рдИрдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
>>> sys.stdout.buffer.raw.write(b'Stra\xc3\x9fe') Stra├Яe
рд▓рдЧрд╛рддрд╛рд░ рдЗрд▓рд┐рдкреНрд╕рд┐рд╕
рдкрд╛рдпрдерди рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ,
Ellipsis
рдХреЛ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
...
рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЙрдкрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВред
numpy
рдХреЛ
numpy
рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
x[...]
x
рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
PEP 484 рдЗрд╕ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:
Callable[..., type]
рдЖрдкрдХреЛ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдХреЙрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
...
рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдпрд╣ рдкрд╛рдпрдерди рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рд╣реИ:
def x(): ...
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкрд╛рдпрдерди 2 рдореЗрдВ
Ellipsis
рдХреЛ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
...
рдПрдХ рдЕрдкрд╡рд╛рдж
a[...]
, рдЬрд┐рд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛
a[Ellipsis]
ред
рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкрд╛рдпрдерди 3 рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди 2 рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╕рд╣реА рд╣реИ:
a[...] a[...:2:...] [..., ...] {...:...} a = ... ... is ... def a(x=...): ...
рдкреБрди: рдЖрдпрд╛рдд рдореЙрдбреНрдпреВрд▓
рдкрд╣рд▓реЗ рд╕реЗ рдЖрдпрд╛рддрд┐рдд рдореЙрдбреНрдпреВрд▓ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
import foo
рдХрдорд╛рдВрдб рдХреЗрд╡рд▓ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдкрд╛рдпрдерди 3.4+ рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП importlib рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
In [1]: import importlib In [2]: with open('foo.py', 'w') as f: ...: f.write('a = 1') ...: In [3]: import foo In [4]: foo.a Out[4]: 1 In [5]: with open('foo.py', 'w') as f: ...: f.write('a = 2') ...: In [6]: foo.a Out[6]: 1 In [7]: import foo In [8]: foo.a Out[8]: 1 In [9]: importlib.reload(foo) Out[9]: <module 'foo' from '/home/v.pushtaev/foo.py'> In [10]: foo.a Out[10]: 2
autoreload
рд▓рд┐рдП рдПрдХ
autoreload
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рднреА рд╣реИ, рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ
autoreload
рдХрд░реЗрдЧрд╛:
In [1]: %load_ext autoreload In [2]: %autoreload 2 In [3]: with open('foo.py', 'w') as f: ...: f.write('print("LOADED"); a=1') ...: In [4]: import foo LOADED In [5]: foo.a Out[5]: 1 In [6]: with open('foo.py', 'w') as f: ...: f.write('print("LOADED"); a=2') ...: In [7]: import foo LOADED In [8]: foo.a Out[8]: 2 In [9]: with open('foo.py', 'w') as f: ...: f.write('print("LOADED"); a=3') ...: In [10]: foo.a LOADED Out[10]: 3
\ _ рдЬреА
рдХреБрдЫ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЖрдк
\G
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдкрд┐рдЫрд▓реА рдЦреЛрдЬ рд╕рдорд╛рдкреНрдд рд╣реБрдИ рдереАред рдпрд╣ рд╣рдореЗрдВ рдкрд░рд┐рдорд┐рдд рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╢рдмреНрдж рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рд╢рдмреНрдж рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
рдкрд╛рдпрдерди рдореЗрдВ, рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рддрд░рд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдк рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
import re import json text = '<a><b>foo</b><c>bar</c></a><z>bar</z>' regex = '^(?:<([az]+)>|</([az]+)>|([az]+))' stack = [] tree = [] pos = 0 while len(text) > pos: error = f'Error at {text[pos:]}' found = re.search(regex, text[pos:]) assert found, error pos += len(found[0]) start, stop, data = found.groups() if start: tree.append(dict( tag=start, children=[], )) stack.append(tree) tree = tree[-1]['children'] elif stop: tree = stack.pop() assert tree[-1]['tag'] == stop, error if not tree[-1]['children']: tree[-1].pop('children') elif data: stack[-1][-1]['data'] = data print(json.dumps(tree, indent=4))
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рд▓рд╛рдЗрди рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╕рдордп рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░
re
рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐ рд╕реЗ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ,
re.search
рдЦреЛрдЬ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реЗ,
^
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ, рдФрд░ рдЦреЛрдЬ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдЪ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
import re import json text = '<a><b>foo</b><c>bar</c></a><z>bar</z>' * 10 def print_tree(tree): print(json.dumps(tree, indent=4)) def xml_to_tree_slow(text): regex = '^(?:<([az]+)>|</([az]+)>|([az]+))' stack = [] tree = [] pos = 0 while len(text) > pos: error = f'Error at {text[pos:]}' found = re.search(regex, text[pos:]) assert found, error pos += len(found[0]) start, stop, data = found.groups() if start: tree.append(dict( tag=start, children=[], )) stack.append(tree) tree = tree[-1]['children'] elif stop: tree = stack.pop() assert tree[-1]['tag'] == stop, error if not tree[-1]['children']: tree[-1].pop('children') elif data: stack[-1][-1]['data'] = data def xml_to_tree_slow(text): regex = '^(?:<([az]+)>|</([az]+)>|([az]+))' stack = [] tree = [] pos = 0 while len(text) > pos: error = f'Error at {text[pos:]}' found = re.search(regex, text[pos:]) assert found, error pos += len(found[0]) start, stop, data = found.groups() if start: tree.append(dict( tag=start, children=[], )) stack.append(tree) tree = tree[-1]['children'] elif stop: tree = stack.pop() assert tree[-1]['tag'] == stop, error if not tree[-1]['children']: tree[-1].pop('children') elif data: stack[-1][-1]['data'] = data return tree _regex = re.compile('(?:<([az]+)>|</([az]+)>|([az]+))') def _error_message(text, pos): return text[pos:] def xml_to_tree_fast(text): stack = [] tree = [] pos = 0 while len(text) > pos: error = f'Error at {text[pos:]}' found = _regex.search(text, pos=pos) begin, end = found.span(0) assert begin == pos, _error_message(text, pos) assert found, _error_message(text, pos) pos += len(found[0]) start, stop, data = found.groups() if start: tree.append(dict( tag=start, children=[], )) stack.append(tree) tree = tree[-1]['children'] elif stop: tree = stack.pop() assert tree[-1]['tag'] == stop, _error_message(text, pos) if not tree[-1]['children']: tree[-1].pop('children') elif data: stack[-1][-1]['data'] = data return tree print_tree(xml_to_tree_fast(text))
рдкрд░рд┐рдгрд╛рдо:
In [1]: from example import * In [2]: %timeit xml_to_tree_slow(text) 356 ┬╡s ┬▒ 16.9 ┬╡s per loop (mean ┬▒ std. dev. of 7 runs, 1000 loops each) In [3]: %timeit xml_to_tree_fast(text) 294 ┬╡s ┬▒ 6.15 ┬╡s per loop (mean ┬▒ std. dev. of 7 runs, 1000 loops each)
рдЧреЛрд▓ рд╕рдВрдЦреНрдпрд╛
рдпрд╣ рдЖрдЗрдЯрдо рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдирд▓ @itgram_channel рдХреЗ рд▓реЗрдЦрдХ orininium рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛редround
рдлрд╝рдВрдХреНрд╢рди рджрд╢рдорд▓рд╡ рд╕реНрдерд╛рдиреЛрдВ рдХреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ
round
рдХрд░рддрд╛ рд╣реИред
>>> round(1.2) 1 >>> round(1.8) 2 >>> round(1.228, 1) 1.2
рдЖрдк рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдЧреЛрд▓рд╛рдИ рд╕рдЯреАрдХрддрд╛ рднреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
>>> round(413.77, -1) 410.0 >>> round(413.77, -2) 400.0 round
рдЗрдирдкреБрдЯ рдирдВрдмрд░ рдХреЗ рд╕рдорд╛рди рдорд╛рди рдХрд╛ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ:
>>> type(round(2, 1)) <class 'int'> >>> type(round(2.0, 1)) <class 'float'> >>> type(round(Decimal(2), 1)) <class 'decimal.Decimal'> >>> type(round(Fraction(2), 1)) <class 'fractions.Fraction'>
рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдЖрдк
__round__
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
round
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
>>> class Number(int): ... def __round__(self, p=-1000): ... return p ... >>> round(Number(2)) -1000 >>> round(Number(2), -2) -2
рдпрд╣рд╛рдБ рдорд╛рдиреЛрдВ рдХреЛ рдирд┐рдХрдЯрддрдо
10 ** (-precision)
рдХрдИ
10 ** (-precision)
ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
precision=1
рдорд╛рди 0.1:
round(0.63, 1)
рдХрдИ рдХреЗ рд╕рд╛рде
round(0.63, 1)
0.6
ред рдпрджрд┐ рджреЛ рдПрдХрд╛рдзрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдкрд╛рд╕ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреЛрд▓рд╛рдИ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
>>> round(0.5) 0 >>> round(1.5) 2
рдХрднреА-рдХрднреА рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдмрд┐рдВрджреБ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧреЛрд▓ рдХрд░рдирд╛ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХрддрд╛ рд╣реИ:
>>> round(2.85, 1) 2.9
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рджрд╢рдорд▓рд╡ рдЕрдВрд╢реЛрдВ рдХреЛ рдПрдХ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ (
https://docs.python.org/3.7/tutorial/floatingpoint.html ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
>>> format(2.85, '.64f') '2.8500000000000000888178419700125232338905334472656250000000000000'
рдпрджрд┐ рдЖрдк рдЖрдзрд╛ рдЪрдХреНрдХрд░
decimal.Decimal
рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ
decimal.Decimal
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
decimal.Decimal
:
>>> from decimal import Decimal, ROUND_HALF_UP >>> Decimal(1.5).quantize(0, ROUND_HALF_UP) Decimal('2') >>> Decimal(2.85).quantize(Decimal('1.0'), ROUND_HALF_UP) Decimal('2.9') >>> Decimal(2.84).quantize(Decimal('1.0'), ROUND_HALF_UP) Decimal('2.8')