Python вопросы с собеседований
25.6K subscribers
626 photos
54 videos
17 files
505 links
Вопросы с собеседований по Python

@workakkk - админ

@machinelearning_interview - вопросы с собесдований по Ml

@pro_python_code - Python

@data_analysis_ml - анализ данных на Python

@itchannels_telegram - 🔥 главное в ит

РКН: clck.ru/3FmrFd
Download Telegram
🧠 Python-задача с собеседования: найди ошибку

Код должен посчитать количество чисел больше среднего значения в списке.


def count_above_avg(nums, avg=sum(nums)/len(nums)):
count = 0
for n in nums:
if n > avg:
count += 1
return count

data1 = [1, 2, 3, 4, 5]
data2 = [10, 20, 30]

print(count_above_avg(data1))
print(count_above_avg(data2))


Проблема в этой строке:

```python
def count_above_avg(nums, avg=sum(nums)/len(nums)):
```
Здесь используется значение по умолчанию, которое вычисляется один раз — в момент определения функции, а не при каждом её вызове.

Что происходит по шагам:

Когда Python читает определение функции, он сразу считает:

sum(nums)/len(nums)
Но nums в этот момент - это первый переданный список, то есть data1.

Значение avg фиксируется и больше не меняется.

При вызове:

• count_above_avg(data2)
• среднее значение не пересчитывается, используется старое — от data1.

Поэтому логика ломается, функция работает с неверным средним.

📌 Это известная ловушка Python
Значения аргументов по умолчанию вычисляются один раз.
Это та же причина, почему списки и словари в дефолтных параметрах часто приводят к багам.

🛠 Правильное решение
Нужно вычислять среднее внутри функции, а не в параметрах:

```python
def count_above_avg(nums, avg=None):
if avg is None:
avg = sum(nums) / len(nums)
return sum(1 for n in nums if n > avg)
```

Теперь среднее будет считаться заново при каждом вызове.

💡 Главное правило
Никогда не используй вычисляемые или изменяемые объекты как значения по умолчанию:

def f(x, lst=[])
def f(x, avg=sum(x)/len(x))

Используй None и считай внутри функции.
👍106👎1🔥1