Список полезных фрагментов 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. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.