Список полезных фрагментов Python.

Python — один из самых популярных и востребованных языков программирования в мире. Это по многим причинам:

  • Легко обучаема
  • Универсальный
  • Огромный выбор модулей и библиотек

Я почти ежедневно использую Python. Попутно я подобрала несколько умных, но полезных трюков и советов, которые наверняка заставят вас хорошенько подумать.

Здесь я поделился 5++ из них 😉

1. Осторожнее с цепными операциями

>>> (False == False) in [False] # makes sense
False
>>> False == (False in [False]) # makes sense
False
>>> False == False in [False] # now what?

Первые два имеют смысл, но что, по-вашему, напечатает третий? Даже если вы отдадите «==» приоритет над «in» или сделаете иначе, в обоих случаях вы получите ответ «False», но это неправильно. Почему?

Это связано с тем, что все операции сравнения в Python имеют одинаковый приоритет, когда они объединены в цепочку (то есть когда вы не используете скобки). Что это означает:

Если a, b, c, …, y, z — выражения, а op1, op2, …, opN — операторы сравнения, то (a op1 b op2 c … y opN z) эквивалентно (a op1 b ) и (b op2 c) и … (y opN z).

Таким образом, третье выражение будет оценено как (False == False) and (False in [False]), что окажется True.

Чтобы узнать больше об этом, перейдите по этой ССЫЛКЕ

2. Утечка переменных цикла

for x in range(7):
    if x == 6:
        print(x)
print(x)

Первый оператор печати кажется довольно простым, не так ли? Он просто напечатает 6 из-за поставленного нами условия if. Но как насчет второго оператора печати?

Если он не выдает ошибку, поскольку переменная «x» теперь выходит за рамки, а x никогда не определялся вне области действия цикла for.

Но на самом деле он снова напечатает «6». Это связано с тем, что в Python циклы for используют область, в которой они существуют, и оставляют свою определенную переменную цикла позади.

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

Проще говоря, в Python нет блоков, в отличие от C/C++ или Java. Единственная единица области видимости в Python — это функция. Если вы объявляете переменную в функции, вы можете использовать ее где угодно внутри нее без каких-либо проблем.

Если вы энтузиаст JavaScript, для вас есть кое-что еще😉

Если вы переведете этот код в javascript, он сначала напечатает «6», а затем «7». Причина этого в том, как мы итерируем в python. Набор значений, которые будет принимать переменная x, явно определяется перед запуском цикла for. Это не относится к javascript.

3. Изменяемые аргументы по умолчанию

def func(default_arg=[]):
    default_arg.append("python")
    return default_arg
print(func())
print(func())
print(func())

Как вы думаете, что будет на выходе приведенного выше кода? Очень интуитивно кажется, что мы получим:

['python']
['python']
['python']

Но опять же это не так. Аргумент по умолчанию — это изменяемый объект, такой как «список», в нашем случае Python создает его, когда вы определяете функцию, а не каждый раз, когда вы ее вызываете.

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

Таким образом, правильный вывод будет:

['Python'] 
['python', 'python'] 
['python', 'python', 'python']

ПРИМЕЧАНИЕ. Когда мы явно передаем [] в «func» в качестве аргумента, значение по умолчанию для переменной default_arg не будет использоваться, поэтому функция будет возвращаться так, как ожидалось, т. е. ['python'] ['python'] [ 'питон'].

Чтобы узнать больше об изменяемых/неизменяемых объектах в Python, перейдите по этой ССЫЛКЕ.

4. Продолжайте пробовать

def func():
    try:
        return 'from_try'
    finally:
        return 'from_finally'
print(func()) #What will get printed?

Если вы внимательно посмотрите на приведенный выше код, вы увидите оператор return внутри блока try. В соответствии с этим он должен вывести «from_try» в качестве вывода.

Но в Python docs указано:

Когда оператор return, break или continue выполняется в наборе try оператора try…finally, предложение finally также казнен «на выходе».

Возвращаемое значение функции определяется последним выполненным оператором возврата. Поскольку предложение finally выполняется всегда, оператор return, выполненный в предложении finally, всегда будет выполняться последним. Следовательно, правильный вывод будет from_finally.

5. Что не так с «есть»

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
>>> ?

Так как первое верно, то и второе должно быть правдой. не так ли?

Ну нет. Правильный ответ: Неверно. Причина в том, что 256 — это существующий объект, а 257 — нет.

Под этим утверждением я подразумеваю следующее: когда вы запускаете python, будут выделены числа от -5 до 256. Эти числа часто используются, поэтому имеет смысл просто иметь их наготове.

Согласно документам python:

В текущей реализации хранится массив целочисленных объектов для всех целых чисел от -5 до 256. Когда вы создаете целое число в этом диапазоне, вы просто возвращаете ссылку на существующий объект.

Вот почему, когда вы присваиваете a и b 257, генерируются две разные ссылки, и оператор «is» проверяет, относятся ли оба операнда к одному и тому же объекту, что в данном случае неверно.

Итак, это были 5 крутых особенностей Python. Надеюсь, они вам понравились и, надеюсь, вы узнали что-то новое. Но так как заголовок содержит «Пять++ фрагментов python», у меня есть для вас еще один фрагмент, который, я уверен, вам понравится 👇

5++. Смайлики на Python 🐍

Знаете ли вы, что можете использовать эмодзи в своем коде Python?

Да, это правда"

>>import emoji
>>print(emoji.emojize('Python is amazing:thumbs_up:'))
Python is amazing👍

Вот и вся ваша шпаргалка по смайликам. Иди и попробуй…

Первоначально опубликовано на https://apoorvtyagi.tech.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.