Форматированный вывод, форматирование строк
Содержание:
Specifying Type
We can include more parameters within the curly braces of our syntax. We’ll use the format code syntax , where specifies the index number of the argument to the method that we went through in the , and refers to the conversion code of the data type that you’re using with the formatter.
The conversion type refers to the the single-character type code that Python uses. The codes that we’ll be using here are for string, to display decimal integers (10-base), and which we’ll use to display floats with decimal places. You can read more about the through Python 3’s official documentation.
Let’s look at an example where we have an integer passed through the method, but want to display it as a float by adding the conversion type argument:
We used the syntax of for the first curly brace replacement field to output a float. The second curly braces only uses the first parameter .
In the example above, there are a lot of numbers displaying after the decimal point, but you can limit those. When you are specifying for float values, you can additionally specify the precision of that value by including a full stop followed by the number of digits after the decimal you would like to include.
If Sammy ate 75.765367% of the pizza, but we don’t need to have a high level of accuracy, we can limit the places after the decimal to 3 by adding before the conversion type :
If we just want one decimal place, we can rewrite the string and method like so:
Note that modifying precision will cause the number to be rounded.
Although we display a number with no decimal places as a float, if we try to change the float to an integer by using the conversion type, we will receive an error:
If you would like no decimal places to be shown, you can write your formatter like so:
This will not , but instead limit the number of places shown after the decimal point.
3 – Литеральная интерполяция строки (Python 3.6+)
Python 3.6 добавляет новый метод форматирования строк под названием Форматированные строковые литералы. Это новый способ форматирования строк, позволяющий использовать встроенные выражения Python внутри строковых констант. Вот простой пример, который поможет почувствовать эту функцию:
Новый синтаксис форматирования является очень мощным, потому что может содержать произвольные Python выражения с внутренней арифметикой. Например:
Форматированные строковые литералы – это функция парсера Python, которая преобразует f-string в ряд строковых констант и выражений. Затем они соединяются для построения финальной строки.
Допустим, что есть функция greet(), которая содержит f-string:
it going?»
Если рассмотреть функцию более подробно, можно увидеть, что f-string в функции преобразуется в следующее:
Реальная реализация немного быстрее, чем при использовании кода операции BUILD_STRING в качестве оптимизации. Но функционально они одинаковы:
Строковые литералы также поддерживают существующий синтаксис формата строки метода str.format(). Это позволяет решать те же проблемы форматирования, которые обсуждались в предыдущих двух разделах:
Новое форматирование строковых литералов Python похожи на литералы шаблонов в JavaScript, добавленные в ES2015.
Для позиционных аргументов
Здесь аргумент 0 ‒ это строка «Адам», а аргумент 1 ‒ плавающее число 230.2346.
Примечание: В Python список аргументов начинается с 0.
Строка «Здравствуйте, {0}, ваш баланс составляет {1: 9.3f}» ‒ это строка шаблона. Он содержит коды формата для форматирования.
Фигурные скобки ‒ это просто заполнители для размещения аргументов. В приведенном выше примере {0} является заполнителем для «Адама», а {1: 9.3f} ‒ заполнителем для 230.2346 .
Поскольку строка шаблона ссылается на аргументы format() как {0} и {1}, аргументы являются позиционными. На них обоих также можно ссылаться без чисел, поскольку {} и Python внутренне преобразует их в числа.
Внутри:
- Поскольку «Адам» является 0-м аргументом, он помещается вместо {0}. Поскольку {0} не содержит никаких других кодов формата, он не выполняет никаких других операций.
- Однако это не относится к 1-му аргументу 230.2346. Здесь {1: 9.3f} помещает 230.2346 на его место и выполняет операцию 9.3f.
- f указывает формат работы с числом с плавающей запятой. Если не правильно указать, выдаст ошибку.
- Часть перед «.» (9) определяет минимальную ширину/заполнение, которое может принимать число (230.2346). В этом случае 230.2346 отводится минимум 9 мест, включая «.». Если параметр выравнивания не указан, он выравнивается по правому краю оставшихся пробелов. (Для строк он выравнивается по левому краю).
- Часть после «.» (3) обрезает десятичную часть (2346) до заданного числа. В этом случае 2346 усекается после 3 разрядов. Остальные числа (46) округляем, получая 235.
Старый способ — строковый оператор форматирования
Оператор % по отношению к строкам выполняет операцию форматирования и вставки таким образом, что объект, стоящий справа от него, встраивается согласно определенным правилам в строку слева от него:
Такой способ форматирования считается старым видимо потому, что заимствован из функции printf() языка C, а в Python кроме него появились более продвинутые средства форматирования вывода. Однако в ряде случаев использование оператора % бывает удобнее, чем использование строкового метода format().
Следует отметить, что форматируются строки, а не вывод. На вывод передается уже сформированная строка.
Как вывести вещественное число с необходимой точностью
Оператор деления возвращает вещественное число. Если количество знаков бесконечно, то Python выведет его в таком виде:
Обычно требуется лишь определенное количество знаков. Для этого в строку записывают комбинацию символов, начинающуюся с %. Число после точки обозначает количество знаков после запятой. Символ f обозначает вещественный тип данных float.
Ставить скобки обязательно, иначе операция % выполняется раньше /:
Оператор форматирования строк выполняет округление, а не урезание:
С функцией print():
Вывод данных в поля заданной ширины
Бывает данные на экран надо вывести не через один пробел, а в виде таблицы. Другими словами, в полях определенной ширина, где ширина измеряется в знакоместах.
Рассмотрим пример. Допустим надо вывести числа второй строки под числами первой. Если выполнить функцию print() так:
результат будет таким:
10 235 1000 50
Чтобы привести вывод к табличному виду, необходимо задать ширину поля:
Результат:
10 235 1000 50
Здесь в кавычках указаны форматы данных и ширина полей. После знака % за кавычками указаны данные, которые будут подставлены вместо каждого указанного формата. Если количество форматов не совпадает с количеством данных, возникнет ошибка.
Форматы данных могут быть: d — целое число, s — строка, f — вещественное число, c — символ.
По умолчанию данные выравниваются по правому краю поля. Чтобы выровнять их по левому, достаточно поставить знак минус перед числом, обозначающим ширину поля. Пример:
Вывод:
10 235 1000 50
The Placeholders
The placeholders can be identified using named indexes
, numbered
indexes , or even empty placeholders
.
Example
Using different placeholder values:
txt1 = «My
name is {fname}, I’m {age}».format(fname = «John», age = 36)txt2 = «My
name is {0}, I’m {1}».format(«John»,36)txt3 = «My
name is {}, I’m {}».format(«John»,36)
Formatting Types
Inside the placeholders you can add a formatting type to format the
result:
Try it | Left aligns the result (within the available space) | |
Try it | Right aligns the result (within the available space) | |
Try it | Center aligns the result (within the available space) | |
Try it | Places the sign to the left most position | |
Try it | Use a plus sign to indicate if the result is positive or negative | |
Try it | Use a minus sign for negative values only | |
Try it | Use a space to insert an extra space before positive numbers (and a minus sign befor negative numbers) | |
Try it | Use a comma as a thousand separator | |
Try it | Use a underscore as a thousand separator | |
Try it | Binary format | |
Converts the value into the corresponding unicode character | ||
Try it | Decimal format | |
Try it | Scientific format, with a lower case e | |
Try it | Scientific format, with an upper case E | |
Try it | Fix point number format | |
Try it | Fix point number format, in uppercase format (show and as and ) |
|
General format | ||
General format (using a upper case E for scientific notations) | ||
Try it | Octal format | |
Try it | Hex format, lower case | |
Try it | Hex format, upper case | |
Number format | ||
Try it | Percentage format |
Controlling Formatting on a Per-Type Basis
Each Python type can control formatting of its instances by defining
a __format__ method. The __format__ method is responsible for
interpreting the format specifier, formatting the value, and
returning the resulting string.
The new, global built-in function ‘format’ simply calls this special
method, similar to how len() and str() simply call their respective
special methods:
def format(value, format_spec): return value.__format__(format_spec)
It is safe to call this function with a value of «None» (because the
«None» value in Python is an object and can have methods.)
Several built-in types, including ‘str’, ‘int’, ‘float’, and ‘object’
define __format__ methods. This means that if you derive from any of
those types, your class will know how to format itself.
The object.__format__ method is the simplest: It simply converts the
object to a string, and then calls format again:
class object: def __format__(self, format_spec): return format(str(self), format_spec)
The __format__ methods for ‘int’ and ‘float’ will do numeric formatting
based on the format specifier. In some cases, these formatting
operations may be delegated to other types. So for example, in the case
where the ‘int’ formatter sees a format type of ‘f’ (meaning ‘float’)
it can simply cast the value to a float and call format() again.
Any class can override the __format__ method to provide custom
formatting for that type:
class AST: def __format__(self, format_spec): ...
Note for Python 2.x: The ‘format_spec’ argument will be either
a string object or a unicode object, depending on the type of the
original format string. The __format__ method should test the type
of the specifiers parameter to determine whether to return a string or
unicode object. It is the responsibility of the __format__ method
to return an object of the proper type.
Форматирование строк
Форматирование строк (также известно как замещение) – это замещение значений в базовой строке. Большую часть времени вы будете вставлять строки внутри строк, однако, вам также понадобиться вставлять целые числа и числа с запятыми в строки весьма часто. Существует два способа достичь этой цели. Начнем с старого способа, после чего перейдем к новому:
Python
# -*- coding: utf-8 -*-
my_string = «Я люблю %s» % «Python»
print(my_string) # Я люблю Python
var = «яблоки»
newString = «Я ем %s» % var
print(newString) # Я ем яблоки
another_string = «Я люблю %s и %s» % («Python», var)
print(another_string) # Я люблю Python и яблоки
1 2 3 4 5 6 7 8 9 10 11 |
# -*- coding: utf-8 -*- my_string=»Я люблю %s»%»Python» print(my_string)# Я люблю Python var=»яблоки» newString=»Я ем %s»%var print(newString)# Я ем яблоки another_string=»Я люблю %s и %s»%(«Python»,var) print(another_string)# Я люблю Python и яблоки |
Как вы могли догадаться, % — это очень важная часть вышеописанного кода. Этот символ указывает Python, что вы скоро вставите текст на его место. Если вы будете следовать за строкой со знаком процента и другой строкой или переменной, тогда Python попытается вставить ее в строку. Вы можете вставить несколько строк, добавив несколько знаков процента в свою строку. Это видно в последнем примере
Обратите внимание на то, что когда вы добавляете больше одной строки, вам нужно закрыть эти строки в круглые скобки. Теперь взглянем на то, что случится, если мы вставим недостаточное количество строк:
Python
another_string = «Я люблю %s и %s» % «Python»
Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: not enough arguments for format string
1 2 3 4 5 |
another_string=»Я люблю %s и %s»%»Python» Traceback(most recent call last) File»<string>»,line1,in<fragment> TypeErrornotenough arguments forformatstring |
О-па. Мы не передали необходимое количество аргументов для форматирования строки. Если вы внимательно взгляните на пример, вы увидите, что у нас есть два экземпляра %, но для того, чтобы вставить строки, вам нужно передать столько же %, сколько у нас строк. Теперь вы готовы к тому, чтобы узнать больше о вставке целых чисел, и чисел с запятыми. Давайте взглянем.
Python
my_string = «%i + %i = %i» % (1,2,3)
print(my_string) # ‘1 + 2 = 3’
float_string = «%f» % (1.23)
print(float_string) # ‘1.230000’
float_string2 = «%.2f» % (1.23)
print(float_string2) # ‘1.23’
float_string3 = «%.2f» % (1.237)
print(float_string3) # ‘1.24’
1 2 3 4 5 6 7 8 9 10 11 |
my_string=»%i + %i = %i»%(1,2,3) print(my_string)# ‘1 + 2 = 3’ float_string=»%f»%(1.23) print(float_string)# ‘1.230000’ float_string2=»%.2f»%(1.23) print(float_string2)# ‘1.23’ float_string3=»%.2f»%(1.237) print(float_string3)# ‘1.24’ |
Первый пример достаточно простой. Мы создали строку, которая принимает три аргумента, и мы передаем их. В случае, если вы еще не поняли, Python не делает никаких дополнений в первом примере. Во втором примере, мы передаем число с запятой
Обратите внимание на то, что результат включает множество дополнительных нулей (1.230000). Нам это не нужно, так что мы указываем Python ограничить выдачу до двух десятичных значений в третьем примере (“%.2f”)
Последний пример показывает, что Python округлит числа для вас, если вы передадите ему дробь, что лучше, чем два десятичных значения. Давайте взглянем на то, что произойдет, если мы передадим неправильные данные:
Python
int_float_err = «%i + %f» % («1», «2.00»)
Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: %d format: a number is required, not str
1 2 3 4 |
int_float_err=»%i + %f»%(«1″,»2.00») Traceback(most recent call last) File»<string>»,line1,in<fragment> TypeError%dformatanumber isrequired,notstr |
В данном примере мы передали две строки вместо целого числа и дроби. Это привело к ошибке TypeError, что говорит нам о том, что Python ждал от нас чисел. Это указывает на отсутствие передачи целого числа, так что мы исправим это, по крайней мере, попытаемся:
Python
int_float_err = «%i + %f» % (1, «2.00»)
Traceback (most recent call last):
File «<string>», line 1, in <fragment>
TypeError: float argument required, not str
1 2 3 4 5 |
int_float_err=»%i + %f»%(1,»2.00″) Traceback(most recent call last) File»<string>»,line1,in<fragment> TypeErrorfloatargument required,notstr |
Мы получили ту же ошибку, но под другим предлогом, в котором написано, что мы должны передать дробь. Как мы видим, Python предоставляет нам полезную информацию о том, что же пошло не так и как это исправить. Если вы исправите вложения надлежащим образом, тогда вы сможете запустить этот пример. Давайте перейдем к новому методу форматирования строк.
Formatter Methods
The Formatter class takes no initialization arguments:
fmt = Formatter()
The public API methods of class Formatter are as follows:
-- format(format_string, *args, **kwargs) -- vformat(format_string, args, kwargs)
‘format’ is the primary API method. It takes a format template,
and an arbitrary set of positional and keyword arguments.
‘format’ is just a wrapper that calls ‘vformat’.
‘vformat’ is the function that does the actual work of formatting. It
is exposed as a separate function for cases where you want to pass in
a predefined dictionary of arguments, rather than unpacking and
repacking the dictionary as individual arguments using the *args and
**kwds syntax. ‘vformat’ does the work of breaking up the format
template string into character data and replacement fields. It calls
the ‘get_positional’ and ‘get_index’ methods as appropriate (described
below.)
Formatter defines the following overridable methods:
-- get_value(key, args, kwargs) -- check_unused_args(used_args, args, kwargs) -- format_field(value, format_spec)
‘get_value’ is used to retrieve a given field value. The ‘key’ argument
will be either an integer or a string. If it is an integer, it represents
the index of the positional argument in ‘args’; If it is a string, then
it represents a named argument in ‘kwargs’.
The ‘args’ parameter is set to the list of positional arguments to
‘vformat’, and the ‘kwargs’ parameter is set to the dictionary of
positional arguments.
For compound field names, these functions are only called for the
first component of the field name; subsequent components are handled
through normal attribute and indexing operations.
So for example, the field expression ‘0.name’ would cause ‘get_value’
to be called with a ‘key’ argument of 0. The ‘name’ attribute will be
looked up after ‘get_value’ returns by calling the built-in ‘getattr’
function.
If the index or keyword refers to an item that does not exist, then an
IndexError/KeyError should be raised.
‘check_unused_args’ is used to implement checking for unused arguments
if desired. The arguments to this function is the set of all argument
keys that were actually referred to in the format string (integers for
positional arguments, and strings for named arguments), and a reference
to the args and kwargs that was passed to vformat. The set of unused
args can be calculated from these parameters. ‘check_unused_args’
is assumed to throw an exception if the check fails.
‘format_field’ simply calls the global ‘format’ built-in. The method
is provided so that subclasses can override it.
To get a better understanding of how these functions relate to each
other, here is pseudocode that explains the general operation of
vformat:
def vformat(format_string, args, kwargs): # Output buffer and set of used args buffer = StringIO.StringIO() used_args = set() # Tokens are either format fields or literal strings for token in self.parse(format_string): if is_format_field(token): # Split the token into field value and format spec field_spec, _, format_spec = token.partition(":") # Check for explicit type conversion explicit, _, field_spec = field_spec.rpartition("!") # 'first_part' is the part before the first '.' or ' or .subfield. Assume that 'components' # returns an iterator of the various subfields, not including # the first part. for comp in components(field_spec): value = resolve_subfield(value, comp) # Handle explicit type conversion if explicit == 'r': value = repr(value) elif explicit == 's': value = str(value) # Call the global 'format' function and write out the converted # value. buffer.write(self.format_field(value, format_spec)) else: buffer.write(token) self.check_unused_args(used_args, args, kwargs) return buffer.getvalue()
Настройка строк и столбцов
С помощью модуля OpenPyXL можно задавать высоту строк и ширину столбцов таблицы, закреплять их на месте (чтобы они всегда были видны на экране), полностью скрывать из виду, объединять ячейки.
Настройка высоты строк и ширины столбцов
Объекты имеют атрибуты и , которые управляют высотой строк и шириной столбцов.
sheet'A1' = 'Высокая строка' sheet'B2' = 'Широкий столбец' sheet.row_dimensions1.height = 70 sheet.column_dimensions'B'.width = 30
Атрибуты s и представляют собой значения, подобные словарю. Атрибут содержит объекты , а атрибут содержит объекты . Доступ к объектам в осуществляется с использованием номера строки, а доступ к объектам в — с использованием буквы столбца.
Для указания высоты строки разрешено использовать целые или вещественные числа в диапазоне от 0 до 409. Для указания ширины столбца можно использовать целые или вещественные числа в диапазоне от 0 до 255. Столбцы с нулевой шириной и строки с нулевой высотой невидимы для пользователя.
Объединение ячеек
Ячейки, занимающие прямоугольную область, могут быть объединены в одну ячейку с помощью метода рабочего листа:
sheet.merge_cells('A1:D3') sheet'A1' = 'Объединены двенадцать ячеек' sheet.merge_cells('C5:E5') sheet'C5' = 'Объединены три ячейки'
Чтобы отменить слияние ячеек, надо вызвать метод :
sheet.unmerge_cells('A1:D3') sheet.unmerge_cells('C5:E5')
Закрепление областей
Если размер таблицы настолько велик, что ее нельзя увидеть целиком, можно заблокировать несколько верхних строк или крайних слева столбцов в их позициях на экране. В этом случае пользователь всегда будет видеть заблокированные заголовки столбцов или строк, даже если он прокручивает таблицу на экране.
У объекта имеется атрибут , значением которого может служить объект или строка с координатами ячеек. Все строки и столбцы, расположенные выше и левее, будут заблокированы.
Значение атрибута freeze_panes | Заблокированные строки и столбцы |
---|---|
Строка 1 | |
Столбец A | |
Столбцы A и B | |
Строка 1 и столбцы A и B | |
Закрепленные области отсутствуют |
Чтение из файла
При открытии файла в режимах, допускающих чтение, можно использовать несколько подходов.
Для начала можно прочитать файл целиком и все данные, находящиеся в нем, записать в одну строку.
Используя эту функцию с целочисленным аргументом, можно прочитать определенное количество символов.
При этом будут получены только первые 16 символов текста
Важно понимать, что при применении этой функции несколько раз подряд будет считываться часть за частью этого текста — виртуальный курсор будет сдвигаться на считанную часть текста. Его можно сдвинуть на определенную позицию, при необходимости воспользовавшись методом
Другой способ заключается в считывании файла построчно. Метод считывает строку и, также как и с методом , сдвигает курсор — только теперь уже на целую строку. Применение этого метода несколько раз будет приводить к считыванию нескольких строк. Схожий с этим способом, другой метод позволяет прочитать файл целиком, но по строкам, записав их в список. Этот список можно использовать, например, в качестве итерируемого объекта в цикле.
Однако и здесь существует более pythonic way. Он заключается в том, что сам объект имеет итератор, возвращающий строку за строкой. Благодаря этому нет необходимости считывать файл целиком, сохраняя его в список, а можно динамически по строкам считывать файл. И делать это лаконично.
Format Specifiers
Each field can also specify an optional set of ‘format
specifiers’ which can be used to adjust the format of that field.
Format specifiers follow the field name, with a colon (‘:’)
character separating the two:
"My name is {0:8}".format('Fred')
The meaning and syntax of the format specifiers depends on the
type of object that is being formatted, but there is a standard
set of format specifiers used for any object that does not
override them.
Format specifiers can themselves contain replacement fields.
For example, a field whose field width is itself a parameter
could be specified via:
"{0:{1}}".format(a, b)
These ‘internal’ replacement fields can only occur in the format
specifier part of the replacement field. Internal replacement fields
cannot themselves have format specifiers. This implies also that
replacement fields cannot be nested to arbitrary levels.
Note that the doubled ‘}’ at the end, which would normally be
escaped, is not escaped in this case. The reason is because
the ‘{{‘ and ‘}}’ syntax for escapes is only applied when used
outside of a format field. Within a format field, the brace
characters always have their normal meaning.
О функции print мы уже немного
говорили на предыдущем занятии, здесь рассмотрим подробнее различные
возможности ее использования. Например, эту функцию можно записывать в таких
вариациях:
print(1) print(1, 2) print(1, 2, 3)
И так далее,
число аргументов может быть произвольным. Соответственно все эти значения в
строчку будут выведены в консоли. Причем, значения разделяются между собой
пробелом. Это разделитель, который используется по умолчанию. Если нужно
изменить значение этого разделителя, то для этого используется специальный
именованный аргумент sep:
print(1, 2, 3, sep=",") print(1, 2, 3, sep="-") print(1, 2, 3, sep="***")
то есть, здесь можно прописывать самые разные строки-разделители.
Далее, вы уже
заметили, что каждый вызов функции print делает перевод
строки. Этот символ автоматически добавляет в конец выводимых данных. Но, мы
также можем его изменить. Для этого используется именованный аргумент end:
print(1, 2, 3, sep=",", end=':') print(1, 2, 3, sep="-", end='--end--\n') print(1, 2, 3, sep="***")
Смотрите, теперь
у нас после первой строчки нет перевода строки, а поставлено двоеточие с
пробелом, которые мы указали в аргументе end. После второго
вывода в конце была добавлена строчка и указан символ ‘\n’ перевода
строки.
В качестве
примера все это можно использовать для более гибкого вывода значений с помощью print:
name = "Федор" print("Имя", name, sep=":")
Но это не самый
удобный вывод значений. Функция print позволяет делать довольно гибкий
форматированный вывод данных с применением спецификаторов. Например:
name = "Федор"; age = 18 print("Имя %s, возраст %d"%(name, age))
В результате,
вместо спецификатора %s будет подставлена первая переменная,
указанная в скобках, в виде строки, а вместо %d – вторая
переменная age в виде целого
числа. То есть, для каждого типа данных существует свой спецификатор. Наиболее
употребительные, следующие:
-
%d, %i, %u – для вывода целочисленных
значений; -
%f – для вывода
вещественных значений; -
%s
– для
вывода строк; -
%%
— для
вывода символа %
Вот основные
возможности функций input и print в Python.
Видео по теме
Python 3 #1: установка и запуск интерпретатора языка
Python 3 #2: переменные, оператор присваивания, типы данных
Python 3 #3: функции input и print ввода/вывода
Python 3 #4: арифметические операторы: сложение, вычитание, умножение, деление, степень
Python 3 #5: условный оператор if, составные условия с and, or, not
Python 3 #6: операторы циклов while и for, операторы break и continue
Python 3 #7: строки — сравнения, срезы строк, базовые функции str, len, ord, in
Python 3 #8: методы строк — upper, split, join, find, strip, isalpha, isdigit и другие
Python 3 #9: списки list и функции len, min, max, sum, sorted
Python 3 #10: списки — срезы и методы: append, insert, pop, sort, index, count, reverse, clear
Python 3 #11: списки — инструмент list comprehensions, сортировка методом выбора
Python 3 #12: словарь, методы словарей: len, clear, get, setdefault, pop
Python 3 #13: кортежи (tuple) и операции с ними: len, del, count, index
Python 3 #14: функции (def) — объявление и вызов
Python 3 #15: делаем «Сапер», проектирование программ «сверху-вниз»
Python 3 #16: рекурсивные и лямбда-функции, функции с произвольным числом аргументов
Python 3 #17: алгоритм Евклида, принцип тестирования программ
Python 3 #18: области видимости переменных — global, nonlocal
Python 3 #19: множества (set) и операции над ними: вычитание, пересечение, объединение, сравнение
Python 3 #20: итераторы, выражения-генераторы, функции-генераторы, оператор yield
Python 3 #21: функции map, filter, zip
Python 3 #22: сортировка sort() и sorted(), сортировка по ключам
Python 3 #23: обработка исключений: try, except, finally, else
Python 3 #24: файлы — чтение и запись: open, read, write, seek, readline, dump, load, pickle
Python 3 #25: форматирование строк: метод format и F-строки
Python 3 #26: создание и импорт модулей — import, from, as, dir, reload
Python 3 #27: пакеты (package) — создание, импорт, установка (менеджер pip)
Python 3 #28: декораторы функций и замыкания
Python 3 #29: установка и порядок работы в PyCharm
Python 3 #30: функция enumerate, примеры использования