48 вещей о Python, которые я до недавнего времени не знал (сборник)
1) Мы можем динамически устанавливать переменные, используя globals()
^ это то же самое, что:
globals()— это словарь, содержащий все глобальные переменные, и мы можем устанавливать переменные, добавляя пары ключ-значение в него (не делайте этого в производственном коде).
2) re.sub может принимать функции
^ мы можем передать функцию вместо строки в re.sub
3) Мы можем внедрить CSS в jupyter
В функцию upsidedown вводится CSS, из-за которого наш фрейм данных отображается вверх ногами.
4) Разница между __getattr__ и __getattribute__
- __getattribute__вызывается, когда мы пытаемся получить существующий атрибут.
- __getattr__вызывается, когда мы пытаемся получить несуществующий атрибут.
Имхо, это немного странно, но это то, что есть.
5) Отладчик Python
В Python есть встроенный отладчик pdb, который позволяет нам проверять каждую переменную на каждом этапе. Нам нужны 2 файла .py:
На каждом этапе мы можем использовать команды PDB, например continue или exist, или вводить имена переменных, например x или y.
6) Учитывание регистра в Python (Python 3.10+)
Это доступно только в Python 3.10 и выше, и мы можем думать об этом как об элегантном блоке if-elif-else.
7) Мы можем рисовать на Python (программно), используя turtle
turtle— это встроенный модуль, который позволяет нам рисовать с помощью Python. Выполнение приведённого выше кода рисует цветок:
8) Мы можем скрыть пользовательский ввод в терминале
Что произойдет, когда мы запустим это и наберём 'apple':
Когда мы набираем apple, всё, что мы набираем, скрыто, как обычный пароль.
9) Переменная __debug__
Когда __debug__ равен False, операторы assert игнорируются.
10) Мы можем открыть наш браузер с помощью Python
^ если мы запустим приведённый выше код, medium.com откроется в вашем браузере.
Примечание — это встроенная программа, и нам не нужно её устанавливать.
11) Дроби в Python
мы можем представлять дроби, используя объекты Fraction вместо чисел с плавающей запятой (встроено, не нужно устанавливать)
12) Python имеет встроенную медианную функцию
^ statistics— это встроенный модуль, который нам не нужно устанавливать.
13) Мы можем заставить вещи запускаться ПОСЛЕ оператора return в функции
^ в типичных функциях НИЧЕГО не происходит после выполнения инструкции return. Строка print('orange')никогда не будет выполнена.
Однако, если мы используем блок try-finally, блок finally выполняется ВСЕГДА. Таким образом, строка print('orange')появляется ПОСЛЕ оператора return.
14) Мы можем использовать .update() для объединения 2 словарей/наборов
15) int() равно 0, а float() равно 0,0
16) Мы можем использовать __code__ для получения информации о функции
__code__позволяет нам получить определённые метаданные о функциях.
17) PYTHONPATH появляется в sys.path
После установки PYTHONPATH он появляется в sys.path. Это означает, что мы можем запускать файлы /your/filepath/yourfolder без необходимости записывать их на компакт-диск.
18) Расширение .py не имеет большого значения
Расширение .py не имеет значения, если файл содержит действительный код Python. Но, пожалуйста, не делайте этого в производственном коде.
19) Отображение прокси (неизменяемые словари)
Прокси-серверы — это словари, которые нельзя изменить после того, как мы их создадим. Мы используем их, если не хотим, чтобы наши пользователи изменяли их значения.
20) __dict__ отличается для классов и объектов
Таким образом, мы не можем редактировать атрибуты класса и т. д. с помощью __dict__.
21) any() и all()
^ any() возвращает True, если хотя бы один элемент имеет значение True.
^ all()возвращает True, если КАЖДЫЙ элемент имеет значение True.
22) divmod()
^ встроенная функция divmod() делает // и в то же время %.
27//10 возвращает 2, а 27%10 возвращает 7, поэтому (2,7)возвращается с divmod(27, 10).
23) Мы можем легко проверять переменные, используя f-строки
^ нам просто нужно вставить {varname=} в f-строку.
24) Мы можем автоматически конвертировать числа с плавающей запятой
Встроенная функция float.as_integer_ratio() позволяет нам преобразовать число с плавающей запятой в дробь (представленную кортежем).
25) globals() и local()
26) __import__()
27) Положительная/отрицательная бесконечность в Python
Положительная бесконечность больше всех остальных чисел, а отрицательная бесконечность меньше всех остальных чисел (обычно).
28) Мы можем использовать pprint для красивой печати
29) Мы можем печатать цветной вывод в Python
Сначала нам нужен следующий код pip install colorama (в cmd/терминал).
30) Более быстрый способ набрать словарь (иногда)
31) Мы можем распечатать материал в Python
- CURSOR_UP перемещает наш курсор вверх на 1 строку
- CLEAR очищает всю текущую строку
- print(CURSOR_UP + CLEAR)вместе печатают 1 строку
32) Частные переменные в объектах не являются частными
Мы можем получить доступ к __name с помощью __dict__или даже rocky._Dog__name.
33) Мы можем создавать классы, используя type()
Когда мы передаём 3 аргумента в type(), мы можем создать класс:
- classname— переменная, представляющая имя класса, например - Dog
- name— строка, представляющая имя класса, например.'Dog'
- bases— кортеж, содержащий родительские классы класса
- dict— словарь, содержащий атрибуты и методы класса
34) Мы можем использовать китайские иероглифы в качестве переменных
Пожалуйста, не используйте это в производственном коде
35) Символ возврата \b
Печать символа возврата \b удаляет один напечатанный символ
36) Символ колокольчика \a
Печать \a должна издавать колокольный звон. Попробуйте это в CMD/терминале.
37) Классы могут быть декораторами
Это возможно благодаря магическому методу __call__, который определяет, что происходит, когда мы вызываем объект add.
38) Функции могут иметь переменные и методы
Крутая вещь, но, пожалуйста, не используйте это в производственном коде
39) Простой способ выравнивания строк
40) Что происходит, когда мы добавляем список к самому себе?
...называется многоточием и отображается функцией print при наличии циклических ссылок. ...также может использоваться в качестве кода-заполнителя.
41) Мы можем запускать строки как код, используя eval()
42) round() принимает отрицательные десятичные разряды
43) Оператор моржа := (Python 3.8+)
В (n := 5):
1. Переменной n присвоено значение 5
2. 5 также возвращается (поэтому его можно использовать для сравнения с 3)
Мы можем использовать оператор walrus, чтобы сохранить одну строку кода.
44) Мы можем собрать много объектов в один и тот же файл
Встроенный модуль pickle позволяет нам сохранять структуры данных или объекты Python в двоичные файлы. Мы можем сохранить несколько объектов в файл.
45) Запуск нашего скрипта Python с флагом -O позволяет нам игнорировать некоторые ошибки
Если мы запускаем python run.py, assert 1==2 вызывает AssertionError.
Если мы запускаем python -O run.py, assert 1==2 игнорируется из-за -O.
46) dict.fromkeys()
Это позволяет нам создать словарь из списка.
^ все значения None соответствуют значениям None по умолчанию.
^ мы можем сами установить значение по умолчанию, передав другой аргумент в dict.fromkeys
47) Frozensets (Неизменные наборы)
Frozensets — это наборы, которые нельзя изменить после создания.
Преимущества замороженных наборов:
- Проверка существования чего-либо внутри замороженного набора по-прежнему занимает время O(1)
- Мы можем добавить замороженный набор в другой набор (мы не можем сделать это с наборами).
- Мы можем использовать замороженный набор в качестве ключа словаря (мы не можем сделать это с наборами).
48) Мы можем заставить классы принимать только определённые переменные, используя __slots__
Заключение
Надеюсь, сегодня вы узнали хоть что-то новое о Python!