1
0
mirror of https://github.com/satwikkansal/wtfpython synced 2024-12-22 12:50:23 +01:00

Translate Needles in a haystack example

This commit is contained in:
Vadim Nifadev 2024-04-23 12:32:24 +03:00
parent 0d28d47f08
commit 2043112a9d

View File

@ -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`) не является изменением значения.
* Знание этих тонкостей может сэкономить вам часы отладки в долгосрочной перспективе.
---