Впервые опубликовано в публичном аккаунте WeChat:Время программирования на Python
'
Обновляйте пять холодных знаний каждую среду, добро пожаловать на подписку!
01. Интерактивный оператор "_"
за_
, я думаю, что многие люди очень знакомы с ним.
Трудно назвать переменные, используйте_
;
Слишком ленивы для длинных имен переменных, используйте_
;
Бесполезная переменная мусора, используйте_
;
Мы все знакомы с вышеизложенным, и сегодняшнее введение — это его использование в интерактивном режиме.
>>> 3 + 4
7
>>> _
7
>>> name='ming'
>>> name
'ming'
>>> _
'ming'
Он может вернуть результат последнего запуска.
Однако, если он напечатан функцией печати, он не будет работать.
>>> 3 + 4
7
>>> _
7
>>> print("ming")
ming
>>> _
7
Я сам написал пример и проверил его с помощью__repr__
Выходной контент может быть получен.
Сначала в нашем каталоге пишем файл ming.py. Содержание выглядит следующим образом
# ming.py
class mytest():
def __str__(self):
return "hello"
def __repr__(self):
return "world"
Затем войдите в интерактивную среду в этом каталоге.
>>> import ming
>>> mt=ming.mytest()
>>> mt
world
>>> print(mt)
hello
>>> _
world
Те, кто знает эти два волшебных метода, поймут с первого взгляда.
02. Самый элегантный способ инвертировать строку/список
Обратить последовательность несложно, но как сделать это наиболее элегантно?
Давайте сначала посмотрим, как нормально меняется на противоположное.
Самый простой способ — использовать метод reverse(), который поставляется со списками.
>>> ml = [1,2,3,4,5]
>>> ml.reverse()
>>> ml
[5, 4, 3, 2, 1]
Но если вы имеете дело со строками, реверс ничего не сделает. Вы можете попробовать преобразовать его в список, в обратном порядке, а затем в ул. Ходить вокруг слишком много хлопот, не так ли? Это занимает так много строк кода (последние три строки нельзя объединить в одну строку), что это полностью Pythonic.
mstr1 = 'abc'
ml1 = list(mstr1)
ml1.reverse()
mstr2 = str(ml1)
Существует также немного более сложная версия для строк, которая реализуется пользовательскими рекурсивными функциями.
def my_reverse(str):
if str == "":
return str
else:
return my_reverse(str[1:]) + str[0]
Здесь представьте один из самых элегантных методов инверсии, используя срезы, будь то строка или список, это просто убивает.
>>> mstr = 'abc'
>>> ml = [1,2,3]
>>> mstr[::-1]
'cba'
>>> ml[::-1]
[3, 2, 1]
03. Изменить ограничение рекурсии по умолчанию
Рекурсия упоминалась выше, все знают, что использование рекурсии рискованно, слишком глубокая рекурсия может легко привести к переполнению стека. Если ваша строка слишком длинная и вы ее рекурсивно реверсируете, возникнут проблемы.
Итак, каков предел рекурсии по умолчанию?
>>> import sys
>>> sys.getrecursionlimit()
1000
Можно проверить, конечно, можно настроить количество модификаций, и после выхода оно будет недействительным.
>>> sys.setrecursionlimit(2000)
>>> sys.getrecursionlimit()
2000
04. Одна строка кода для реализации FTP-сервера
Создание FTP или создание сетевой файловой системы — эти методы могут реализовать совместное использование каталогов Linux. Но FTP и сетевые файловые системы слишком мощны, поэтому у них обоих есть некоторые неудобства. Например, если вы хотите быстро поделиться определенной директорией системы Linux со всей командой проекта, но при этом хотите сделать это за одну минуту, что вам делать? Очень просто, используйте SimpleHTTPServer в Python.
SimpleHTTPServer — это модуль, который поставляется с Python 2 и представляет собой веб-сервер Python. Он был объединен с модулем http.server в Python 3. Конкретный пример выглядит следующим образом: если порт не указан, по умолчанию используется порт 8000.
# python2
python -m SimpleHTTPServer 8888
# python3
python3 -m http.server 8888
У SimpleHTTPServer есть функция, если в каталоге, к которому нужно поделиться, есть index.html, то файл index.html будет считаться домашней страницей по умолчанию, если файла index.html нет, то будет отображаться весь список каталогов .
05. Использование else, вызывающее головокружение
Употребление if else можно назвать одним из самых основных грамматических выражений, но сегодня мы говорим не об этом, мы должны говорить о чем-то другом.
if else уже давно прогнил, но может быть много людей, которые никогда не видели использования for else и пытаются еще. Почему я говорю, что это вызвало у меня головокружение, потому что это не так просто, как если бы еще, это черно-белое, и мозг часто думает об этом, прежде чем он сможет отреагировать на то, как идет код. Во всяком случае, я такой.
Давайте сначала поговорим об этом, иначе
def check_item(source_list, target):
for item in source_list:
if item == target:
print("Exists!")
break
else:
print("Does not exist")
Прежде чем смотреть вниз, можно подумать, какие обстоятельства еще пойдут. Шлейф разорван или нет?
Приведите несколько примеров для вашего опыта.
check_item(["apple", "huawei", "oppo"], "oppo")
# Exists!
check_item(["apple", "huawei", "oppo"], "vivo")
# Does not exist
Видно, что программа, которая не сломана, нормально пройдет процесс else.
Посмотрим еще раз, попробуем другое использование.
def test_try_else(attr1 = None):
try:
if attr1:
pass
else:
raise
except:
print("Exception occurred...")
else:
print("No Exception occurred...")
Так же несколько примеров. Когда параметры не передаются, генерируется исключение.
test_try_else()
# Exception occurred...
test_try_else("ming")
# No Exception occurred...
Видно, что если в try нет блока кода и не выброшено исключение, то else пойдет нормально.
Подводя итог, for else это то же самое, что и try else.Пока код работает нормально, не прерываясь и не вызывая исключения, вы можете использовать else.
06. Количество пустых строк
Найдите количество вхождений подсимвола (строки) в строку. Используя функцию count() в Python, это можно сделать легко.
Например, следующие общие примеры
>>> "aabb".count("a")
2
>>> "aabb".count("b")
2
>>> "aabb".count("ab")
1
Но если вы используете пустую строку, вы можете не ожидать такого результата.
>>> "aabb".count("")
5
Я не смею делать поспешных выводов.
Из этого я также вывел другую идею и экспериментировал. Я не знаю, что за существование пустая строка.Учитывается ли "пробел" между буквами?
>>> "" in ""
True
>>> "" in "ab"
True
Если вам интересно, вы можете посмотреть реализацию исходного кода CPython.
07. От отрицательного к положительному
Мы общаемся с начальной школы负数
это понятие. понял负负得正
, это то же самое, что и в мире боевых искусств以毒功毒
, чем-то похож.
Как язык высокого уровня, Python написан в соответствии с логикой человеческого мышления, которая также включает负负得正
эта мысль.
>>> 5-3
2
>>> 5--3
8
>>> 5+-3
2
>>> 5++3
8
>>> 5---3
2
08. Сравнение чисел и строк
В Python2 числа можно сравнивать напрямую со строками. В результате числа всегда меньше строк.
>>> 100000000 < ""
True
>>> 100000000 < "ming"
True
Но в Python3 это не работает.
>>> 100000000 < ""
TypeError: '<' not supported between instances of 'int' and 'str'
09. Утечка локальной переменной в цикле
В Python 2 значение x изменяется после выполнения цикла.
# Python2
>>> x = 1
>>> [x for x in range(5)]
[0, 1, 2, 3, 4]
>>> x
4
Но в Python3 эта проблема решена.
# Python3
>>> x = 1
>>> [x for x in range(5)]
[0, 1, 2, 3, 4]
>>> x
1
10. Словари можно сортировать
Кажется, укоренилась идея о том, что словари нельзя сортировать.
# Python2.7.10
>>> mydict = {str(i):i for i in range(5)}
>>> mydict
{'1': 1, '0': 0, '3': 3, '2': 2, '4': 4}
Словари уже упорядочены в Python3.
# Python3.6.7
>>> mydict = {str(i):i for i in range(5)}
>>> mydict
{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4}
11. Цепочное сравнение
Давайте посмотрим на пример
>>> False == False == True
False
Знаете ли вы, что это выражение вернет False?
Я приведу вам другой пример, и вы, возможно, поймете.
f 18 < age < 60:
print("young man")
Если вы все еще не понимаете, я дам вам полный эквивалент.
>>> False == False and False == True
False
12. Странные буквы
Посмотрите прямо на следующий пример.
в Питоне 2.x
>>> value = 11
>>> valuе = 32
File "<stdin>", line 1
valuе = 32
^
SyntaxError: invalid syntax
в Питоне 3.x
>>> value = 11
>>> valuе = 32
>>> value
11
Я полагаю, вы, должно быть, были ошеломлены, когда впервые увидели это. Вы можете попробовать его на своем компьютере, и вы обнаружите, что он работает независимо от того, в какой версии Python вы работаете.
Если вы хотите воспроизвести мой сценарий, вы можете скопировать и вставить приведенный выше код в свою собственную командную строку.
Здесь уже не дело, вторая строка кода вышее
и первая строчкаe
разные.
вторая линияe
Это кириллица, а не английский алфавит, с которым мы знакомы.
>>> ord('е') # cyrillic 'e' (Ye)
1077
>>> ord('e') # latin 'e', as used in English and typed using standard keyboard
101
>>> 'е' == 'e'
False
Хорошо подумайте, обычно не обижайте коллег, в случае увольнения поставьтеe
Заменить глобально наe
, Я даже не знаю, что случилось в то время, ха-ха.
13. Х == +х?
В большинстве случаев это равенство верно.
>>> n1 = 10086
>>> n2 = +n1
>>>
>>> n1 == n2
True
При каких обстоятельствах это уравнение не будет выполняться?
Благодаря механизму счетчика,+
Используется для добавления двух экземпляров счетчика, и результатом добавления является количество элементов<=
0, он будет удален.
>>> from collections import Counter
>>> ct = Counter('abcdbcaa')
>>> ct
Counter({'a': 3, 'b': 2, 'c': 2, 'd': 1})
>>> ct['c'] = 0
>>> ct['d'] = -2
>>>
>>> ct
Counter({'a': 3, 'b': 2, 'c': 0, 'd': -2})
>>>
>>> +ct
Counter({'a': 3, 'b': 2})
14. Интересный импорт
import — это способ Python для импорта пакетов.
Знаете ли вы, что в Python встроено несколько очень (ву) интересных (ляо) пакетов?
Hello World
>>> import __hello__
Hello World!
Дзен Питона
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Антигравитационные комиксы
Импортировать в cmd-окнеantigravity
>>> import antigravity
Веб-страница откроется автоматически.
15. Не можете отличить локальные/глобальные переменные?
Прежде чем начать, вы можете попробовать запустить следующий небольшой фрагмент кода.
a = 1
def func01():
a += 1
func01()
Кажется, что проблемы нет, но на самом деле была совершена очень простая проблема.Эта ошибка довольно распространена, верно?
>>> func01()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in func01
UnboundLocalError: local variable 'a' referenced before assignment
Напомним, что такое локальная переменная? Переменные, объявленные в неглобальных определениях, являются локальными переменными.
Когда программа запускается наa += 1
, интерпретатор Python считает, чтоa
Это присвоение переменной, конечно, ставитa
В качестве локальной переменной естественно сообщать об ошибке.