mirror of
https://github.com/satwikkansal/wtfpython
synced 2024-11-21 18:54:20 +01:00
Translate Needles in a haystack example
This commit is contained in:
parent
0d28d47f08
commit
2043112a9d
176
translations/README-ru.md
vendored
176
translations/README-ru.md
vendored
@ -2569,3 +2569,179 @@ def get_middle(some_list):
|
||||
- Дополнительную информацию можно найти в [документации](https://docs.python.org/3/library/functions.html#round) функции `round` или на [StackOverflow](https://stackoverflow.com/questions/10825926/python-3-x-rounding-behavior).
|
||||
|
||||
---
|
||||
|
||||
|
||||
### ▶ Иголки в стоге сена *
|
||||
|
||||
<!-- Example ID: 52a199b1-989a-4b28-8910-dff562cebba9 --->
|
||||
|
||||
Я не встречал ни одного питониста на данный момент, который не встречался с одним из следующих сценариев,
|
||||
|
||||
1\.
|
||||
|
||||
```py
|
||||
x, y = (0, 1) if True else None, None
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
|
||||
```py
|
||||
>>> x, y # ожидается (0, 1)
|
||||
((0, 1), None)
|
||||
```
|
||||
|
||||
2\.
|
||||
|
||||
```py
|
||||
t = ('one', 'two')
|
||||
for i in t:
|
||||
print(i)
|
||||
|
||||
t = ('one')
|
||||
for i in t:
|
||||
print(i)
|
||||
|
||||
t = ()
|
||||
print(t)
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
|
||||
```py
|
||||
one
|
||||
two
|
||||
o
|
||||
n
|
||||
e
|
||||
tuple()
|
||||
```
|
||||
|
||||
3\.
|
||||
|
||||
```py
|
||||
ten_words_list = [
|
||||
"some",
|
||||
"very",
|
||||
"big",
|
||||
"list",
|
||||
"that"
|
||||
"consists",
|
||||
"of",
|
||||
"exactly",
|
||||
"ten",
|
||||
"words"
|
||||
]
|
||||
```
|
||||
|
||||
**Результат**
|
||||
|
||||
```py
|
||||
>>> len(ten_words_list)
|
||||
9
|
||||
```
|
||||
|
||||
4\. Недостаточно твердое утверждение
|
||||
|
||||
```py
|
||||
a = "python"
|
||||
b = "javascript"
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
|
||||
```py
|
||||
# assert выражение с сообщением об ошиб
|
||||
>>> assert(a == b, "Both languages are different")
|
||||
# Исключение AssertionError не возникло
|
||||
```
|
||||
|
||||
5\.
|
||||
|
||||
```py
|
||||
some_list = [1, 2, 3]
|
||||
some_dict = {
|
||||
"key_1": 1,
|
||||
"key_2": 2,
|
||||
"key_3": 3
|
||||
}
|
||||
|
||||
some_list = some_list.append(4)
|
||||
some_dict = some_dict.update({"key_4": 4})
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
|
||||
```py
|
||||
>>> print(some_list)
|
||||
None
|
||||
>>> print(some_dict)
|
||||
None
|
||||
```
|
||||
|
||||
6\.
|
||||
|
||||
```py
|
||||
def some_recursive_func(a):
|
||||
if a[0] == 0:
|
||||
return
|
||||
a[0] -= 1
|
||||
some_recursive_func(a)
|
||||
return a
|
||||
|
||||
def similar_recursive_func(a):
|
||||
if a == 0:
|
||||
return a
|
||||
a -= 1
|
||||
similar_recursive_func(a)
|
||||
return a
|
||||
```
|
||||
|
||||
**Результат:**
|
||||
|
||||
```py
|
||||
>>> some_recursive_func([5, 0])
|
||||
[0, 0]
|
||||
>>> similar_recursive_func(5)
|
||||
4
|
||||
```
|
||||
|
||||
#### 💡 Объяснение:
|
||||
|
||||
* Для 1 примера правильным выражением для ожидаемого поведения является `x, y = (0, 1) if True else (None, None)`.
|
||||
|
||||
* Для 2 примера правильным выражением для ожидаемого поведения будет `t = ('one',)` или `t = 'one',` (пропущена запятая), иначе интерпретатор рассматривает `t` как `str` и перебирает его символ за символом.
|
||||
|
||||
* `()` - специальное выражение, обозначающая пустой `tuple`.
|
||||
|
||||
* В 3 примере, как вы, возможно, уже поняли, пропущена запятая после 5-го элемента (`"that"`) в списке. Таким образом, неявная конкатенация строковых литералов,
|
||||
|
||||
```py
|
||||
>>> ten_words_list
|
||||
['some', 'very', 'big', 'list', 'thatconsists', 'of', 'exactly', 'ten', 'words']
|
||||
```
|
||||
|
||||
* В 4-ом фрагменте не возникло `AssertionError`, потому что вместо "проверки" отдельного выражения `a == b`, мы "проверяем" весь кортеж. Следующий фрагмент прояснит ситуацию,
|
||||
|
||||
```py
|
||||
>>> a = "python"
|
||||
>>> b = "javascript"
|
||||
>>> assert a == b
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in <module>
|
||||
AssertionError
|
||||
|
||||
>>> assert (a == b, "Values are not equal")
|
||||
<stdin>:1: SyntaxWarning: assertion is always true, perhaps remove parentheses?
|
||||
|
||||
>>> assert a == b, "Values are not equal"
|
||||
Traceback (most recent call last):
|
||||
File "<stdin>", line 1, in <module>
|
||||
AssertionError: Values are not equal
|
||||
```
|
||||
* Что касается пятого фрагмента, то большинство методов, изменяющих элементы последовательности/маппингов, такие как `list.append`, `dict.update`, `list.sort` и т. д., изменяют объекты на месте и возвращают `None`. Это делается для того, чтобы повысить производительность, избегая создания копии объекта, если операция может быть выполнена на месте (подробнее в [документации](https://docs.python.org/3/faq/design.html#why-doesn-t-list-sort-return-the-sorted-list)).
|
||||
|
||||
* Последнее должно быть достаточно очевидным, изменяемый объект (например, `list`) может быть изменен в функции, а переназначение неизменяемого (`a -= 1`) не является изменением значения.
|
||||
|
||||
* Знание этих тонкостей может сэкономить вам часы отладки в долгосрочной перспективе.
|
||||
|
||||
---
|
||||
|
Loading…
Reference in New Issue
Block a user