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

Совершенно новое выражение назначения Python 3.8

Python 3.8 приходит и не удивительно, что он поставляется с сумкой новых функций. В этом посте я бы хотел … Теги с Python, учебник.

Python 3.8 идет и не удивительно, что он поставляется с Сумка новых функций Отказ В этом посте я хотел бы представить только то, что я действительно ждал: выражения присваивания!

Эта проблема

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

Давайте возьмем этот кусок кода

def f(s):
  result = s
  # ... do some stuff
  return result

def g():
  return True # for the sake of the example

t=input()
if f(t) and g():
  p = f(t)
  # do something with p

Здесь мы можем определить как минимум две проблемы:

  • У нас есть дублирование кода, как мы написали F (ы) дважды, в то время как это часть того же логической ветки
  • Что очевидно, но это еще хуже, мы не просто пишу, но мы называем f (ы) дважды. Даже если мы предположим, что с тем же входом у нас всегда будет одинаковые выходы, поэтому функция является детерминированной и может быть даже чистой, мы можем столкнуться с некоторыми проблемами. Что если это запускает дорогие расчеты? Ну, тогда мы делаем это дважды, что может иметь плохие последствия.

Есть решение, мы можем позвонить F (S) один раз перед Если Блок и сохранить результат в переменной!

def f(s):
  result = s
  # ... do some stuff
  return result

def g():
  return True # for the sake of the example

t=input()
p = f(t)
if p and g():
  # do something with p

Это лучше? Смотря как.

С одной стороны, вы введите немного меньше, а если расчеты в F (ы) Выходятся дорого, вы устранили, что дорогой звонок функции, это здорово!

С другой стороны, теперь у вас есть переменная, которая доступна за пределами Если Блок, где вы ориентируетесь, хотел его использовать. Это может быть небезопасно. Представьте, что вы создаете вашу переменную в качестве ссылки на что-то, что требует длинной прикованной командой для получения.

Но прежде чем использовать его, вы хотите сделать проверку действительности.

Если вы создаете переменную за пределами блока IF, поэтому перед тем, как сделать проверку достоверности, вы должны помнить, что если вы хотите использовать эту переменную позже в этой функции (что, вероятно, будет плохие практикой) Вы должны сделать проверку достоверности еще раз.

Python 3.8 и PEP 572 Предоставляет нам окончательное решение, которое вы, вероятно, всегда хотели за такие вопросы.

Вы можете создать переменную в Если выражение, область которого только в целом, если блок. Разве это не круто?! Вы можете делать такие вещи, просто чтобы продолжить с предыдущим примером:

def f(s):
  result = s
  # ...
  return result

def g():
  return True # for the sake of the example

t=input()
if p:=f(t) and g():
  # do something with p
  print(p)

По «цельному если блок», я имел в виду, что еще также включен. Чтобы обобщить, можно сказать, что объем переменной, назначенной в выражении назначения, является просто текущим объемом. Если это, то, то, тогда, если, если это вся эта функция, это вся функция.

То, что я тоже очень люблю, так это то, что теперь мы можем упростить понятные списки. Посмотрите на этот пример:

inputs = [1, 2, 3, 56, 78, 42, 36, 54, 35, 99]
numbers_and_int_square_roots = {k: int(math.sqrt(k)) for k in inputs if int(math.sqrt(k)) == math.sqrt(k)}
print(*numbers_and_int_square_roots.items())

Итак, мы принимаем список номеров, и мы хотим сохранить те, которые являются квадратами целых чисел, и мы также хотим сохранить свои квадратные и не в квадратные ценности. Мы должны рассчитать квадратные корни дважды!

Только если бы я мог сэкономить квадратный корень в этом выражении генератора! Ло и вот, теперь я могу:

inputs = [1, 2, 3, 56, 78, 42, 36, 54, 35, 99]
numbers_and_int_square_roots = {k: v for k in inputs if (v:=int(math.sqrt(k))) == math.sqrt(k)}
print(*numbers_and_int_square_roots.items())

Это просто очень круто для меня! Меньше набрав, меньше расчетов, более быстрое время выполнения!

Что вы думаете?

Заключение

Python 3.8 вводит Выражения присваивания Что позволяет нам создавать новые переменные в местах, где мы всегда хотели, но никогда не могли бы в использовании. Вероятно, лучший способ использовать эту новую функцию – создать новые переменные в Если И используйте его в объеме этого блока.

Для получения дополнительной информации вы можете прочитать спецификации здесь Отказ

Как онлайн-переводчик, на данный момент вы можете использовать Это Отказ

И если вы хотите установить Python3.8 локально, вы можете обратиться к этой статье

Счастливое кодирование!

Эта статья была первоначально опубликована на моем блог . Если вы заинтересованы в получении моих последних статей, пожалуйста Зарегистрируйтесь на мою рассылку а также Подпишись на меня в Твиттере .

Оригинал: “https://dev.to/sandordargo/the-brand-new-assignment-expression-of-python-3-8-4ida”