Рубрики
Без рубрики

3 распространенных ошибки, которые делают Newbies Python

Некоторые распространенные узоры, которые могут использовать небольшое рефакторирование, которое я видел с новыми учениками Python. Помечено Python, начинающим.

Последние выходные я уставился на наставника наставничества на упражнения на трассе Python. Я не был уверен, что ожидать, но за последнюю неделю я наследую около 50 человек, помогая им получить свои решения от «тестов, проходящих» на «тесты, проходящие, читаемые, и Pythonic. ” Я зацепил. Это общий взрыв. Я собираюсь написать пост специально на этом опыте. Это не этот пост. Этот пост – говорить о трех наиболее распространенных ошибках, которые я видел за последнюю неделю и некоторые возможные альтернативы, которые могут быть лучше! Итак, давайте начнем обратный отсчет!

1. Глубокое гнездование, если Заявления или петли

# Calculating whether or not 'year' is a leap year

if year % 4 == 0:
    if year % 100 == 0:
        if year % 400 == 0:
            return True
        else:
            return False
    else:
        return True
else:
    return False

Много раз я вытащил линию из Дзэн Питона Чтобы отказаться от моих отзывов к «предписанию» (не путать с мани). Когда я вижу эту проблему, я всегда веду с

Квартира лучше, чем вложенный.

Если вы посмотрите на свой код с незаполненным глазами, глядя на фигуры и не читаете слова, и вы видите кучу стрелок, выходящих снова и снова:

\
 \
  \
   \
    \
    /
   /
  /
  \
   \
    \
     \
     /
    /
   /
  /
 /
/

Это не Определенно Плохая вещь, но это «кодовый запах» или нехватка ощущения, что что-то может быть повторно.

Итак, что вы можете сделать вместо гнезда? Есть пара вещей, чтобы попробовать. Первый инверсирует вашу логику и использовать «ранние возвращения», чтобы очистить небольшие кусочки пространства решения по одному за раз.

if year % 400 == 0:
    return True
if year % 100 == 0:
    return False
if year % 4 == 0:
    return True
return False

Если число делится на 400, то мы немедленно вернемся. В противном случае, для остальной части нашего кода, мы можем знать, что в этом году определенно не делится на 400. Итак, в этот момент любой другой год, который делится на 100, не является скачным годом. Таким образом, мы сочиняем этот слой лука, вернув ложь.

После этого мы можем знать, что Год определенно не множественный 400 или 100, а остаток кода следует за тем же рисунком.

Другим способом избежать вложенности является использование «логических операторов:» и или, а не Отказ Мы можем комбинировать Если Заявления и, таким образом, спасают себя слой вложенности!

if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
    return True
else:
    return False

Конечно, это приведет нас к нашему второму предмету …

2. Возвращая логические новости от если заявления

Мы начнем с нашего последнего примера сверху:

if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0):
    return True
else:
    return False

В любое время вы находите писать:

if something:
    return True
else:
    return False

Вы должны помнить, что пункт Если Заявление сама логическое!

>>> year = 2000
>>> year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
True

Итак, почему бы не вводить немного меньше и вернуть результат логической операции напрямую?

return (year % 4 == 0 and (year % 100 != 0 or year % 400 == 0))

Упрашивается, на данный момент линия может быть немного долго, но теперь код немного менее избыточна!

3. Списки как молотки – не все – гвоздь

Вот два возможных способа, которые это может появиться:

some_numbers = [1, 2, 5, 7, 8, ...]
other_numbers = [1, 3, 6, 7, 9, ...]
# Let's try to combine these two without duplicates
for number in other_numbers:
    if number not in some_numbers:
        some_numbers.append(number)

Или:

data = [["apple", 4], ["banana", 2], ["grape", 14]]
# What fruits do we have?
for item in data:
    print(item[0])
# => "apple" "banana" "grape"
# How many grapes do we have?
for item in data:
    if item[0] == "grape":
        print(item[1])
# => 14

В первом случае вы пытаетесь отслеживать некоторые группы предметов, и вы хотите объединить их без дубликатов. Это Идеал кандидат на Установить Отказ Устанавливает потенциальную отслеживание своих предметов (хотя и не порядок, поэтому не используйте набор, если заказ важен). Вы можете объявить их со встроенным Установить () Функция или с скобами скобами ( {} ).

some_numbers = {1, 2, 5, 7, 8}
other_numbers = {1, 3, 6, 7, 9}
# Sets use the 'binary or' operator to do "unions"
# which is where they take all of the unique elements
some_numbers | other_numbers
# => {1, 2, 3, 5, 6, 7, 8, 9}

# You can even add single items in!
some_numbers.add(10)
# => {1, 2, 5, 7, 8, 10}

# But adding a duplicate doesn't change anything
some_numbers.add(1)
# => {1, 2, 5, 7, 8, 10}

Во втором случае, опять же, порядок, вероятно, не критичен. Вы хотите отслеживать некоторые данные на «этикетке» или что-то, но сможете держать их всех вместе и перечислить их по мере необходимости. На этот раз вы, вероятно, ищете Дикт Отказ Вы можете создавать теты с либо Dict () Встроенная функция или, опять же, сковороды ( {} ). На этот раз, однако, вы разделяете этикетки (ключи) и значения с толстой кишкой.

fruits = {
    "apples": 4,
    "bananas": 2,
    "grapes": 14,
}

Вы можете перечислить все клавиши (или значения!).

list(fruits.keys())
# => ["apples", "bananas", "grapes"]
list(fruits.values())
# => [4, 2, 14]

# Or both!
list(fruits.items())
# => [("apples", 4), ("bananas", 2), ("grapes", 14)]

И вы можете спросить это о (или дать ему новое значение для) конкретных ключей.

# How many grapes are there?
fruits["grapes"]
# => 14

# Not anymore.  I ate some.
fruits["grapes"] = 0

fruits["grapes"]
# => 0

Используя список, циклы вашего алгоритма через каждый элемент, чтобы найти правильный. обдумывать S построен, чтобы иметь очень быстрые поиски, поэтому, даже если ваш Дикт Является ли Bazillion Fruits долго, нахождение Виноград все еще очень быстро – и легко напечатать! Нет петлей!

Призыв к действию

Упражнения нужны наставники! Если вы думаете, что вы будете хорошим наставником (или даже приличным наставником, просто на легких упражнениях), регистрация на Их наставник регистрации страницы Отказ Прямо сейчас, Rust, Golang и Elixir особенно завален и нуждается в Ваш помощь!

Оригинал: “https://dev.to/rpalo/3-common-mistakes-that-python-newbies-make-4da7”