Документация Python неофициальный перевод

controlflow.md

506 строк · 38.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.1/tutorial/controlflow.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 4. Дополнительные инструменты управления потоком89Помимо только что представленного оператора [`while`](https://python-all.ru/3.1/reference/compound_stmts.html#while), в Python есть привычные операторы управления потоком, известные из других языков, но с некоторыми особенностями.1011## 4.1. Операторы [`if`](https://python-all.ru/3.1/reference/compound_stmts.html#if)1213Пожалуй, самый известный тип оператора – это [`if`](https://python-all.ru/3.1/reference/compound_stmts.html#if). Например:1415```python16>>> x = int(input("Please enter an integer: "))17Please enter an integer: 4218>>> if x < 0:19...      x = 020...      print('Negative changed to zero')21... elif x == 0:22...      print('Zero')23... elif x == 1:24...      print('Single')25... else:26...      print('More')27...28More29```3031Может быть ноль или более частей [`elif`](https://python-all.ru/3.1/reference/compound_stmts.html#elif), а часть [`else`](https://python-all.ru/3.1/reference/compound_stmts.html#else) необязательна. Ключевое слово «[`elif`](https://python-all.ru/3.1/reference/compound_stmts.html#elif)» – это сокращение от «else if», и оно помогает избежать чрезмерной вложенности. Последовательность [`if`](https://python-all.ru/3.1/reference/compound_stmts.html#if) ... [`elif`](https://python-all.ru/3.1/reference/compound_stmts.html#elif) ... [`elif`](https://python-all.ru/3.1/reference/compound_stmts.html#elif) ... заменяет операторы `switch` или `case`, встречающиеся в других языках.3233## 4.2. Операторы [`for`](https://python-all.ru/3.1/reference/compound_stmts.html#for)3435Оператор [`for`](https://python-all.ru/3.1/reference/compound_stmts.html#for) в Python несколько отличается от того, к чему вы привыкли в C или Pascal. Вместо того чтобы всегда перебирать арифметическую прогрессию чисел (как в Pascal) или давать возможность определять шаг и условие остановки (как в C), оператор [`for`](https://python-all.ru/3.1/reference/compound_stmts.html#for) в Python перебирает элементы любой последовательности (списка или строки) в том порядке, в котором они встречаются. Например (без каламбура):3637```python38>>> # Измеряем некоторые строки:39... a = ['cat', 'window', 'defenestrate']40>>> for x in a:41...     print(x, len(x))42...43cat 344window 645defenestrate 1246```4748Изменять последовательность, по которой выполняется итерация в цикле, небезопасно (это возможно только для изменяемых типов последовательностей, например списков). Если нужно изменить список, по которому выполняется итерация (например, чтобы продублировать выбранные элементы), следует выполнять итерацию по его копии. Синтаксис срезов делает это особенно удобным:4950```python51>>> for x in a[:]: # создать копию всего списка срезом52...    if len(x) > 6: a.insert(0, x)53...54>>> a55['defenestrate', 'cat', 'window', 'defenestrate']56```5758## 4.3. Функция [`range()`](https://python-all.ru/3.1/library/functions.html#range)5960Если всё же нужно перебрать последовательность чисел, пригодится встроенная функция [`range()`](https://python-all.ru/3.1/library/functions.html#range). Она генерирует арифметические прогрессии:6162```python63>>> for i in range(5):64...     print(i)65...66067168269370471```7273Указанная конечная точка никогда не входит в генерируемую последовательность; `range(10)` генерирует 10 значений – это допустимые индексы для элементов последовательности длины 10. Можно задать другое начальное число или указать другой шаг (даже отрицательный; иногда он называется «шаг»):7475```python76range(5, 10)77   5 through 97879range(0, 10, 3)80   0, 3, 6, 98182range(-10, -100, -30)83  -10, -40, -7084```8586Чтобы перебрать индексы последовательности, можно комбинировать [`range()`](https://python-all.ru/3.1/library/functions.html#range) и [`len()`](https://python-all.ru/3.1/library/functions.html#len) следующим образом:8788```python89>>> a = ['Mary', 'had', 'a', 'little', 'lamb']90>>> for i in range(len(a)):91...     print(i, a[i])92...930 Mary941 had952 a963 little974 lamb98```99100Однако в большинстве таких случаев удобнее использовать функцию [`enumerate()`](https://python-all.ru/3.1/library/functions.html#enumerate). См. [*Техники перебора*](https://python-all.ru/3.1/tutorial/datastructures.html#tut-loopidioms).101102Странная вещь происходит, если просто вывести range:103104```python105>>> print(range(10))106range(0, 10)107```108109Во многом объект, возвращаемый [`range()`](https://python-all.ru/3.1/library/functions.html#range), ведёт себя как список, но на самом деле это не так. Это объект, который при переборе возвращает последовательные элементы нужной последовательности, но не создаёт сам список, экономя тем самым память.110111Такой объект называется *итерируемым*, то есть он может использоваться как источник для функций и конструкций, которые ожидают последовательность элементов и получают их один за другим, пока они не закончатся. Мы уже видели, что оператор [`for`](https://python-all.ru/3.1/reference/compound_stmts.html#for) является таким *итератором*. Ещё пример – функция [`list()`](https://python-all.ru/3.1/library/functions.html#list), которая создаёт списки из итерируемых объектов:112113```python114>>> list(range(5))115[0, 1, 2, 3, 4]116```117118Позже мы увидим больше функций, которые возвращают итерируемые объекты и принимают их в качестве аргумента.119120## 4.4. Операторы [`break`](https://python-all.ru/3.1/reference/simple_stmts.html#break) и [`continue`](https://python-all.ru/3.1/reference/simple_stmts.html#continue), и предложения [`else`](https://python-all.ru/3.1/reference/compound_stmts.html#else) в циклах121122Оператор [`break`](https://python-all.ru/3.1/reference/simple_stmts.html#break), как и в C, прерывает выполнение самого внутреннего цикла [`for`](https://python-all.ru/3.1/reference/compound_stmts.html#for) или [`while`](https://python-all.ru/3.1/reference/compound_stmts.html#while).123124Оператор [`continue`](https://python-all.ru/3.1/reference/simple_stmts.html#continue), также заимствованный из C, переходит к следующей итерации цикла.125126У циклов может быть предложение `else`; оно выполняется, когда цикл завершается естественным образом – из-за исчерпания списка (для [`for`](https://python-all.ru/3.1/reference/compound_stmts.html#for)) или когда условие становится ложным (для [`while`](https://python-all.ru/3.1/reference/compound_stmts.html#while)), но не в случае, если цикл прерван оператором [`break`](https://python-all.ru/3.1/reference/simple_stmts.html#break). Это демонстрируется следующим циклом, который ищет простые числа:127128```python129>>> for n in range(2, 10):130...     for x in range(2, n):131...         if n % x == 0:132...             print(n, 'equals', x, '*', n//x)133...             break134...     else:135...         # цикл завершился без нахождения множителя136...         print(n, 'is a prime number')137...1382 is a prime number1393 is a prime number1404 equals 2 * 21415 is a prime number1426 equals 2 * 31437 is a prime number1448 equals 2 * 41459 equals 3 * 3146```147148## 4.5. Операторы [`pass`](https://python-all.ru/3.1/reference/simple_stmts.html#pass)149150Оператор [`pass`](https://python-all.ru/3.1/reference/simple_stmts.html#pass) ничего не делает. Его можно использовать, когда синтаксически требуется оператор, но программа не должна выполнять никаких действий. Например:151152```python153>>> while True:154...     pass  # Активное ожидание прерывания с клавиатуры (Ctrl+C)155...156```157158Это часто используется для создания минимальных классов:159160```python161>>> class MyEmptyClass:162...     pass163...164```165166Ещё одно применение [`pass`](https://python-all.ru/3.1/reference/simple_stmts.html#pass) – в качестве заполнителя для тела функции или условного оператора при работе над новым кодом, чтобы сохранить абстрактный уровень мышления. Оператор [`pass`](https://python-all.ru/3.1/reference/simple_stmts.html#pass) просто игнорируется:167168```python169>>> def initlog(*args):170...     pass   # Не забудьте реализовать это!171...172```173174## 4.6. Определение функций175176Можно создать функцию, которая выводит ряд Фибоначчи до произвольной границы:177178```python179>>> def fib(n):    # вывести ряд Фибоначчи до n180...     """Вывести ряд Фибоначчи до n."""181...     a, b = 0, 1182...     while a < n:183...         print(a, end=' ')184...         a, b = b, a+b185...     print()186...187>>> # Теперь вызовите только что определённую функцию:188... fib(2000)1890 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597190```191192Ключевое слово [`def`](https://python-all.ru/3.1/reference/compound_stmts.html#def) вводит *определение* функции. За ним должно следовать имя функции и заключённый в скобки список формальных параметров. Операторы, составляющие тело функции, начинаются со следующей строки и должны иметь отступ.193194Первый оператор тела функции может быть строковым литералом; этот строковый литерал является строкой документации функции, или *docstring*. (Подробнее о docstring можно найти в разделе [*Строки документации*](https://python-all.ru/3.1/tutorial/controlflow.html#tut-docstrings).) Существуют инструменты, которые используют docstring для автоматического создания онлайн- или печатной документации, или чтобы позволить пользователю интерактивно просматривать код; рекомендуется включать docstring в код, который вы пишете, так что сделайте это привычкой.195196При *выполнении* функции создаётся новая таблица символов для локальных переменных функции. Точнее, все присваивания переменным внутри функции сохраняют значение в локальной таблице символов; ссылки на переменные сначала ищут в локальной таблице, затем в таблицах символов охватывающих функций, затем в глобальной таблице и, наконец, в таблице встроенных имён. Таким образом, глобальным переменным нельзя напрямую присвоить значение внутри функции (если только они не указаны в операторе [`global`](https://python-all.ru/3.1/reference/simple_stmts.html#global)), хотя на них можно ссылаться.197198Фактические параметры (аргументы) вызова функции вносятся в локальную таблицу символов вызываемой функции при её вызове; таким образом, аргументы передаются с использованием *передачи по значению* (где *значение* всегда является ссылкой *на объект*, а не значением объекта). [\[1\]](https://python-all.ru/3.1/tutorial/controlflow.html#id2) Когда функция вызывает другую функцию, для этого вызова создаётся новая локальная таблица символов.199200Определение функции вводит имя функции в текущую таблицу символов. Значение имени функции имеет тип, который распознаётся интерпретатором как определяемая пользователем функция. Это значение может быть присвоено другому имени, которое затем также можно использовать как функцию. Это служит общим механизмом переименования:201202```python203>>> fib204<function fib at 10042ed0>205>>> f = fib206>>> f(100)2070 1 1 2 3 5 8 13 21 34 55 89208```209210Пришедшие из других языков могут возразить, что `fib` – это не функция, а процедура, так как она не возвращает значения. На самом деле даже функции без оператора [`return`](https://python-all.ru/3.1/reference/simple_stmts.html#return) возвращают значение, хоть и довольно скучное. Это значение называется `None` (это встроенное имя). Вывод значения `None` обычно подавляется интерпретатором, если оно единственное. Но его можно увидеть, если очень захотеть, с помощью [`print()`](https://python-all.ru/3.1/library/functions.html#print):211212```python213>>> fib(0)214>>> print(fib(0))215None216```217218Просто написать функцию, которая возвращает список чисел ряда Фибоначчи, вместо того чтобы выводить его:219220```python221>>> def fib2(n): # возвращает ряд Фибоначчи до n222...     """Возвращает список, содержащий ряд Фибоначчи до n."""223...     result = []224...     a, b = 0, 1225...     while a < n:226...         result.append(a)    # см. ниже227...         a, b = b, a+b228...     return result229...230>>> f100 = fib2(100)    # вызов231>>> f100                # вывод результата232[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]233```234235Этот пример, как обычно, демонстрирует некоторые новые возможности Python:236237- Оператор [`return`](https://python-all.ru/3.1/reference/simple_stmts.html#return) возвращает значение из функции. [`return`](https://python-all.ru/3.1/reference/simple_stmts.html#return) без аргумента возвращает `None`. Достижение конца функции также возвращает `None`.238- Оператор `result.append(a)` вызывает *метод* объекта списка `result`. Метод – это функция, которая «принадлежит» объекту и имеет имя `obj.methodname`, где `obj` – некоторый объект (это может быть выражение), а `methodname` – имя метода, определённого типом объекта. Разные типы определяют разные методы. Методы разных типов могут иметь одинаковые имена, не вызывая неоднозначности. (Можно определять собственные типы объектов и методы, используя *классы*; см. [*Классы*](https://python-all.ru/3.1/tutorial/classes.html#tut-classes)). Метод `append()`, показанный в примере, определён для объектов списка; он добавляет новый элемент в конец списка. В этом примере он эквивалентен `result = result + [a]`, но более эффективен.239240## 4.7. Подробнее об определении функций241242Также можно определять функции с переменным числом аргументов. Существует три формы, которые можно комбинировать.243244### 4.7.1. Значения аргументов по умолчанию245246Наиболее полезная форма – указать значение по умолчанию для одного или нескольких аргументов. Это создаёт функцию, которую можно вызывать с меньшим количеством аргументов, чем она определена допускать. Например:247248```python249def ask_ok(prompt, retries=4, complaint='Yes or no, please!'):250    while True:251        ok = input(prompt)252        if ok in ('y', 'ye', 'yes'):253            return True254        if ok in ('n', 'no', 'nop', 'nope'):255            return False256        retries = retries - 1257        if retries < 0:258            raise IOError('refusenik user')259        print(complaint)260```261262Эту функцию можно вызывать несколькими способами:263264- указав только обязательный аргумент: `ask_ok('Do you really want to quit?')`265- указав один из необязательных аргументов: `ask_ok('OK to overwrite the file?', 2)`266- или даже указав все аргументы: `ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')`267268Этот пример также знакомит с ключевым словом [`in`](https://python-all.ru/3.1/reference/expressions.html#in). Оно проверяет, содержит ли последовательность определённое значение.269270Значения по умолчанию вычисляются в точке определения функции в *определяющей* области видимости, так что271272```python273i = 5274275def f(arg=i):276    print(arg)277278i = 6279f()280```281282выведет `5`.283284**Важное предупреждение:** Значение по умолчанию вычисляется только один раз. Это имеет значение, когда значение по умолчанию является изменяемым объектом, таким как список, словарь или экземпляры большинства классов. Например, следующая функция накапливает аргументы, переданные ей при последующих вызовах:285286```python287def f(a, L=[]):288    L.append(a)289    return L290291print(f(1))292print(f(2))293print(f(3))294```295296Это выведет297298```python299[1]300[1, 2]301[1, 2, 3]302```303304Если вы не хотите, чтобы значение по умолчанию разделялось между последующими вызовами, вы можете написать функцию так:305306```python307def f(a, L=None):308    if L is None:309        L = []310    L.append(a)311    return L312```313314### 4.7.2. Именованные аргументы315316Функции также можно вызывать с помощью именованных аргументов вида `keyword = value`. Например, следующая функция:317318```python319def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):320    print("-- This parrot wouldn't", action, end=' ')321    print("if you put", voltage, "volts through it.")322    print("-- Lovely plumage, the", type)323    print("-- It's", state, "!")324```325326может быть вызвана любым из следующих способов:327328```python329parrot(1000)330parrot(action = 'VOOOOOM', voltage = 1000000)331parrot('a thousand', state = 'pushing up the daisies')332parrot('a million', 'bereft of life', 'jump')333```334335но следующие вызовы будут недопустимыми:336337```python338parrot()                     # отсутствует обязательный аргумент339parrot(voltage=5.0, 'dead')  # неименованный аргумент после именованного340parrot(110, voltage=220)     # повторное значение для аргумента341parrot(actor='John Cleese')  # неизвестное ключевое слово342```343344В общем случае список аргументов должен содержать сначала позиционные аргументы, затем именованные, причём имена ключей должны быть выбраны из имён формальных параметров. Неважно, имеет ли формальный параметр значение по умолчанию. Ни один аргумент не может получить значение более одного раза – имена формальных параметров, соответствующие позиционным аргументам, не могут использоваться как ключевые слова в тех же вызовах. Вот пример, который завершается ошибкой из-за этого ограничения:345346```python347>>> def function(a):348...     pass349...350>>> function(0, a=0)351Traceback (most recent call last):352  File "<stdin>", line 1, in ?353TypeError: function() got multiple values for keyword argument 'a'354```355356Когда присутствует последний формальный параметр вида `**name`, он получает словарь (см. [*Типы отображений – dict*](https://python-all.ru/3.1/library/stdtypes.html#typesmapping)), содержащий все именованные аргументы, кроме тех, которые соответствуют формальному параметру. Это можно комбинировать с формальным параметром вида `*name` (описано в следующем подразделе), который получает кортеж, содержащий позиционные аргументы, выходящие за пределы списка формальных параметров. (`*name` должен указываться перед `**name`.) Например, если определить функцию так:357358```python359def cheeseshop(kind, *arguments, **keywords):360    print("-- Do you have any", kind, "?")361    print("-- I'm sorry, we're all out of", kind)362    for arg in arguments:363        print(arg)364    print("-" * 40)365    keys = sorted(keywords.keys())366    for kw in keys:367        print(kw, ":", keywords[kw])368```369370Её можно было бы вызвать так:371372```python373cheeseshop("Limburger", "It's very runny, sir.",374           "It's really very, VERY runny, sir.",375           shopkeeper="Michael Palin",376           client="John Cleese",377           sketch="Cheese Shop Sketch")378```379380и, конечно, она выведет:381382```python383-- Do you have any Limburger ?384-- I'm sorry, we're all out of Limburger385It's very runny, sir.386It's really very, VERY runny, sir.387----------------------------------------388client : John Cleese389shopkeeper : Michael Palin390sketch : Cheese Shop Sketch391```392393Обратите внимание, что список имен именованных аргументов создается путем сортировки результата метода `keys()` словаря keywords перед выводом его содержимого; если этого не сделать, порядок, в котором аргументы выводятся, не определен.394395### 4.7.3. Произвольные списки аргументов396397Наконец, наименее часто используемая возможность – указать, что функцию можно вызывать с произвольным количеством аргументов. Эти аргументы будут упакованы в кортеж (см. [*Кортежи и последовательности*](https://python-all.ru/3.1/tutorial/datastructures.html#tut-tuples)). Перед переменным числом аргументов может быть ноль или более обычных аргументов.398399```python400def write_multiple_items(file, separator, *args):401    file.write(separator.join(args))402```403404Обычно эти `вариативные` аргументы находятся последними в списке формальных параметров, потому что они собирают все остальные входные аргументы, которые передаются функции. Любые формальные параметры, которые идут после параметра `*args`, являются 'ключевыми' аргументами (keyword-only), то есть их можно указывать только как именованные, а не позиционные аргументы.405406```python407>>> def concat(*args, sep="/"):408...    return sep.join(args)409...410>>> concat("earth", "mars", "venus")411'earth/mars/venus'412>>> concat("earth", "mars", "venus", sep=".")413'earth.mars.venus'414```415416### 4.7.4. Распаковка списков аргументов417418Обратная ситуация возникает, когда аргументы уже находятся в списке или кортеже, но их нужно распаковать для вызова функции, ожидающей отдельные позиционные аргументы. Например, встроенная функция [`range()`](https://python-all.ru/3.1/library/functions.html#range) ожидает отдельные аргументы *start* и *stop*. Если они недоступны по отдельности, запишите вызов функции с оператором `*` для распаковки аргументов из списка или кортежа:419420```python421>>> list(range(3, 6))            # обычный вызов с отдельными аргументами422[3, 4, 5]423>>> args = [3, 6]424>>> list(range(*args))            # вызов с аргументами, распакованными из списка425[3, 4, 5]426```427428Точно так же словари могут передавать именованные аргументы с помощью оператора `**`:429430```python431>>> def parrot(voltage, state='a stiff', action='voom'):432...     print("-- This parrot wouldn't", action, end=' ')433...     print("if you put", voltage, "volts through it.", end=' ')434...     print("E's", state, "!")435...436>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}437>>> parrot(**d)438-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !439```440441### 4.7.5. Лямбда-выражения442443По многочисленным просьбам в Python были добавлены некоторые возможности, обычно встречающиеся в функциональных языках программирования, таких как Lisp. С помощью ключевого слова [`lambda`](https://python-all.ru/3.1/reference/expressions.html#lambda) можно создавать небольшие анонимные функции. Вот функция, возвращающая сумму двух аргументов: `lambda a, b: a+b`. Лямбда-выражения можно использовать везде, где требуются объекты-функции. Синтаксически они ограничены одним выражением. Семантически они представляют собой просто синтаксический сахар для обычного определения функции. Как и вложенные определения функций, лямбда-выражения могут ссылаться на переменные из объемлющей области видимости:444445```python446>>> def make_incrementor(n):447...     return lambda x: x + n448...449>>> f = make_incrementor(42)450>>> f(0)45142452>>> f(1)45343454```455456### 4.7.6. Строки документации457458Вот некоторые соглашения о содержании и форматировании строк документации.459460Первая строка всегда должна быть кратким и сжатым описанием назначения объекта. Для краткости в ней не следует явно указывать имя или тип объекта, так как они доступны другими способами (кроме случая, когда имя оказывается глаголом, описывающим действие функции). Эта строка должна начинаться с заглавной буквы и заканчиваться точкой.461462Если в строке документации есть несколько строк, вторая строка должна быть пустой, чтобы визуально отделить краткое описание от остальной части. Последующие строки должны быть одним или несколькими абзацами, описывающими соглашения о вызове объекта, его побочные эффекты и т.д.463464Парсер Python не удаляет отступы из многострочных строковых литералов в Python, поэтому инструменты, обрабатывающие документацию, должны при необходимости удалять отступы. Это делается по следующему соглашению. Первая непустая строка *после* первой строки строки определяет величину отступа для всей строки документации. (Первую строку мы не можем использовать, так как она обычно примыкает к открывающим кавычкам строки, и её отступ не очевиден в строковом литерале.) Затем пробельные символы, «эквивалентные» этому отступу, удаляются из начала всех строк строки. Строки с меньшим отступом встречаться не должны, но если они встречаются, все их начальные пробелы должны быть удалены. Эквивалентность пробелов следует проверять после замены табуляции (обычно на 8 пробелов).465466Вот пример многострочной строки документации:467468```python469>>> def my_function():470...     """Ничего не делает, но документирует.471...472...     Нет, правда, он ничего не делает.473...     """474...     pass475...476>>> print(my_function.__doc__)477Do nothing, but document it.478479    No, really, it doesn't do anything.480```481482## 4.8. Интермеццо: стиль кодирования483484Теперь, когда вы собираетесь писать более длинные и сложные программы на Python, самое время поговорить о *стиле кодирования*. Большинство языков можно писать (или, точнее, *форматировать*) в разных стилях; одни стили более читаемы, чем другие. Облегчить чтение вашего кода другим – всегда хорошая идея, и принятие хорошего стиля кодирования в этом очень помогает.485486Для Python [**PEP 8**](https://python-all.ru/3.1/tutorial/controlflow.html) стал руководством по стилю, которому следуют большинство проектов; он продвигает очень читаемый и приятный глазу стиль кодирования. Каждый разработчик Python должен прочитать его в какой-то момент; вот наиболее важные моменты, извлечённые для вас:487488- Используйте отступы в 4 пробела и никаких табуляций.489490  4 пробела – хороший компромисс между маленьким отступом (позволяет большую глубину вложенности) и большим отступом (легче читать). Табуляция вносит путаницу, и её лучше избегать.491- Переносите строки так, чтобы они не превышали 79 символов.492493  Это помогает пользователям с маленькими экранами и позволяет размещать несколько файлов с кодом рядом на больших экранах.494- Используйте пустые строки для разделения функций и классов, а также крупных блоков кода внутри функций.495- По возможности размещайте комментарии на отдельных строках.496- Используйте строки документации.497- Используйте пробелы вокруг операторов и после запятых, но не непосредственно внутри скобочных конструкций: `a = f(1, 2) + g(3, 4)`.498- Именуйте классы и функции единообразно; принято использовать `CamelCase` для классов и `lower_case_with_underscores` для функций и методов. Всегда используйте `self` в качестве имени для первого аргумента метода (см. [*Первый взгляд на классы*](https://python-all.ru/3.1/tutorial/classes.html#tut-firstclasses) для получения дополнительной информации о классах и методах).499- Не используйте экзотические кодировки, если ваш код предназначен для использования в международной среде. Стандартная кодировка Python, UTF-8 или даже обычный ASCII в любом случае подходят лучше всего.500- Аналогично, не используйте символы, не входящие в ASCII, в идентификаторах, если есть хоть малейшая вероятность, что код будут читать или сопровождать люди, говорящие на другом языке.501502Сноски503504| [\[1\]](https://python-all.ru/3.1/tutorial/controlflow.html#id1) | На самом деле, *вызов по ссылке на объект* было бы лучшим описанием, поскольку если передаётся изменяемый объект, вызывающий увидит любые изменения, вносимые вызываемым (например, элементы, добавленные в список). |505| --- | --- |506