Холодные знания Python, которых вы не знаете! (рекомендуемая коллекция)

искусственный интеллект Python NumPy WeChat

Впервые опубликовано в публичном аккаунте WeChat:Время программирования на Python
'
Обновляйте пять холодных знаний каждую среду, добро пожаловать на подписку!

01. Многоточие тоже объект


...Это многоточие, в Python все является объектом. Это не исключение.

В Python это называется Ellipsis.

В Python 3 вы можете просто написать... чтобы получить все это.

>>> ...
Ellipsis
>>> type(...)
<class 'ellipsis'>

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

>>> Ellipsis
Ellipsis
>>> type(Ellipsis)
<type 'ellipsis'>
>>>

true, когда он преобразуется в логическое значение

>>> bool(...)
True

Наконец, эта штука — синглтон.

>>> id(...)
4362672336
>>> id(...)
4362672336

Какая польза от этой штуки? Говорят, что это синтаксический сахар для Numpy, а не для игры в Numpy. люди, можно сказать, бесполезно.

я это только онлайн вижу...Вместо pass немного полезно, но не обязательно.

try:
    1/0
except ZeroDivisionError:
    ...

02. Как изменить подсказку интерпретатора


Обычно мы выполняем команды Python в терминале вот так.

>>> for i in range(2):
...     print (i)
...
0
1

ты думал о>>>и...Эти две подсказки также можно изменить?

>>> import sys                      
>>> sys.ps1                         
'>>> '                              
>>> sys.ps2                         
'... '                              
>>>                                 
>>> sys.ps2 = '---------------- '                 
>>> sys.ps1 = 'Python编程时光>>>'       
Python编程时光>>>for i in range(2):     
----------------    print (i)                    
----------------                                 
0                                   
1                                   

03. Инкрементное назначение работает лучше


Такие как+=и*=Эти операторы называются операторами приращения присваивания.

Здесь мы используем += в качестве примера.Следующие два способа записи фактически эквивалентны.

# 第一种
a = 1 ; a += 1

# 第二种
a = 1; a = a + 1

+=Магический метод, используемый за этим, __iadd__, если этот метод не реализован, он отступит и будет использовать __add__.

В чем разница между этими двумя написаниями?

Например, += b со списком, используйте _add_ похоже на использование a.extend(b), если вы используете _add_, тогда а = a+b, в первом случае нужно раскрыть непосредственно исходный список, а во втором — сначала взять значение из исходного списка, раскрыть его в новом списке, а затем вернуть новый объект списка в переменную. потребление последнего требует большего.

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

04. Странные струны


Пример 1

# Python2.7
>>> a = "Hello_Python"
>>> id(a)
32045616
>>> id("Hello" + "_" + "Python")
32045616

# Python3.7
>>> a = "Hello_Python"
>>> id(a)
38764272
>>> id("Hello" + "_" + "Python")
32045616

Пример 2

>>> a = "MING"
>>> b = "MING"
>>> a is b
True

# Python2.7
>>> a, b = "MING!", "MING!"
>>> a is b
True

# Python3.7
>>> a, b = "MING!", "MING!"
>>> a is b
False

Пример третий

# Python2.7
>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
True
>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
False

# Python3.7
>>> 'a' * 20 is 'aaaaaaaaaaaaaaaaaaaa'
True
>>> 'a' * 21 is 'aaaaaaaaaaaaaaaaaaaaa'
True

05. Порядок значений и и или


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

Если все значения в выражении или истинны, Python выбирает первое значение, а выражение и выбирает второе.

>>>(2 or 3) * (5 and 7)
14  # 2*7

06. Параметр по умолчанию предпочтительно не является изменяемым объектом


Параметры функций делятся на три типа: переменные параметры, параметры по умолчанию, параметры ключевых слов.

Конкретная разница между тремя и как ее использовать в учебнике Ляо Сюэфэна будет подробно объяснено здесь. Не двигаться здесь.

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

Давайте посмотрим на пример

def func(item, item_list=[]):
    item_list.append(item)
    print(item_list)

func('iphone')
func('xiaomi', item_list=['oppo','vivo'])
func('huawei')

Здесь можно сделать паузу и подумать, что получится на выходе?

Поразмыслив над этим, согласуется ли ваш ответ со следующим?

['iphone']
['oppo', 'vivo', 'xiaomi']
['iphone', 'huawei']

Если да, то вы можете пропустить эту часть, если нет, пожалуйста, прочитайте и проанализируйте ее здесь.

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

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

个人理解的记忆方法,不代表官方

07. Доступ к закрытым методам в классе


Как мы все знаем, методы, которые можно вызывать непосредственно в классе, являются только публичными методами (защищенные методы также возможны, но не рекомендуются). То есть приватные методы класса нельзя вызывать напрямую.

Вот пример

class Kls():
    def public(self):
        print('Hello public world!')
        
    def __private(self):
        print('Hello private world!')
        
    def call_private(self):
        self.__private()

ins = Kls()

# 调用公有方法,没问题
ins.public()

# 直接调用私有方法,不行
ins.__private()

# 但你可以通过内部公有方法,进行代理
ins.call_private()

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

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

# 调用私有方法,以下两种等价
ins._Kls__private()
ins.call_private()

08. Первая буква класса не должна быть заглавной


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

Но есть некоторые встроенные классы, в которых первая буква — строчная, а все экземпляры — прописные.

Например, bool — это имя класса, а True и False — его экземпляры; например, ellipsis — это имя класса, а Ellipsis — экземпляр; и ряд типов данных, таких как int, string, float, list, tuple, и dict — это имена классов, и все они в нижнем регистре.

09. Случайное исключение среза


Вот простой пример

my_list = [1, 2, 3, 4, 5]
print(my_list[5])

Его выполнение, как мы и ожидали, вызывает исключение индекса.

Traceback (most recent call last):
  File "F:/Python Script/test.py", line 2, in <module>
    print(my_list[5])
IndexError: list index out of range

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

Давайте посмотрим, следующий способ записи не сообщит об исключении индекса, а выполнение my_list[5:] вернет новый список: [].

my_list = [1, 2, 3]
print(my_list[5:])

10. При каких обстоятельствах вам не нужен символ продолжения строки?


При написании кода макет кода особенно важен для удобочитаемости кода.

Чтобы получить хорошо читаемый код, мы часто используем символы продолжения строки.\.

>>> a = 'talk is cheap,'\
...     'show me the code.'
>>>
>>> print(a)
talk is cheap,show me the code.

При каких обстоятельствах нет необходимости писать персонажа-продолжение?

Подводя итог, можно сказать, что в коде, заключенном между этими символами, символ продолжения может отсутствовать:[], () , {}

>>> my_list=[1,2,3,
...          4,5,6]

>>> my_tuple=(1,2,3,
...           4,5,6)

>>> my_dict={"name": "MING",
...          "gender": "male"}

Также в многострочных текстовых комментариях''', символ продолжения также можно опустить.

>>> text = '''talk is cheap,
    ...           show me the code'''

Выше приведены лишь несколько простых примеров.

Но выводы делать надо научиться. То же самое относится к следующим сценариям

  • определения классов и функций.
  • Понимание списка, понимание словаря, понимание множества, выражения генератора

11. Py2 также может использовать print()


Я считаю, что должно быть много людей, думающих, что только Py3 может использовать print(), а Py2 Можно использовать только печать ''.

Не так.

До Python 2.6 поддерживается только

print "hello"

В Python 2.6 и 2.7 поддерживаются следующие три

print "hello"
print("hello")
print ("hello")

В Python3.x могут поддерживаться следующие два

print("hello")
print ("hello")

12. Вернуться дважды


Мы все знаем, попробуй... наконец... Использование инструкции, независимо от того, выполняется ли попытка нормально или сообщает об исключении, в конечном итоге может гарантировать, что finally может быть выполнен.

В то же время мы также знаем, что если функция возврата встречается в функции, она немедленно завершится.

Основываясь на двух вышеприведенных пунктах, давайте посмотрим на этот пример, на что похож запущенный процесс?

>>> def func():
...     try:
...         return 'try'
...     finally:
...         return 'finally'
...
>>> func()
'finally'

На удивление нашел вtryОбратка в нем не работает.

Причина в том, что в операторе try...finally... возврат в try будет напрямую игнорироваться, потому что finally гарантированно будет выполнен.

13. для бесконечного цикла


Можно сказать, что цикл for является самым базовым пунктом знаний.

Но если бы вас попросили написать бесконечный цикл с for , вы бы написали его? (Вопрос исходит от друга группы Чена**)

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

Что ж, если у вас еще нет идей, давайте посмотрим на ответ друга из зарубежной группы MIT:

for i in iter(int, 1):pass

Вы растеряны. Iter до сих пор используется таким образом? Почему это бесконечный цикл?

Это действительно холодное знание.Что касается этого пункта знаний, если вы посмотрите на китайский сайт, вы можете не найти соответствующей информации.

К счастью, вы можете увидеть комментарии в исходном коде py через IDE и представить очень подробный метод использования.

Оказывается, есть два способа использования iter.Обычно наше познание — это первый, который преобразует список в итератор.

И второй метод, он получает callable объект, и дозорный параметр. Первый объект будет работать до тех пор, пока не вернет сигнальное значение.

ТотintНу, это еще один пункт знаний, инт является встроенным методом. Глядя на комментарии, вы можете видеть, что по умолчанию он имеет значение 0. Вы можете ввести в терминалеint()Посмотрите, возвращает ли он 0.

Поскольку int() всегда возвращает 0, она никогда не возвращает 1.

Так что этот цикл for не будет иметь конца. продолжать работать.

Эти вопросы и ответы основаны на мудрости группы. Если вы тоже хотите присоединиться к нашему обсуждению, пожалуйста, перейдите на бэкграунд официального аккаунта и добавьте мой личный WeChat.

14. Малый целочисленный пул


Давайте сначала посмотрим на пример.

>>> a = -6
>>> b = -6
>>> a is b
False

>>> a = 256
>>> b = 256
>>> a is b
True

>>> a = 257
>>> b = 257
>>> a is b
False

>>> a = 257; b = 257
>>> a is b
True

Чтобы избежать частого применения и уничтожения памяти для целых чисел, Python определяет небольшой пул целых чисел [-5, 256]. Эти целочисленные объекты предварительно установлены и не будут удалены сборщиком мусора.

Пожалуйста, найдите приведенный выше код в Тестирование в терминальной среде Python, если вы тестируете в IDE, это не так.

Последний пример, почему он снова True?

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

15. Внутренний механизм


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

Например: интерпретатор Python использует Внутренние (строковые резидентные) технологии для повышения эффективности строк, что такое внутренний механизм? То есть один и тот же строковый объект будет сохранен только в одной копии и помещен в строковый пул, который является общим, естественно, его нельзя изменять, что также определяет, что строка должна быть неизменяемым объектом.

>>> s1="hello"
>>> s2="hello"
>>> s1 is s2
True

# 如果有空格,默认不启用intern机制
>>> s1="hell o"
>>> s2="hell o"
>>> s1 is s2
False

# 如果一个字符串长度超过20个字符,不启动intern机制
>>> s1 = "a" * 20
>>> s2 = "a" * 20
>>> s1 is s2
True

>>> s1 = "a" * 21
>>> s2 = "a" * 21
>>> s1 is s2
False

>>> s1 = "ab" * 10
>>> s2 = "ab" * 10
>>> s1 is s2
True

>>> s1 = "ab" * 11
>>> s2 = "ab" * 11
>>> s1 is s2
False

Справочная документация