From 86140390adcaece9fd84ece152af4c8a0701557f Mon Sep 17 00:00:00 2001 From: Vadim Nifadev <36514612+nifadyev@users.noreply.github.com> Date: Thu, 25 Jan 2024 17:01:26 +0300 Subject: [PATCH] Translate First things first! example to russian --- translations/README-ru.md | 127 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/translations/README-ru.md b/translations/README-ru.md index 9f50533..325980a 100644 --- a/translations/README-ru.md +++ b/translations/README-ru.md @@ -21,6 +21,10 @@ PS: Если вы уже читали **wtfpython** раньше, с измен - [Содержание](#содержание) - [Структура примера](#структура-примера) - [Применение](#применение) +- [👀 Примеры](#-примеры) + - [Секция: Напряги мозги!](#секция-напряги-мозги) + - [▶ Первым делом!](#-первым-делом) + - [💡 Обьяснение](#-обьяснение) # Структура примера @@ -78,3 +82,126 @@ PS: Вы также можете читать WTFPython в командной с pip install wtfpython -U wtfpython ``` + +# 👀 Примеры + +## Секция: Напряги мозги! + +### ▶ Первым делом! + + + + +По какой-то причине "моржовый оператор" (англ. walrus) `:=` в Python 3.8 стал довольно популярным. Давайте проверим его, + +1\. + +```py +# Python version 3.8+ + +>>> a = "wtf_walrus" +>>> a +'wtf_walrus' + +>>> a := "wtf_walrus" +File "", line 1 + a := "wtf_walrus" + ^ +SyntaxError: invalid syntax + +>>> (a := "wtf_walrus") # А этот код работает +'wtf_walrus' +>>> a +'wtf_walrus' +``` + +2 \. + +```py +# Python version 3.8+ + +>>> a = 6, 9 +>>> a +(6, 9) + +>>> (a := 6, 9) +(6, 9) +>>> a +6 + +>>> a, b = 6, 9 # Типичная распаковка +>>> a, b +(6, 9) +>>> (a, b = 16, 19) # Упс + File "", line 1 + (a, b = 16, 19) + ^ +SyntaxError: invalid syntax + +>>> (a, b := 16, 19) # На выводе получаем странный кортеж из 3 элементов +(6, 16, 19) + +>>> a # Значение переменной остается неизменной? +6 + +>>> b +16 +``` + +#### 💡 Обьяснение + +**Быстрый разбор что такое "моржовый оператор"** + +"Моржовый оператор" (`:=`) был представлен в Python 3.8, может быть полезен в ситуациях, когда вы хотите присвоить значения переменным в выражении. + +```py +def some_func(): + # Предположим, что здесь выполняются требовательные к ресурсам вычисления + # time.sleep(1000) + return 5 + +# Поэтому вместо, +if some_func(): + print(some_func()) # Плохая практика, поскольку вычисления происходят дважды. + +# Или +a = some_func() +if a: + print(a) + +# Можно лаконично написать +if a := some_func(): + print(a) +``` + +**Вывод (> 3.8):** + +```py +5 +5 +5 +``` + +Использование `:=` сэкономило одну строку кода и неявно предотвратило вызов `some_func` дважды. + +- "выражение присваивания", не обернутое в скобки, иначе говоря использование моржового оператора, ограничено на верхнем уровне, отсюда `SyntaxError` в выражении `a := "wtf_walrus"` в первом фрагменте. После оборачивания в скобки, `a` было присвоено значение, как и ожидалось. + +- В то же время оборачивание скобками выражения, содержащего оператор `=`, не допускается. Отсюда синтаксическая ошибка в `(a, b = 6, 9)`. + +- Синтаксис моржового оператора имеет вид `NAME:= expr`, где `NAME` - допустимый идентификатор, а `expr` - допустимое выражение. Следовательно, упаковка и распаковка итерируемых объектов не поддерживается, что означает, + + - `(a := 6, 9)` эквивалентно `((a := 6), 9)` и в конечном итоге `(a, 9)` (где значение `a` равно `6`) + + ```py + >>> (a := 6, 9) == ((a := 6), 9) + True + >>> x = (a := 696, 9) + >>> x + (696, 9) + >>> x[0] is a # Оба ссылаются на одну и ту же ячейку памяти + True + ``` + + - Аналогично, `(a, b := 16, 19)` эквивалентно `(a, (b := 16), 19)`, которое есть не что иное, как кортеж из 3 элементов. + +---