Forwarded from Python RU
Что дадут эти вызовы функции в консоли?
Anonymous Quiz
14%
0 и 0
12%
Zero Division Error и Zero Division Error
57%
0 и Zero Division Error
7%
Zero Division Error и 0
10%
Посмотреть ответ
Каким будет вывод этого кода?
Anonymous Quiz
52%
[0]
33%
[1]
6%
[1, 0]
4%
[0, 1]
4%
Посмотреть ответ
Please open Telegram to view this post
VIEW IN TELEGRAM
Каким будет вывод этого кода?
Anonymous Quiz
58%
120
3%
Никакого вывода не будет
7%
Ошибка: в модуле math нет метода factorial
26%
Ошибка: нужно было написать print(factorial(5))
6%
Посмотреть ответ
Каким будет вывод этого кода?
Anonymous Quiz
23%
['a', 'b', 'c', 'd']
14%
['abcd']
42%
[['a'], ['b'], ['c'], ['d']]
11%
Ни один вариант не подходит
10%
Посмотреть ответ
Please open Telegram to view this post
VIEW IN TELEGRAM
Каким будет результат выполнения кода?
Anonymous Quiz
33%
True
40%
False
3%
None
15%
Ошибка
9%
Узнать ответ
Каким будет результат выполнения этого кода?
Anonymous Quiz
10%
[[[0]], [[[0]], [1]], [[[0]], [[[0]], [1]], [2]]]
25%
[[0], [[0], 1], [[0], [[0], 1], 2]]
22%
[0, None, 1, None, 2, None]
14%
[[[0]], [[[0]], [1]], [[[0]], [[[0]], [1]], [2]]]
29%
Посмотреть ответ
Какой оператор перегружается функцией __invert__()?
Anonymous Quiz
29%
!
35%
~
9%
^
5%
-
22%
Посмотреть ответ
Что выведет код?
Anonymous Quiz
43%
[[0, 1, 0], [0, 0, 0], [0, 0, 0]]
32%
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
11%
[[0, 0, 0], [1, 0, 0], [0, 0, 0]]
14%
Error
This media is not supported in your browser
VIEW IN TELEGRAM
❌Python: Никогда не делай так!!!
НИКОГДА НЕ ИСПОЛЬЗУЙ МУТАБЕЛЬНЫЕ ДЕФОЛТЫ: не используй изменяемые объекты (например, списки или словари) как значения по умолчанию в аргументах функции.
Каждый вызов функции будет делить один и тот же объект, и ты получишь «призрачные» данные, которые появляются из ниоткуда. Это одна из самых коварных ловушек Python.
Всегда используй None и создавай новый объект внутри функции. Подписывайся, больше фишек каждый день !
НИКОГДА НЕ ИСПОЛЬЗУЙ МУТАБЕЛЬНЫЕ ДЕФОЛТЫ: не используй изменяемые объекты (например, списки или словари) как значения по умолчанию в аргументах функции.
Каждый вызов функции будет делить один и тот же объект, и ты получишь «призрачные» данные, которые появляются из ниоткуда. Это одна из самых коварных ловушек Python.
Всегда используй None и создавай новый объект внутри функции. Подписывайся, больше фишек каждый день !
Плохо — список живёт между вызовами
def add_item(item, bucket=[]):
bucket.append(item)
return bucket
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2] — неожиданно!
# Правильно
def add_item(item, bucket=None):
if bucket is None:
bucket = []
bucket.append(item)
return bucket
print(add_item(1)) # [1]
print(add_item(2)) # [2]
Вопрос с собеседования
Что выведет этот код и почему?
Попробуй сначала сам ответить, а потом смотри разбор.
Что происходит по шагам:
Переменная a ссылается на список [1, 2, 3].
b = a
Теперь b ссылается на тот же самый список, что и a.
Не копия, а один и тот же объект в памяти.
a += [4, 5]
Важно: для списков += работает как изменение объекта на месте:
это примерно то же самое, что:
a.extend([4, 5])
То есть в существующий список, на который ссылаются и a, и b, добавляются элементы 4 и 5.
Поэтому:
Оба указывают на один изменённый список.
Часть 2. Кортежи
a = (1, 2, 3)
b = a
a += (4, 5)
print(a)
print(b)
Кортежи неизменяемы, и здесь начинается магия.
a = (1, 2, 3)
a ссылается на кортеж (1, 2, 3).
b = a
b ссылается на тот же кортеж (1, 2, 3).
a += (4, 5)
Для кортежей += уже не может менять объект на месте (они immutable).
Поэтому Python делает так:
a = a + (4, 5)
То есть создаётся новый кортеж (1, 2, 3, 4, 5) и переменная a переназначается на него.
b при этом остаётся смотреть на старый кортеж (1, 2, 3).
Поэтому:
print(a) # (1, 2, 3, 4, 5)
print(b) # (1, 2, 3)
В чём хитрость
Для списка a += [4, 5] мутирует объект на месте, и это видно через все переменные, которые на него ссылаются.
Для кортежа a += (4, 5) создаёт новый объект и переназначает только a.
Итого:
Если хочешь, могу ещё один хитрый вопрос разобрать - про изменяемые значения по умолчанию в аргументах функции или про циклы и замыкания.
Что выведет этот код и почему?
a = [1, 2, 3]
b = a
a += [4, 5]
print(a)
print(b)
a = (1, 2, 3)
b = a
a += (4, 5)
print(a)
print(b)
Попробуй сначала сам ответить, а потом смотри разбор.
Часть 1. Списки
a = [1, 2, 3]
b = a
a += [4, 5]
print(a)
print(b)
Что происходит по шагам:
a = [1, 2, 3]
Переменная a ссылается на список [1, 2, 3].
b = a
Теперь b ссылается на тот же самый список, что и a.
Не копия, а один и тот же объект в памяти.
a += [4, 5]
Важно: для списков += работает как изменение объекта на месте:
это примерно то же самое, что:
a.extend([4, 5])
То есть в существующий список, на который ссылаются и a, и b, добавляются элементы 4 и 5.
Поэтому:
print(a) # [1, 2, 3, 4, 5]
print(b) # [1, 2, 3, 4, 5]
Оба указывают на один изменённый список.
Часть 2. Кортежи
a = (1, 2, 3)
b = a
a += (4, 5)
print(a)
print(b)
Кортежи неизменяемы, и здесь начинается магия.
a = (1, 2, 3)
a ссылается на кортеж (1, 2, 3).
b = a
b ссылается на тот же кортеж (1, 2, 3).
a += (4, 5)
Для кортежей += уже не может менять объект на месте (они immutable).
Поэтому Python делает так:
a = a + (4, 5)
То есть создаётся новый кортеж (1, 2, 3, 4, 5) и переменная a переназначается на него.
b при этом остаётся смотреть на старый кортеж (1, 2, 3).
Поэтому:
print(a) # (1, 2, 3, 4, 5)
print(b) # (1, 2, 3)
В чём хитрость
Для списка a += [4, 5] мутирует объект на месте, и это видно через все переменные, которые на него ссылаются.
Для кортежа a += (4, 5) создаёт новый объект и переназначает только a.
Итого:
# Часть со списком:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
# Часть с кортежем:
(1, 2, 3, 4, 5)
(1, 2, 3)
Если хочешь, могу ещё один хитрый вопрос разобрать - про изменяемые значения по умолчанию в аргументах функции или про циклы и замыкания.