diff --git a/config/_default/languages.ru.toml b/config/_default/languages.ru.toml index 0074ce7..6b976fa 100644 --- a/config/_default/languages.ru.toml +++ b/config/_default/languages.ru.toml @@ -10,7 +10,7 @@ title = "HFK" dateFormat = "2 January 2006" logo = "img/first_logo_transparent.png" # secondaryLogo = "img/secondary-logo.png" - description = "Мой чудесный сайт" + description = "Чудесный сайт" # copyright = "© 2024 HFK" [author] diff --git a/config/_default/menus.ru.toml b/config/_default/menus.ru.toml index bb4caf0..4f53516 100644 --- a/config/_default/menus.ru.toml +++ b/config/_default/menus.ru.toml @@ -15,9 +15,20 @@ pageRef = "posts" weight = 10 +[[main]] + name = "Python" + parent = "Конспекты" + pageRef = "series/python" + weight = 20 + [[main]] name = "Авторы" pageref = "authors" + weight = 11 + +[[main]] + name = "О HFK" + pageref = "about" weight = 12 #[[main]] diff --git a/config/_default/params.toml b/config/_default/params.toml index fd308c6..cc17911 100644 --- a/config/_default/params.toml +++ b/config/_default/params.toml @@ -27,7 +27,7 @@ smartTOC = true smartTOCHideUnfocusedChildren = true [header] - layout = "fixed" # valid options: basic, fixed, fixed-fill, fixed-gradient, fixed-fill-blur + layout = "fixed-fill-blur" # valid options: basic, fixed, fixed-fill, fixed-gradient, fixed-fill-blur [footer] showMenu = true diff --git a/content/_index.ru.md b/content/_index.ru.md index 0050fb8..1bdefd6 100644 --- a/content/_index.ru.md +++ b/content/_index.ru.md @@ -1,5 +1,5 @@ --- -title: "Добро пожаловать на мой сайт! :tada:" +title: ":tada:" --- ```py diff --git a/content/about/index.md b/content/about/index.md new file mode 100644 index 0000000..b726168 --- /dev/null +++ b/content/about/index.md @@ -0,0 +1,25 @@ +--- +title: "Hungry for Knowledge" +date: 2024-06-14 +draft: false +description: "" +showAuthor: false + +cascade: + showDate: false + showZenMode: false + showPagination: false + showTableOfContents: false +--- + +{{< lead >}} +Краткое описание мини-проекта HFK +{{< /lead >}} + +HFK (Hungry for Knowledge) – онлайн-ресурс, содержащий конспекты, статьи и проекты автора, охватывающие спектр тем, связанных с программированием и не только. + +Цели проекта: предоставить удобный доступ к материалам и создать портфолио. + +Планы на будущее: разместить проект, связанный с языком программирования Python; сделать свою первую полноценную статью. + +Проект HFK был выполнен с помощью генератора статических сайтов [Hugo](https://gohugo.io/) и темы [Blowfish](https://github.com/nunocoracao/blowfish). \ No newline at end of file diff --git a/content/authors/index.md b/content/authors/index.md index 963d938..15ab37a 100644 --- a/content/authors/index.md +++ b/content/authors/index.md @@ -6,6 +6,8 @@ description: "Sample for a multiple author setup" showAuthor: true cascade: + showDate: false showZenMode: false + showPagination: false --- diff --git a/content/posts/_index.ru.md b/content/posts/_index.ru.md index 45cb136..9d97606 100644 --- a/content/posts/_index.ru.md +++ b/content/posts/_index.ru.md @@ -13,5 +13,3 @@ cascade: {{< /lead >}} Здесь находятся мои конспекты о языке Python, программировании в целом и о других интересующих меня вещах - ---- diff --git a/content/posts/big_o/index.md b/content/posts/big_o/index.md index 98d3bcf..011bd9c 100644 --- a/content/posts/big_o/index.md +++ b/content/posts/big_o/index.md @@ -10,10 +10,10 @@ tags: ["big O", "algorythms", "python"] Всё про нотацию Big O на примерах базовых колллекций в Python {{< /lead >}} -Big O - нотация, использующаяся в программировании, информатике для описания сложности алгоритмов. Она характеризует, как быстро растёт время выполнения алгоритма с ростом объёма входных данных, используя для оценки верхнюю границу (наихудший исход). +Big O – нотация, использующаяся в программировании, информатике для описания сложности алгоритмов. Она характеризует, как быстро растёт время выполнения алгоритма с ростом объёма входных данных, используя для оценки верхнюю границу (наихудший исход). Примеры нотаций Big O в порядке убывания скорости выполнения соответствующих им алгоритмов: -* `O(1)`: Константная сложность. Читется как "сложность порядка 1". Время выполнения алгоритма не зависит от размера входных данных, т.е. если даже алгоритм выполняется постоянно в 3 шага, то он будет не O(3), а **O(1)**. Является идеальной с точки зрения производительности, однако зачастую недостидима. +* `O(1)`: Константная сложность. Читется как "сложность порядка 1". Время выполнения алгоритма не зависит от размера входных данных, т.е. если даже алгоритм выполняется постоянно в 3 шага, то он будет не O(3), а **O(1)**. Является идеальной с точки зрения производительности, однако зачастую недостижима. Примеры: - Доступ к элементу в массиве по индексу; - Вставка или удаление элемента в конец списка (очереди) фиксированной длины. @@ -70,8 +70,8 @@ Big O - нотация, использующаяся в программиров ### Неусщественное не учитывается При оценке сложности алгоритмов лучше игнорировать константы и несущественные части, от которых скорость выполнения практически не зависит. -Например, при оценке $5n^2 + 3n + 2$ можно откинуть $5$, $3n$, $2$. В результате мы получим `O(n^2)`. -Или при оценке $n^2 + n + log{n}$ оставляем самую значимую часть и получаем тот же`O(n^2)`. +Например, при оценке 5n^2 + 3n + 2 можно откинуть 5, 3n, 2. В результате мы получим `O(n^2)`. +Или при оценке n^2 + n + log(n) оставляем самую значимую часть и получаем тот же`O(n^2)`. --- ##
Сложность операций в Python
@@ -84,7 +84,7 @@ n - размер структуры данных |Получение элемента|`l[i]`|O(1)| |Присваивание значения элементу|`l[i] = 0`|O(1)| |Размер списка|`len(l)`|O(1)| -|Добавление элемента в конец списка|`l.append(5)`|O(1)|**Скорее всего это неверно**| +|Добавление элемента в конец списка|`l.append(5)`|O(1)|**Скорее всего это неверно**| |Удаление последнего элемента|`l.pop()`|O(1)|Аналогично `l.pop(-1)`| |Очищение списка|`l.clear()`|O(1)|Аналогично `l = []`| |Добавление нескольких элементов|`l1.extend(l2)`|O(len(n))|Прямая зависимость с размером l2| @@ -105,7 +105,7 @@ n - размер структуры данных --- ### Кортежи: -Нет смысла составлять таблицу, т.к. **кортежи** - те же самые списки, только неизменяемые. Поэтому к ним применимы все операции, не изменяют структуру данных, и они имеют такие же нотации сложности, как и списки. +Нет смысла составлять таблицу, т.к. **кортежи** - те же самые списки, только неизменяемые. Поэтому к ним применимы все операции, не изменяющие структуру данных, и они имеют такие же нотации сложности, как и списки. --- ### Множества: diff --git a/content/posts/collections/index.md b/content/posts/collections/index.md index 9decdaa..a2b5667 100644 --- a/content/posts/collections/index.md +++ b/content/posts/collections/index.md @@ -23,7 +23,7 @@ series_order: 1 `print(("NO", "YES")[num1.issuperset(num2)])` - в квадратных скобках мы получаем результат логического выражения (`True` - 1 или `False` - 0). Значит после кортежа будет либо `[0]`, либо `[1]` - индекс элемента, который мы выберем из самого кортежа. -Чтобы не использовать экранирование при работе с текстом, можно воспользоваться **raw strings**, т.е. вместо такого кода: `path = 'C:\\new\\text.txt'`, использовать такой: `path = r'C:\new\text.txt'`. +Чтобы не использовать экранирование при работе с текстом, можно воспользоваться **raw strings**, т.е. вместо такого кода: `path = 'C:\\new\\text.txt'`, использовать код: `path = r'C:\new\text.txt'`. При вызове метода мы используем скобки: (например) `close()`, а при вызове свойства (атрибута) скобок нет `closed`. Методы совершают действия, а свойства возвращают информацию об объекте. @@ -34,14 +34,18 @@ series_order: 1 --- ## **Списки** -**Списки изменяемы**; в них допускается выход на границы, просто возьмется весь список до конца; список может содержать элементы **разных типов данных**, списки - ссылочный тип даных. + **Списки изменяемы**; в них допускается выход на границы, просто возьмется весь список до конца; список может содержать элементы **разных типов данных**; списки - ссылочный тип даных. + Если мы хотим копировать список `letters = ['a', 'b', 'c', 'd']`, мы можем сделать это следующими способами: 1. `new_letters = letters[:]` 2. `new_letters = list(letters)` -3. `new_letters = letters.copy()` -Чтобы вывести список в одну строку, можно восползоваться методом `join()` или сделать так: `print(*student)` +3. `new_letters = letters.copy()` + +{{< alert "circle-info">}} +Чтобы вывести список в одну строку, можно восползоваться методом `join()` или распаковать `print(*student)` +{{< /alert >}} -Списочные методы: +Списочные методы и операторы: * метод `append()` добавляет новый элемент в конец списка; * метод `extend()` расширяет один список другим списком; * метод `insert()` вставляет значение в список в заданной позиции; @@ -55,21 +59,22 @@ series_order: 1 * оператор `del` позволяет удалять элементы списка по определенному индексу. Методы строк, работающие со списками: -* метод split() разбивает строку на слова, используя в качестве разделителя последовательность пробельных символов, символ табуляции (\t) или символ новой строки (\n). -* метод join() собирает строку из элементов списка, используя в качестве разделителя строку, к которой применяется метод. +* Метод `split()` разбивает строку на слова, используя в качестве разделителя последовательность пробельных символов, символ табуляции (`\t`) или символ новой строки (`\n`). +* Метод `join()` собирает строку из элементов списка, используя в качестве разделителя строку, к которой применяется метод. -* Если нужно получить очищенную от знаков препинания и заглавных букв строку, можно воспользоваться этим кодом: `text = [word.strip('.,!?:;-') for word in input().lower().split()]` +{{< alert "circle-info">}} +Если нужно получить очищенную от знаков препинания и заглавных букв строку, можно воспользоваться следующей конструкцией: `text = [word.strip('.,!?:;-') for word in input().lower().split()]` +{{< /alert >}} --- ## **Матрицы** -Индексы i и j элементов на главной диагонали квадратной матрицы связаны соотношением i = j. Индексы i и j элементов на побочной диагонали связаны соотношением i + j + 1 = n (или j = n - i - 1), где n — размерность матрицы. +Индексы i и j элементов на главной диагонали квадратной матрицы связаны соотношением i = j. На побочной диагонали: i + j + 1 = n (или j = n - i - 1), где n — размерность матрицы. Заметим также, что: -- если элемент находится выше главной диагонали, то i < j, если ниже - i > j. +- если элемент находится выше главной диагонали, то i < j, если ниже – i > j. - если элемент находится выше побочной диагонали, то i + j + 1 < n, если ниже - i + j + 1 > n. -Способы задать матрицы: -Если вводим элементы построчно +Если мы вводим элементы построчно, то может задать матрицу так: ```py n, m = [int(i) for i in input().split()] matrix = [[int(i) for i in input().split()] for _ in range(n)] @@ -78,19 +83,21 @@ matrix = [[int(i) for i in input().split()] for _ in range(n)] --- ## **Кортежи** -Кортежи ялвяются неизменяемыми списками. В литеральной форме кортеж записывается в виде последовательности элементов в круглых скобках, а список – в квадратных. -Для создания кортежа с единственным элементом после значения элемента ставят замыкающую запятую: -`my_tuple = (1,)` -Функции, возвращающие несколько значений, возвращают кортеж. +Кортежи являются неизменяемыми списками. В литеральной форме кортеж записывается в виде последовательности элементов в круглых скобках, а список – в квадратных. +Для создания кортежа с единственным элементом после значения элемента ставят замыкающую запятую: `my_tuple = (1,)`. Важно понимать: список внутри кортежа можно изменить. Списки являются ссылочными типами данных, поэтому в кортеже хранится ссылка на список, которая не меняется при изменении самого списка. +{{< alert "circle-info" >}} +Функции, возвращающие несколько значений, возвращают кортеж. +{{< /alert >}} + Кортежи поддерживают: * доступ к элементу по индексу (только для получения значений элементов); -* методы, в частности index(), count(); -* встроенные функции, в частности len(), sum(), min() и max(); +* методы, в частности `index()`, `count()`; +* встроенные функции, в частности `len()`, `sum()`, `min()` и `max()`; * срезы; -* оператор принадлежности in; -* операторы конкатенации (+) и повторения (*). +* оператор принадлежности `in`; +* операторы конкатенации (`+`) и повторения (`*`). Чтобы присвоить переменным значения элементов кортежа, можно воспользоваться следующим кодом (кол-во переменных должно совпадать с кол-вом элементов кортежа): ```py @@ -98,35 +105,37 @@ colors = ('red', 'green', 'blue', 'cyan') (a, b, c, d) = colors # Скобки можно опустить ``` -Однако, если необходимо получить лишь какие-то отдельные значения, то в качестве "ненужных" переменных позволено использовать символ нижнего подчеркивания _. +Однако, если необходимо получить лишь какие-то отдельные значения, то в качестве "ненужных" переменных позволено использовать символ нижнего подчеркивания `_`. Есть способ собрать сразу несколько значений в одну переменную. Это делается при помощи звездочки перед именем переменной. -`a, b, *tail = 1, 2, 3, 4, 5, 6` - в этом случае в переменной a будет записана единица, в переменной b — двойка, а в переменной tail — **список**, состоящий из всех аргументов, которые не попали в предыдущие переменные. В данном случае tail будет равен [3, 4, 5, 6]. **tail всегда будет списком, даже когда в него попадает лишь один элемент или даже ноль.** +`a, b, *tail = 1, 2, 3, 4, 5, 6` - в этом случае в переменной `a` будет записана единица, в переменной `b` — двойка, а в переменной `tail` — **список**, состоящий из всех аргументов, которые не попали в предыдущие переменные. В данном случае `tail` будет равен `[3, 4, 5, 6]`. **`tail` всегда будет списком, даже когда в него попадает лишь один элемент или даже ноль.** Звездочка может быть только у одного аргумента, но необязательно у последнего. -Если нужно распаковать единственной значение в кортеже, после имени переменной должна идти запятая. Приведенный ниже код: +Если нужно распаковать единственное значение в кортеже, после имени переменной должна идти запятая. Приведенный ниже код: ```py -a = 1, # не распаковка, а просто присвоение -b, = 1, # распаковка +a = 1, # не распаковка, а просто присвоение +b, = 1, # распаковка print(a) print(b) ``` -выводит: -```py + +``` +# Вывод: (1,) 1 ``` -**Также можно распаковывать и список, и строку** +{{< alert "circle-info" >}} +Таким же образом можно распаковывать и список, и строку +{{< /alert >}} --- ## **Множества** ### Общая информация Множество – структура данных, организованная так же, как математические множества. -Важно знать: - +Особенности: - все элементы множества различны (уникальны), два элемента не могут иметь одинаковое значение; - множества неупорядочены, то есть элементы не хранятся в каком-то определенном порядке; - элементы множества должны относиться к неизменяемым типам данных; @@ -138,28 +147,33 @@ numbers = {2, 4, 6, 8, 10} languages = {"Python", "C#", "C++", "Java"} ``` Пустое множество создаётся, например, через `set()`. -При выводе множества порядок элементов может отличаться от существовавшего при его создании, поскольку множества — неупорядоченные коллекции данных. +При выводе множества порядок элементов может отличаться от существовавшего при его создании, поскольку множества — неупорядоченные коллекции данных. -Встроенная функция set() помимо создания пустого множества может преобразовывать некоторые типы объектов в множества. -В функцию set() можно передать один аргумент. Передаваемый аргумент должен быть итерируемым объектом, таким как список, кортеж или строковое значение. Отдельные элементы объекта, передаваемого в качестве аргумента, становятся элементами множества: +Встроенная функция `set()` помимо создания пустого множества может преобразовывать некоторые типы объектов в множества. +В неё можно передать один аргумент, который, в свою очередь, должен быть итерируемым объектом (таким как список, кортеж или строковое значение). Отдельные элементы объекта, передаваемого в качестве аргумента, становятся элементами множества: ```py -myset1 = set(range(10)) # множество из элементов последовательности -myset2 = set([1, 2, 3, 4, 5]) # множество из элементов списка -myset3 = set('abcd') # множество из элементов строки -myset4 = set((10, 20, 30, 40)) # множество из элементов кортежа +myset1 = set(range(10)) # множество из элементов последовательности +myset2 = set([1, 2, 3, 4, 5]) # множество из элементов списка +myset3 = set('abcd') # множество из элементов строки +myset4 = set((10, 20, 30, 40)) # множество из элементов кортежа ``` -Попытка добавить в множество кортеж со списком приведёт к ошибке: + +{{< alert icon="fire" cardColor="#e63946" iconColor="#1d3557" textColor="#f1faee" >}} +Попытка добавить в множество кортеж со списком приведёт к ошибке! +{{< /alert >}} ```py mytuple = ([1, 2, 3], [4, 5, 6]) myset = set(mytuple) +``` +``` # Вывод: TypeError: unhashable type: 'list' ``` Если требуется создать множество, в котором каждый элемент — строковое значение, содержащее более одного символа, то используем код: `myset = set(['aaa', 'bbbb', 'cc'])`. -Проверить принадлежит ли какой-либо объект множеству можно с помощью оператора `in`. +Проверить принадлежит ли какой-либо объект множеству можно с помощью оператора `in`: ```py tremendously_huge_set = {"red", "green", "blue"} @@ -168,11 +182,10 @@ if "green" in tremendously_huge_set: else: print("Unfortunately, there is no green...") -# Вывод: -Green is there! +# Вывод: Green is there! ``` -**Индексация, конкатенация, умножение на число и срезы недоступны для множеств**, а значит перебор элементов по индексу не получится, поэтому в цикле, например, мы должны перебирать сами элементы из множества. +**Индексация, конкатенация, умножение на число и срезы недоступны для множеств**, а значит перебор элементов по индексу не получится, поэтому, например, в цикле, мы должны перебирать сами элементы из множества. Чтобы вывести все элементы множества, мы можем его распаковать (при этом не гарантируется, что вывод будет упорядоченным): ```py numbers = {0, 1, 1, 2, 3, 3, 3, 5, 6, 7, 7} @@ -181,7 +194,7 @@ print(*numbers, end=' ') # Вывод: 0 1 1 2 3 3 3 5 6 7 7 ``` -Если мы хотим упорядочить вывод множества, можем воспользоваться встроенной функцией `sorted()` (которая возвращает список): +Если мы хотим упорядочить вывод множества, можем воспользоваться встроенной функцией `sorted()` (возвращает список): ```py numbers = {0, 1, 1, 2, 3, 3, 3, 5, 6, 7, 7} @@ -199,7 +212,7 @@ print(*sorted_numbers, end=' ') - Метод `pop()` удаляет и возвращает случайный элемент из множества с генерацией исключения (ошибки) при попытке удаления из пустого множества; - Метод `clear()` удаляет все элементы из множества. -#### Методы, НЕ изменяющие множества +#### Методы, НЕ изменяющие сами множества 1. `union()` - объединение множеств. ```py myset1 = {1, 2, 3, 4, 5} @@ -219,13 +232,13 @@ print(myset3) ``` 2. `intersection()` - пересечение множеств. -Для пересечения двух множеств можно также использовать оператор `&`. +Альтернатива: оператор `&`. 3. `difference()` - разность множеств. -Для разности двух множеств можно также использовать оператор `-`. +Альтернатива: оператор `-`. 4. `symmetric_difference()` - симметрическая разность множеств. -Для симметрической разности двух множеств можно также использовать оператор `^`. +Альтернатива: оператор `^`. #### Методы, ИЗМЕНЯЮЩИЕ множества 1. `update()` - изменяет исходное множество по объединению. @@ -240,7 +253,7 @@ print(myset3) 4. `symmetric_difference_update()` - изменяет исходное множество по симметрической разности. Аналогичный результат получается, если использовать оператор `^=`. -Все основные операции над множествами выполняются двумя способами: при помощи метода или соответствующего ему оператора. Различие заключается в том, что метод может принимать в качестве аргумента не только множество (тип данных `set`), но и любой итерируемый объект (список, строку, кортеж..). +Все основные операции над множествами выполняются двумя способами: при помощи метода или соответствующего ему оператора. Различие заключается в том, что метод может принимать в качестве аргумента не только множество (тип данных `set`), но и любой итерируемый объект (список, строку, кортеж и т.д.) ```py mylist = [2021, 2020, 2019, 2018, 2017, 2016] mytuple = (2021, 2020, 2016) @@ -248,18 +261,20 @@ mystr = 'abcd' myset = {2009, 2010, 2016} -print(myset.union(mystr)) # объединяем со строкой -print(myset.intersection(mylist)) # пересекаем со списком -print(myset.difference(mytuple)) # находим разность с кортежем +print(myset.union(mystr)) # объединяем со строкой +print(myset.intersection(mylist)) # пересекаем со списком +print(myset.difference(mytuple)) # находим разность с кортежем +``` +``` # Вывод: {2016, 'c', 'b', 'a', 'd', 2009, 2010} {2016} {2009, 2010} ``` -Некоторые методы (union(), intersection(), difference()) и операторы (|, &, -, ^) позволяют совершать операции над несколькими множествами сразу. -Оператор ^ симметрической разности позволяет использовать несколько множеств, а метод symmetric_difference() – нет. +Некоторые методы (`union()`, `intersection()`, `difference()`) и операторы (`|`, `&`, `-`, `^`) позволяют совершать операции над несколькими множествами сразу. +Оператор `^` симметрической разности позволяет использовать несколько множеств, а метод `symmetric_difference()` – нет. Приоритет операторов в порядке убывания (верхние операторы имеют более высокий приоритет, чем нижние): |Оператор|Описание| @@ -269,18 +284,17 @@ print(myset.difference(mytuple)) # находим разность |`^`|симметрическая разность| |`\|`|объединение| -#### Методы, связанные с подмножествами и пр. +#### Другие методы * `issubset()` - используется для определения, является ли одно из множеств подмножеством другого. Возвращает `True` или `False`. ```py set1 = {2, 3} set2 = {1, 2, 3, 4, 5, 6} print(set1.issubset(set2)) -# Вывод: -True +# Вывод: True ``` -Для определения, является ли одно из множеств подмножеством другого, также применяются операторы `<=` (нестрогое подмножество) и `<` (строгое подмножество). Следующий код аналогичен предыдущему: +Для определения, является ли одно из множеств подмножеством другого, также применяются операторы `<=` (нестрогое подмножество) и `<` (строгое подмножество). Следующий код аналогичен предыдущему по функционалу: ```py set1 = {2, 3} set2 = {1, 2, 3, 4, 5, 6} @@ -288,11 +302,11 @@ print(set1 <= set2) ``` * `issuperset()` - используется для определения, является ли одно из множеств надмножеством другого. Возвращает `True` или `False`. -Для определения, является ли одно из множеств надмножеством другого, также применяются операторы `>=` (нестрогое надмножество) и `>` (строгое надмножество). +В качестве альтернативы используются операторы `>=` (нестрогое надмножество) и `>` (строгое надмножество). * `isdisjoint()` - используется для определения отсутствия общих элементов в множествах. Возвращает `True` или `False`. -Эти методы могут принимать в качестве аргумента не только `set()`, но и любой итерируемый объект (список, строку, кортеж...). Сами же эти методы могут применяться только к `set()` или неизменяемому множеству (тип данных `frozenset`). При этом операторы `>`, `<`, `>=`, `<=` требуют наличия в качестве операндов множества. +Данные методы могут принимать в качестве аргумента не только `set()`, но и любой итерируемый объект (список, строку, кортеж...). В то же время они могут применяться только к `set()` или неизменяемому множеству (тип данных `frozenset`). При этом операторы `>`, `<`, `>=`, `<=` требуют наличия в качестве операндов множества. --- ### Генератор множеств @@ -301,11 +315,10 @@ print(set1 <= set2) `{выражение for переменная in последовательность}`, -где выражение — некоторое выражение, как правило, зависящее от использованной в списочном выражении переменной, которым будут заполнены элементы множества переменная — имя некоторой переменной, последовательность — последовательность значений, которые она принимает (любой итерируемый объект). +где выражение – некоторое выражение, как правило, зависящее от использованной в списочном выражении переменной, которым будут заполнены элементы множества; переменная – имя некоторой переменной; последовательность – последовательность значений, которые она принимает (любой итерируемый объект). -В генераторах множеств можно использовать условный оператор. Например, если требуется создать множество, заполненное только цифрами некоторой строки, то мы можем написать такой код: -`digits = {int(d) for d in 'abcd12ef78ghj90' if d.isdigit()}` -Если же нужно включить `else`, то условие нужно включить до самого цикла: +В генераторах множеств можно использовать условный оператор. Например, если требуется создать множество, заполненное только цифрами некоторой строки, то мы можем написать такой код: `digits = {int(d) for d in 'abcd12ef78ghj90' if d.isdigit()}` +Если же нужно включить `else`, то используется тернарный условный опреатор: `alnums = {int(d) if d.isdigit() else ord(d) for d in 'abcd12ef78ghj90'}` --- @@ -317,15 +330,21 @@ myset2 = frozenset([1, 1, 2, 3, 4, 4, 4, 5, 6, 6]) # на основе спи myset3 = frozenset('aabcccddee') # на основе строки ``` -Над замороженными множествами можно производить все операции, которые можно производить над обычными множествами (конечно, если операция не изменяет исходное множество). Результатом операций над замороженными множествами будут тоже замороженные множества. -Будучи изменяемыми, обычные множества не могут быть элементами других множеств. Замороженные множества являются неизменяемыми, а значит могут быть элементами других множеств. \ +Над замороженными множествами можно производить все операции, которые можно производить над обычными множествами (само собой, если операция не изменяет исходное множество). Результатом операций над замороженными множествами будут также замороженные множества. +Будучи изменяемыми, обычные множества не могут быть элементами других множеств. Замороженные множества являются неизменяемыми, а значит могут быть элементами других множеств. + +{{< alert "circle-info" >}} Сравнивать обычные и неизменяемые множества **можно**. +{{< /alert >}} --- ## **Словари** ### Общая информация Словари (тип данных `dict`) – изменяемые коллекции элементов с произвольными индексами – **ключами**. Если в списках элементы индексируются целыми числами, начиная с 0, то в словарях — уникальными ключами, в том числе в виде строк. + +{{< alert icon="bars" >}} Словарь — реализация структуры данных "ассоциативный массив" или "хеш таблица". +{{< /alert >}} В словорях **нет** привычных индексов (0, 1, 2, ...)! @@ -333,7 +352,7 @@ myset3 = frozenset('aabcccddee') # на основе стр Словари принципиально отличаются от списков по структуре хранения в памяти. Список — последовательная область памяти, то есть все его элементы (указатели на элементы) действительно хранятся в указанном порядке, расположены последовательно. Благодаря этому и можно быстро «прыгнуть» к элементу по его индексу. В словаре же используется специальная структура данных — хеш-таблица. Она позволяет вычислять числовой хеш от ключа и использовать обычные списки, где в качестве индекса элемента берется этот хеш. -Чтобы создать словарь, нужно перечислить его элементы – пары ключ-значение – через запятую в фигурных скобках, как и элементы множества. Первым указывается ключ, после двоеточия — значение, доступное в словаре по этому ключу. Приведенный ниже код создает словарь, в котором ключом служит строка — название языка программирования, а значением — имя создателя языка. +Чтобы создать словарь, нужно перечислить его элементы (пары ключ-значение) через запятую в фигурных скобках, как и элементы множества. Первым указывается ключ, после двоеточия – значение, доступное в словаре по этому ключу. Приведенный ниже код создает словарь, в котором ключом служит строка – название языка программирования, а значением – имя создателя языка. ```py languages = {'Python': 'Гвидо ван Россум', 'C#': 'Андерс Хейлсберг', @@ -346,12 +365,12 @@ languages = {'Python': 'Гвидо ван Россум', print('Создателем языка C# является', languages['C#']) ``` -В качестве ключа можно указать выражение: Python вычислит его значение и обратится к искомому элементу. +В качестве ключа можно указать выражение. Python вычислит его значение и обратится к искомому элементу: ```py print('Создателем языка C# является', languages['C' + '#']) ``` -Если ключи словаря — строки без каких-либо специальных символов, то для создания словаря можно использовать функцию `dict()`. Приведённый ниже код создает словарь с тремя элементами, ключами которого служат строки 'name', 'age', 'job', а значениями – 'Timur', 28, 'Teacher'. +Если ключи словаря – строки без каких-либо специальных символов, то для создания словаря можно использовать функцию `dict()`. Приведённый ниже код создает словарь с тремя элементами, ключами которого служат строки 'name', 'age', 'job', а значениями – 'Timur', 28, 'Teacher'. ```py info = dict(name = 'Timur', age = 28, job = 'Teacher') ``` @@ -401,7 +420,9 @@ for key in capitals: ```py for key in capitals.keys(): # итерируем по списку ["Россия", "Франция", "Чехия"] print(key) +``` +``` # Вывод: Россия Франция @@ -412,7 +433,9 @@ for key in capitals.keys(): # итерируем по списку ["Росси * Словарный метод `items()` возвращает список всех элементов словаря, состоящий из кортежей пар (ключ, значение). -Примечание: Словарные методы `items()`, `keys()`, `values()` возвращают не совсем обычные списки. Типы этих списков – `dict_items`, `dict_keys`, `dict_values`, соответственно, в отличие от обычных списков `list`. Методы обычных списков недоступны для списков типа `dict_items`, `dict_keys`, `dict_values`. Нужно использовать явное преобразование с помощью функции `list()` для получения доступа к методам списков. +{{< alert "circle-info" >}} +Словарные методы `items()`, `keys()`, `values()` возвращают не совсем обычные списки. Типы этих списков – `dict_items`, `dict_keys`, `dict_values`, соответственно, в отличие от обычных списков `list`. Методы обычных списков недоступны для списков типа `dict_items`, `dict_keys`, `dict_values`. Нужно использовать явное преобразование с помощью функции `list()` для получения доступа к методам списков. +{{< /alert >}} Если требуется вывести только ключи словаря, то мы так же можем использовать операцию распаковки словаря: `print(*capitals, sep="\n")` @@ -429,7 +452,7 @@ for key, value in sorted(capitals.items(), key=lambda x: x[1]): ``` --- -### Методы словарей +### Методы и операторы словарей Чтобы изменить значение по определенному ключу в словаре, достаточно использовать индексацию вместе с оператором присваивания. При этом если ключ уже присутствует в словаре, его значение заменяется новым, если же ключ отсутствует – то в словарь будет добавлен новый элемент. ```py info = {'name': 'Sam', @@ -442,7 +465,7 @@ info['email'] = 'timyr-guev@yandex.ru' # добавляем в словарь print(info) ``` -* Для того чтобы избежать возникновения ошибки в случае отсутствия ключа в словаре, можно использовать метод `get()`, способный кроме ключа принимать и второй аргумент — значение, которое вернется, если заданного ключа нет. Когда второй аргумент не указан, то метод в случае отсутствия ключа возвращает `None`. +* Для того чтобы избежать возникновения ошибки в случае отсутствия ключа в словаре, можно использовать метод `get()`, способный кроме ключа принимать и второй аргумент – значение, которое вернется, если заданного ключа нет. Когда второй аргумент не указан, то метод в случае отсутствия ключа возвращает `None`. ```py info = {'name': 'Bob', 'age': 25, @@ -453,7 +476,9 @@ item2 = info.get('salary', 'Информации о зарплате нет') print(item1) print(item2) +``` +``` # Вывод: None Информации о зарплате нет @@ -473,16 +498,21 @@ info1.update(info2) print(info1) -# Вывод -{'name': 'Bob', 'age': 30, 'job': 'Dev', 'city': 'New York', 'email': 'bob@web.com'} +# Вывод: {'name': 'Bob', 'age': 30, 'job': 'Dev', 'city': 'New York', 'email': 'bob@web.com'} + ``` +{{< alert "circle-info" >}} В Python 3.9 появились операторы | и |=, которые реализуют операцию конкатенации словарей. +{{< /alert >}} * Метод `setdefault()` позволяет получить значение из словаря по заданному ключу, автоматически добавляя элемент словаря, если он отсутствует. Метод принимает два аргумента: 1. key: ключ, значение по которому следует получить, если таковое имеется в словаре, либо создать. 2. default: значение, которое будет использовано при добавлении нового элемента в словарь. -**Важно:** `get()` только получает значение, не меняя словарь, в то время как `setdefault()` не только получает значение, но и изменяет словарь. + +{{< alert >}} +**Важно!** `get()` только получает значение, не меняя словарь, в то время как `setdefault()` не только получает значение, но и изменяет словарь. +{{< /alert >}} * С помощью оператора `del` можно удалять элементы словаря по ключу: `del info['email']` (если удаляемого ключа в словаре нет, возникнет ошибка `KeyError`). * Метод `pop()` удаляет элемент словаря по ключу, возвращая его значение: `email = info.pop('email')` (при отутствии ключа также возвращает ошибку, если не передать второй аргумент). @@ -499,7 +529,7 @@ print(info1) Общий вид: `{ключ: значение for переменная in последовательность}` **Примеры использования:** -* Чтобы создать словарь, где ключи - числа от 0 до 5, а значения - квадраты ключей, можем воспользоваться след. кодом: `squares = {i: i**2 for i in range(6)}`; +* Чтобы создать словарь, где ключи – числа от 0 до 5, а значения – квадраты ключей, можем воспользоваться следующим кодом: `squares = {i: i**2 for i in range(6)}`; * Для вычисления ключа и значения в генераторе словаря могут быть использованы выражения: ```py lst = ['ReD', 'GrEeN', 'BlUe'] @@ -507,8 +537,7 @@ dct = {c.lower(): c.upper() for c in lst} print(dct) -# Вывод -{'red': 'RED', 'green': 'GREEN', 'blue': 'BLUE'} +# Вывод: {'red': 'RED', 'green': 'GREEN', 'blue': 'BLUE'} ``` * Извлечение из словаря элементов с определенными ключами: @@ -520,8 +549,7 @@ dict2 = {k: dict1[k] for k in selected_keys} print(dict2) -# Вывод -{0: 'A', 2: 'C', 5: 'F'} +# Вывод: {0: 'A', 2: 'C', 5: 'F'} ``` * Мы также можем использовать генераторы словарей для создания вложенных словарей: @@ -530,8 +558,10 @@ squares = {i: {j: j**2 for j in range(i + 1)} for i in range(5)} for value in squares.values(): print(value) +``` -# Вывод +``` +# Вывод: {0: 0} {0: 0, 1: 1} {0: 0, 1: 1, 2: 4} diff --git a/content/posts/frac_dec_compl/index.md b/content/posts/frac_dec_compl/index.md index a2de26d..309c3c4 100644 --- a/content/posts/frac_dec_compl/index.md +++ b/content/posts/frac_dec_compl/index.md @@ -18,28 +18,28 @@ series_order: 3 Если мы хотим сравнить два числа `float`, то нужно воспользоваться кодом ниже вместо обычного сравнения `==`, так как существуют ограничения в сохранении точного значения чисел: ```py num = 0.1 + 0.1 + 0.1 -eps = 0.000000001 # точность сравнения +eps = 0.000000001 # точность сравнения -if abs(num - 0.3) < eps: # число num отличается от числа 0.3 менее чем 0.000000001 +if abs(num - 0.3) < eps: # число num отличается от числа 0.3 менее чем 0.000000001 print('YES') else: print('NO') ``` Особенности и характеристики: -* Тип данных `Decimal` - класс из модуля decimal, который тоже представляет собой число с плавающей точкой, и служит для того, чтобы выполнять операции над вещественными числами точно. -* С ними работают все привычные операции (сложение, умножение и т.д., но не реккомендуется оперировать между `Decimal` и `float`), их можно передавать как аргумент в математические функции (при этом вернётся `float`), их можно сравнивать между собой (также допускается точное равенство), можно формировать списки из `Decimal` и искать среди них `min` и `max`. +* Тип данных `Decimal` - класс из модуля `decimal`, который тоже представляет собой число с плавающей точкой, и служит для того, чтобы выполнять операции над вещественными числами без ошибок. +* С ними работают все привычные операции (сложение, умножение и т.д., но не реккомендуется оперировать между `Decimal` и `float`), их можно передавать как аргумент в математические функции (при этом вернётся `float`), их можно сравнивать между собой (также допускается точное равенство), можно формировать списки из `Decimal` и искать среди них `min` и `max`. * Тип данных `Decimal` является **неизменяемым**. Отличие `float` и `Decimal`: В Python тип данных `float` реализован по стандарту IEEE-754 как число с плавающей точкой двойной точности (64 бита) с основанием экспоненты равным 2. Так как `float` поддерживается аппаратно, быстродействие при использовании этого типа данных сравнительно велико. -Тип данных `Decimal` – число с плавающей точкой с основанием экспоненты 10 Он реализован по стандарту IBM: General Decimal Arithmetic Specification, в свою очередь основанному на стандартах IEEE. Тип данных `Decimal` реализован программно, поэтому он в разы медленнее типа данных `float`, реализованного аппаратно. Сам тип данных `Decimal` написан на языке `С`. +Тип данных `Decimal` – число с плавающей точкой с основанием экспоненты 10 Он реализован по стандарту IBM: General Decimal Arithmetic Specification, в свою очередь основанному на стандартах IEEE. Тип данных `Decimal` реализован программно, поэтому он в разы медленнее типа данных `float`. Сам тип данных `Decimal` написан на языке `С`. | Характеристика / тип | float | Decimal | -| :--: | :---: | :---: | +| :-- | :---: | :---: | | Реализация | аппаратная | программная | | Размер | 64 бит | не ограничен | -| Основные экспоненты | 2 | 10 | +| Основание экспоненты | 2 | 10 | | Скорость | ✔️ | ❌ | | Настриваемость | ❌ | ✔️ | | Для высокоточных вычислений | ❌ | ✔️ | @@ -60,7 +60,7 @@ d4 = Decimal('12345') d5 = Decimal('52.198') ``` -При создании Decimal чисел из чисел с плавающей точкой (float) возникают проблемы, так как float числа округляются внутри до ближайшего возможного, а Decimal об этом ничего не знает и копирует содержимое float: +При создании `Decimal` чисел из чисел с плавающей точкой (`float`) возникают проблемы, так как `float` числа округляются внутри до ближайшего возможного, а `Decimal` об этом ничего не знает и копирует содержимое `float`: ```py from decimal import * @@ -68,8 +68,7 @@ num = Decimal(0.1) print(num) -# Вывод: -0.1000000000000000055511151231257827021181583404541015625 +# Вывод: 0.1000000000000000055511151231257827021181583404541015625 ``` --- @@ -77,22 +76,11 @@ print(num) * У `Decimal` есть некоторые встроенные математические методы: |Функция|Описание| -|:--:|:--:| +|:--:|:--| |`sqrt()`|вычисляет квадратный корень из `Decimal` числа| -|`exp()`|озвращает $e^x$ для `Decimal` числа| -|`ln()`|вычисляет натуральный логарифм (по основанию e) `Decimal` числа| -|`log10()`|вычисляет десятичный логарифм (по основанию 10) `Decimal` числа| - -```py -from decimal import * - -num = Decimal('10.0') - -print(num.sqrt()) -print(num.exp()) -print(num.ln()) -print(num.log10()) -``` +|`exp()`|возвращает e^x для `Decimal` числа| +|`ln()`|вычисляет натуральный логарифм `Decimal` числа| +|`log10()`|вычисляет десятичный логарифм `Decimal` числа| * `as_tuple()` - возвращает кортеж из 3-ёх элементов: * `sign` – знак числа (0 для положительного числа и 1 для отрицательного числа); @@ -111,8 +99,10 @@ print(num2.as_tuple()) print(num1_tuple.sign) print(num1_tuple.digits) print(num1_tuple.exponent) +``` -# Вывод +``` +# Вывод: DecimalTuple(sign=1, digits=(1, 4, 5, 6, 8, 7, 6, 9, 0, 1, 7), exponent=-10) DecimalTuple(sign=0, digits=(5, 2, 3), exponent=-3) 1 @@ -126,29 +116,32 @@ from decimal import * print(getcontext()) -# Вывод: -Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, -flags=[], traps=[InvalidOperation, DivisionByZero, Overflow]) +# Вывод: Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow]) ``` * `quantize()` - принимает в качетсве аргумента объект `Decimal`, указывающий на формат округления: ```py from decimal import * -getcontext().prec = 4 # устанавливаем точность числа +getcontext().prec = 4 # устанавливаем точность числа num = Decimal('3.1415926535') -print(num.quantize(Decimal('1.000'))) # округление до 3 цифр в дробной части -print(num.quantize(Decimal('1.00'))) # округление до 2 цифр в дробной части -print(num.quantize(Decimal('1.0'))) # округление до 1 цифр в дробной части +print(num.quantize(Decimal('1.000'))) # округление до 3 цифр в дробной части +print(num.quantize(Decimal('1.00'))) # округление до 2 цифр в дробной части +print(num.quantize(Decimal('1.0'))) # округление до 1 цифр в дробной части ``` + +{{< alert icon="fire" cardColor="#e63946" iconColor="#1d3557" textColor="#f1faee" >}} При этом, если точность числа установлена в 2, а формат округления `Decimal('1.00')`, то возникнет ошибка. +{{< /alert >}} + + В качетсве второго параметра этот метод принимает стратегию округления: -`ROUND_CEILING` – округление в направлении бесконечности (Infinity); -`ROUND_FLOOR` – округляет в направлении минус бесконечности (- Infinity); -`ROUND_DOWN` – округление в направлении нуля; +`ROUND_CEILING` – округление в сторону бесконечности (Infinity); +`ROUND_FLOOR` – округляет в сторону минус бесконечности (- Infinity); +`ROUND_DOWN` – округление в сторону нуля; `ROUND_HALF_EVEN` – округление до ближайшего четного числа, число 6.5 округлится не до 7, а до 6; `ROUND_HALF_DOWN` – округление до ближайшего нуля; `ROUND_UP` – округление от нуля; @@ -160,7 +153,9 @@ num = Decimal('3.456') print(num.quantize(Decimal('1.00'), ROUND_CEILING)) print(num.quantize(Decimal('1.00'), ROUND_FLOOR)) +``` +``` # Вывод: 3.46 3.45 @@ -170,15 +165,17 @@ print(num.quantize(Decimal('1.00'), ROUND_FLOOR)) ## **Модуль fractions** Для использования: `from fractions import Fraction` +Тип данных `Fraction` представляет из себя рациональное число в виде дроби. + Особенности и характеристики: -* `Fraction` - тип данных для работы с рациональными числами в Python. Он, как и `Decimal`, реализован программно, поэтому он в разы медленнее встроенных числовых типов данных `int` и `float`. +* `Fraction`, как и `Decimal`, реализован программно, поэтому он в разы медленнее встроенных числовых типов данных `int` и `float`. * Тип данных `Fraction` неизменяемый. * Операции над данными этого типа приводят к созданию новых объектов, при этом старые не меняются. `Fraction` числа можно сравнивать между собой точно так же, как и любые другие числа (также можно сравнить `Fraction` и целые числа без явного приведения типов); с ним работат все арифметические операции (возведение в степень может вернуть `float`). * При создании рационального числа Fraction, автоматически происходит сокращение числителя и знаменателя дроби, а если результат - целое число, то оно и будет выведено. * `Fraction` числа можно передавать как аргументы функций, ожидающих `float`. Тогда они будут преобразованы во `float`. К примеру, модуль `math`, оперирующий `float` числами, может работать и с `Fraction` числами (возвращать функции будут `float`). -Создать Fraction число можно несколькими способами: -- из целых чисел, передав значения числителя и знаменателя дроби, +Создать `Fraction` число можно несколькими способами: +- из целых чисел, передав значения числителя и знаменателя дроби; - из строки на основании десятичного представления; - из строки на основании обыкновенной дроби; - из числа с плавающей точкой (не рекомендуется, так как в `Fraction` попадет уже неправильно округленное число). @@ -186,7 +183,7 @@ print(num.quantize(Decimal('1.00'), ROUND_FLOOR)) ```py from fractions import Fraction -num1 = Fraction(3, 4) # 3 - числитель, 4 - знаменатель +num1 = Fraction(3, 4) # 3 – числитель, 4 – знаменатель num2 = Fraction('0.55') num3 = Fraction('1/9') ``` @@ -201,14 +198,16 @@ num = Fraction('5/16') print('Числитель дроби равен:', num.numerator) print('Знаменатель дроби равен:', num.denominator) +``` +``` # Вывод: Числитель дроби равен: 5 Знаменатель дроби равен: 16 ``` -* `as_integer_ratio()` - возвращает кортеж, состоящий из числителя и знаменателя данного `Fraction` числа. -* `limit_denominator()` - возвращает самую близкую к данному числу рациональную дробь, чей знаменатель не превосходит переданного аргумента: +* `as_integer_ratio()` – возвращает кортеж, состоящий из числителя и знаменателя данного `Fraction` числа. +* `limit_denominator()` – возвращает самую близкую к данному числу рациональную дробь, чей знаменатель не превосходит переданного аргумента: ```py from fractions import Fraction import math @@ -222,7 +221,9 @@ print('No limit =', num) for d in [1, 5, 50, 90, 100, 500, 1000000]: limited = num.limit_denominator(d) print(limited) +``` +``` # Вывод: PI = 3.141592653589793 No limit = 3141592653589793/1000000000000000 @@ -235,7 +236,9 @@ No limit = 3141592653589793/1000000000000000 3126535/995207 ``` -В Python нельзя совершать арифметические операции (+, -, *, /) между типами Decimal и Fraction.** +{{< alert "circle-info" >}} +В Python нельзя совершать арифметические операции (+, -, *, /) между типами Decimal и Fraction. +{{< /alert >}} --- ## **Комплексные числа в Python** @@ -255,7 +258,9 @@ z4 = 1.5 + 3.2j print(z1, z2, z3, z4, sep='\n') print(type(z1)) +``` +``` # Вывод: (5+7j) 1j @@ -264,7 +269,7 @@ print(type(z1)) ``` -Комплексные числа можно создать с помощью литерала, как выше, а можно с помощью функции `complex()`, которая принимает два аргумента: вещественную и мнимую часть числа, либо строковое представление числа. +Комплексные числа можно создать с помощью литерала, как выше, а можно с помощью функции `complex()`, которая принимает два аргумента: вещественную и мнимую часть числа, либо строковое представление числа: ```py z1 = -3 + 2j # создание на основе литерала z2 = complex(6, -8) # z2 = 6 - 8j @@ -273,7 +278,9 @@ z4 = complex(5, 0) # z4 = 5 + 0j z5 = complex('3+4j') # создание на основе строки print(z1, z2, z3, z4, z5, sep='\n') +``` +``` # Вывод: (-3+2j) (6-8j) @@ -290,7 +297,9 @@ z = 3+4j print('Действительная часть =', z.real) print('Мнимая часть =', z.imag) +``` +``` # Вывод: Действительная часть = 3.0 Мнимая часть = 4.0 diff --git a/content/posts/functions2/featurelavalamp.svg b/content/posts/functions/featurelavalamp.svg similarity index 100% rename from content/posts/functions2/featurelavalamp.svg rename to content/posts/functions/featurelavalamp.svg diff --git a/content/posts/functions2/index.md b/content/posts/functions/index.md similarity index 74% rename from content/posts/functions2/index.md rename to content/posts/functions/index.md index bd91536..5aa2866 100644 --- a/content/posts/functions2/index.md +++ b/content/posts/functions/index.md @@ -14,13 +14,13 @@ series_order: 5 ## **Необязательные и именованные аргументы** ### Позиционные аргументы -Когда мы вызываем функции c позиционными аргументами, значения в их аргументы подставляются согласно позиции их имен в определении функции. Например Такой код выведет число 7 При вызове функции `diff()` первому параметру x будет соответствовать первый переданный аргумент — 10, а второму параметру y — второй аргумент — 3. +Когда мы вызываем функции c позиционными аргументами, значения в них подставляются согласно позиции их имен в определении функции. Например код ниже выведет число 7. При вызове функции `diff()` первому параметру x будет соответствовать первый переданный аргумент – 10, а второму параметру y – второй аргумент – 3. ```py def diff(x, y): return x - y -res = diff(10, 3) # используем позиционные аргументы +res = diff(10, 3) # используем позиционные аргументы print(res) ``` @@ -41,7 +41,9 @@ print(bar(char2='*', length=3, char1='-')) При вызове функции меняется порядок передаваемых аргументов. Когда функции назначаются соответствующие значения именованных аргументов, Python учитывает их имена, а не позиции. В результате функция будет всегда выводить одно и то же значение независимо от позиций переданных ей аргументов. +{{< alert "circle-info" >}} **Рекомендация** по тому, когда стоит использовать именованные аргументы: если функция принимает больше трёх аргументов, нужно хотя бы часть из них указать по имени. +{{< /alert >}} ```py def make_circle(x, y, radius, line_width, fill): # тело функции @@ -49,12 +51,14 @@ def make_circle(x, y, radius, line_width, fill): make_circle(x=200, y=300, radius=17, line_width=2.5, fill=True) ``` -Мы можем вызывать функции, используя именованные и позиционные аргументы одновременно. Но позиционные значения должны быть указаны до любых именованных! +{{< alert >}} +Мы можем вызывать функции, используя именованные и позиционные аргументы одновременно. Но позиционные значения должны быть указаны до любых именованных! +{{< /alert >}} --- ### Необязательные аргументы Бывает, что какой-то параметр функции часто принимает одно и то же значение. Например, для функции `print()` установили значения параметров `sep` и `end` равными символу пробела и символу перевода строки, поскольку эти значения используют наиболее часто. -Другим примером служит функция `int()`, преобразующая строку в число. Она принимает два аргумента: первый аргумент — строка, которую нужно преобразовать в число, второй аргумент — основание системы счисления, значение по умолчению которого — 10. +Другим примером служит функция `int()`, преобразующая строку в число. Она принимает два аргумента: первый аргумент – строка, которую нужно преобразовать в число, второй аргумент – основание системы счисления, значение по умолчению которого равно 10. Чтобы задать значение параметра по умолчанию, в списке параметров функции достаточно после имени переменной написать знак равенства и нужное значение. Параметры со значением по умолчанию идут последними. @@ -72,15 +76,17 @@ def append(element, seq=[]): print(append(10)) print(append(5)) print(append(1)) +``` +``` # Вывод: [10] [10, 5] [10, 5, 1] ``` -Значение по умолчанию для параметра создается **единожды** при определении функции (обычно при загрузке модуля) и становится атрибутом (свойством) функции. Поэтому, если значение по умолчанию изменяемый объект, то его изменение повлияет на каждый следующий вызов функции. -Для решения проблемы можно использовать константу None в качестве значения параметра по умолчанию, а в теле функции устанавливать нужное значение: +Значение по умолчанию для параметра создается **единожды** при определении функции (обычно при загрузке модуля) и становится её атрибутом (свойством). Поэтому, если значение по умолчанию изменяемый объект, то его изменение повлияет на каждый следующий вызов функции. +Для решения проблемы можно использовать константу `None` в качестве значения параметра по умолчанию, а в теле функции устанавливать нужное значение: ```py def append(element, seq=None): if seq is None: @@ -91,7 +97,9 @@ def append(element, seq=None): print(append(10)) print(append(5)) print(append(1)) +``` +``` # Вывод: [10] [5] @@ -100,7 +108,7 @@ print(append(1)) --- ## **Функции с переменным количеством аргументов** -### Позиционные аргументы - *args +### Позиционные аргументы – *args Рассмотрим определение функции `my_func()`: ```py def my_func(*args): @@ -111,8 +119,10 @@ def my_func(*args): my_func() my_func(1, 2, 3) my_func('a', 'b') +``` -# Вывод +``` +# Вывод: () @@ -132,12 +142,11 @@ def my_sum(*args): print(my_sum(1, 2, *[3, 4, 5], *(7, 8, 9), 10)) -# Вывод -49 +# Вывод: 49 ``` --- -### Именованные аргументы - **kwargs +### Именованные аргументы – **kwargs ```py def my_func(**kwargs): print(type(kwargs)) @@ -146,7 +155,9 @@ def my_func(**kwargs): my_func() my_func(a=1, b=2) my_func(name='Timur', job='Teacher') +``` +``` # Вывод: {} @@ -169,7 +180,9 @@ def my_func(a, b, *args, name='Gvido', age=17, **kwargs): my_func(1, 2, 3, 4, name='Timur', age=28, job='Teacher', language='Python') my_func(1, 2, name='Timur', age=28, job='Teacher', language='Python') my_func(1, 2, 3, 4, job='Teacher', language='Python') +``` +``` # Вывод: 1 2 (3, 4) @@ -189,15 +202,15 @@ Gvido 17 --- ## **Keyword-only аргументы** -В Python 3 добавили возможность пометить именованные аргументы функции так, чтобы вызвать функцию можно было, только передав эти аргументы по именам. Такие аргументы называются `keyword-only` и их нельзя передать в функцию в виде позиционных. +В Python 3 добавили возможность пометить именованные аргументы функции так, чтобы вызвать функцию можно было, только передав эти аргументы по именам. Такие аргументы называются `keyword-only` и их нельзя передать в функцию в виде позиционных: ```py def make_circle(x, y, radius, *, line_width=1, fill=True): #код -make_circle(10, 20, 5) # x=10, y=20, radius=5, line_width=1, fill=True -make_circle(x=10, y=20, radius=7) # x=10, y=20, radius=7, line_width=1, fill=True -make_circle(10, 20, radius=10, line_width=2, fill=False) # x=10, y=20, radius=10, line_width=2, fill=False -make_circle(x=10, y=20, radius=17, line_width=3) # x=10, y=20, radius=17, line_width=3, fill=True +make_circle(10, 20, 5) # x=10, y=20, radius=5, line_width=1, fill=True +make_circle(x=10, y=20, radius=7) # x=10, y=20, radius=7, line_width=1, fill=True +make_circle(10, 20, radius=10, line_width=2, fill=False) # x=10, y=20, radius=10, line_width=2, fill=False +make_circle(x=10, y=20, radius=17, line_width=3) # x=10, y=20, radius=17, line_width=3, fill=True ``` Здесь `*` выступает разделителем: отделяет обычные аргументы (их можно указывать по имени и позиционно) от строго именованных. То есть аргументы `x`, `y` и `radius` могут быть переданы в качестве как позиционных, так и именованных аргументов. При этом аргументы `line_width` и `fill` могут быть переданы только как именованные аргументы. @@ -220,8 +233,8 @@ def hello(): print('Hello from function') -func = hello # присваиваем переменной func функцию hello -func() # вызываем функцию +func = hello # присваиваем переменной func функцию hello +func() # вызываем функцию # Вывод: Hello from function ``` @@ -231,13 +244,15 @@ writeln = print writeln('Hello world!') writeln('Python') +``` +``` # Вывод: Hello world! Python ``` -Присваивоение переменной списка функций: +Присваивание переменной списка функций: ```py def f(x): return x**2 @@ -253,20 +268,24 @@ print(funcs[0](5), funcs[1](5)) # Вывод: 25 125 ``` +{{< alert "circle-info" >}} Функции, способные в качестве аргумента принимать или/и возвращать другие функции, называются функциями **высшего порядка**. Функция, определяющая условия сравнения элементов, называется **компаратор**. +{{< /alert >}} -Такие встроенные функции, как `min()`, `max()`, `sorted()` могут принимать необязательный аргумент `key` - функцию, определяющую, по какому правилу будут сравниваться элементы (значение `key` должно быть функцией, принимающей один аргумент и возвращающей на его основе ключ для сравнения). +Такие встроенные функции, как `min()`, `max()`, `sorted()` могут принимать необязательный аргумент `key` – функцию, определяющую, по какому правилу будут сравниваться элементы (значение `key` должно быть функцией, принимающей один аргумент и возвращающей на его основе ключ для сравнения). ```py numbers = [10, -7, 8, -100, -50, 32, 87, 117, -210] print(max(numbers, key=abs)) print(min(numbers, key=abs)) print(sorted(numbers, key=abs)) +``` +``` # Вывод: --210 # максимальный по модулю элемент --7 # минимальный по модулю элемент +-210 # максимальный по модулю элемент +-7 # минимальный по модулю элемент [-7, 8, 10, 32, -50, 87, -100, 117, -210] ``` @@ -281,8 +300,8 @@ def compare_by_sum(point): points = [(1, -1), (2, 3), (-10, 15), (10, 9), (7, 18), (1, 5), (2, -4)] -print(sorted(points, key=compare_by_second)) # сортируем по второму значению кортежа -print(sorted(points, key=compare_by_sum)) # сортируем по сумме кортежа +print(sorted(points, key=compare_by_second)) # сортируем по второму значению кортежа +print(sorted(points, key=compare_by_sum)) # сортируем по сумме кортежа ``` --- @@ -315,7 +334,9 @@ h = generator_square_polynom(a=-3, b=-10, c=50) print(f(1)) print(g(2)) print(h(-1)) +``` +``` # Вывод: 4 5 @@ -329,7 +350,7 @@ print(h(-1)) Функции, которые принимают и/или возвращают другие функции, называются **функциями высшего порядка**. ### Функция `map()` -Функция, преобразующая каждый элемент переданного итерируемого объекта (можно воспринимать как классическое представление функции в математике - отображение множества в другое множество). +Функция, преобразующая каждый элемент переданного итерируемого объекта (можно воспринимать как классическое представление функции в математике – отображение множества в другое множество). Возможная реализация: ```py def map(function, items): @@ -353,17 +374,19 @@ def cube(x): numbers = [1, 2, -3, 4, -5, 6, -9, 0] -strings = map(str, numbers) # используем в качестве преобразователя - функцию str -abs_numbers = map(abs, numbers) # используем в качестве преобразователя - функцию abs +strings = map(str, numbers) # используем в качестве преобразователя функцию str +abs_numbers = map(abs, numbers) # используем в качестве преобразователя функцию abs -squares = map(square, numbers) # используем в качестве преобразователя - функцию square -cubes = map(cube, numbers) # используем в качестве преобразователя - функцию cube +squares = map(square, numbers) # используем в качестве преобразователя функцию square +cubes = map(cube, numbers) # используем в качестве преобразователя функцию cube print(strings) print(abs_numbers) print(squares) print(cubes) +``` +``` # Вывод: ['1', '2', '-3', '4', '-5', '6', '-9', '0'] [1, 2, 3, 4, 5, 6, 9, 0] @@ -377,8 +400,7 @@ numbers = ['-1', '20', '3', '-94', '65', '6', '-970', '8'] new_numbers = map(abs, map(int, numbers)) print(new_numbers) -# Вывод: -[1, 20, 3, 94, 65, 6, 970, 8] +# Вывод: [1, 20, 3, 94, 65, 6, 970, 8] ``` --- @@ -413,7 +435,9 @@ large_words = filter(is_word_long, words) print(odd_numbers) print(large_words) +``` +``` # Вывод: [1, 3, 5, 7, 9, 11, 13] ['останутся', 'длинные'] @@ -448,7 +472,9 @@ product = reduce(mult, numbers, 1) print(total) print(product) +``` +``` # Вывод: 15 120 @@ -458,22 +484,21 @@ print(product) ## **Встроенные функции map(), filter(), reduce()** ### Встроенная функция `map()` -Функция, применяющая другую функцию к итерируемому объекту. Имеет сигнатуру `map(func, *iterables)`. В отличии от нашей реализации функция она может принимать сразу несколько последовательностей, переменное количество аргументов. Под подследовательностями имеются ввиду списки, строки, кортежи, множества, словари. +Функция, применяющая другую функцию к итерируемому объекту. Имеет сигнатуру `map(func, *iterables)`. В отличии от нашей реализации она может принимать сразу несколько последовательностей, переменное количество аргументов. Под подследовательностями имеются ввиду списки, строки, кортежи, множества, словари. ```py def increase(num): return num + 7 numbers = [1, 2, 3, 4, 5, 6] -new_numbers = map(increase, numbers) # используем встроенную функцию map() +new_numbers = map(increase, numbers) # используем встроенную функцию map() print(new_numbers) -# Вывод: - +# Вывод: ``` -Этот объект можно итерировать, подобные ему объекты называются **итераторами**. Если мы хотим получить список/кортеж из итератора, нужно воспользоваться функцией `list()`/`tuple()`, а если распкаовать, то `*` (при этом сделать эти действия возможно только единожды, т.к. итератор "исчерпывает" себя). +Вернулся итерируемый объект ``. Подобные ему объекты называются **итераторами**. Если мы хотим получить список/кортеж из итератора, нужно воспользоваться функцией `list()`/`tuple()`, а если распкаовать, то `*` (при этом сделать эти действия возможно только единожды, т.к. итератор "исчерпывает" себя). Функции `map()` можно передать несколько последовательностей. В этом случае в функцию обратного вызова `func` будут передаваться сразу несколько элементов, расположенных в последовательностях на одинаковых позициях. При этом, если в последовательностях разное количество элементов, то последовательность с минимальным количеством элементов становится ограничителем. ```py @@ -485,25 +510,26 @@ numbers1 = [1, 2, 3, 4, 5] numbers2 = [10, 20, 30, 40, 50] numbers3 = [100, 200, 300, 400, 500] -new_numbers = list(map(func, numbers1, numbers2, numbers3)) # преобразуем итератор в список +new_numbers = list(map(func, numbers1, numbers2, numbers3)) # преобразуем итератор в список print(new_numbers) -# Вывод: -[111, 222, 333, 444, 555] +# Вывод: [111, 222, 333, 444, 555] ``` Пример удобного использования функции `map()`, которой передано две последовательности: ```py circle_areas = [3.56773, 5.57668, 4.31914, 6.20241, 91.01344, 32.01213] -result1 = list(map(round, circle_areas, [1]*6)) # округляем числа до 1 знака после запятой -result2 = list(map(round, circle_areas, range(1, 7))) # округляем числа до 1,2,...,6 знаков после запятой +result1 = list(map(round, circle_areas, [1]*6)) # округляем числа до 1 знака после запятой +result2 = list(map(round, circle_areas, range(1, 7))) # округляем числа до 1,2,...,6 знаков после запятой print(circle_areas) print(result1) print(result2) +``` +``` # Вывод: [3.56773, 5.57668, 4.31914, 6.20241, 91.01344, 32.01213] [3.6, 5.6, 4.3, 6.2, 91.0, 32.0] @@ -519,23 +545,24 @@ def func(elem): numbers = [-1, 2, -3, 4, 0, -20, 10] -positive_numbers = list(filter(func, numbers)) # преобразуем итератор в список +positive_numbers = list(filter(func, numbers)) # преобразуем итератор в список print(positive_numbers) -# Вывод: -[2, 4, 0, 10] +# Вывод: [2, 4, 0, 10] ``` Функция `filter()` также возвращает итератор. -Встроенной функции `filter()` можно в качестве первого параметра `func` передать значение `None`. В таком случае каждый элемент последовательности будет проверен на соответствие значению `True`. Если элемент в логическом контексте возвращает значение `False`, то он не будет добавлен в возвращаемый результат. В следующем коде значения списка: `0, '', None, [], ()` позиционируется как `False`. +Встроенной функции `filter()` можно в качестве первого параметра `func` передать значение `None`. В таком случае каждый элемент последовательности будет проверен на соответствие значению `True`. Если элемент в логическом контексте возвращает значение `False`, то он не будет добавлен в возвращаемый результат. В следующем коде значения списка `[0, '', None, [], ()]` позиционируется как `False`: ```py true_values = filter(None, [1, 0, 10, '', None, [], [1, 2, 3], ()]) for value in true_values: print(value) +``` +``` # Вывод: 1 10 @@ -556,39 +583,40 @@ def func(a, b): numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] -total = reduce(func, numbers, 0) # в качестве начального значения 0 +total = reduce(func, numbers, 0) # в качестве начального значения 0 print(total) -# Вывод: -55 +# Вывод: 55 ``` --- ## **Анонимные функции** -`lambda` - безымянные однострочные функции (называются анонимными или лямбда-функциями). По сути эти функции являются выражениями, при этом они имеют такой же тип данных, как обычные функции - ``. После определения их можно сразу вызвать: `print((lambda х, у: х + у)(5, 10)) # 5 + 10`. +`lambda` – безымянные однострочные функции (называются анонимными или лямбда-функциями). По сути эти функции являются выражениями, при этом они имеют такой же тип данных, как обычные функции – ``. После определения их можно сразу вызвать: `print((lambda х, у: х + у)(5, 10)) # 5 + 10`. Общий формат определения: `lambda список_параметров: выражение`. В теле лямбда-функции нельзя использовать несколько действий и циклы, но можно использовать тернарный условный оператор. Применение таких функций оправдано в следующих случаях: * однократное использование функции; * передача функций в качестве аргумента другим функциям; * возвращение функции в качестве результата другой функции. ```py -def standard_function(x): # стандартное объявление функции +def standard_function(x): # стандартное объявление функции return x*2 -lambda_function = lambda x: x*2 # объявление анонимной функции +lambda_function = lambda x: x*2 # объявление анонимной функции print(standard_function(7)) print(lambda_function(7)) +``` +``` # Вывод: 14 14 ``` ```py -f1 = lambda: 10 + 20 # функция без параметров -f2 = lambda х, у: х + у # функция с двумя параметрами -f3 = lambda х, у, z: х + у + z # функция с тремя параметрами +f1 = lambda: 10 + 20 # функция без параметров +f2 = lambda х, у: х + у # функция с двумя параметрами +f3 = lambda х, у, z: х + у + z # функция с тремя параметрами print(f1()) print(f2(5, 10)) @@ -599,8 +627,8 @@ print(f3(5, 10, 30)) ```py points = [(1, -1), (2, 3), (-10, 15), (10, 9), (7, 18), (1, 5), (2, -4)] -print(sorted(points, key=lambda point: point[1])) # сортируем по второму значению кортежа -print(sorted(points, key=lambda point: point[0] + point[1])) # сортируем по сумме элементов кортежа +print(sorted(points, key=lambda point: point[1])) # сортируем по второму значению кортежа +print(sorted(points, key=lambda point: point[0] + point[1])) # сортируем по сумме элементов кортежа ``` --- @@ -609,9 +637,9 @@ print(sorted(points, key=lambda point: point[0] + point[1])) # сортир ```py numbers = [1, 2, 3, 4, 5, 6] -new_numbers1 = list(map(lambda x: x+1, numbers)) # увеличиваем на 1 -new_numbers2 = list(map(lambda x: x*2, numbers)) # удваиваем -new_numbers3 = list(map(lambda x: x**2, numbers)) # возводим в квадрат +new_numbers1 = list(map(lambda x: x+1, numbers)) # увеличиваем на 1 +new_numbers2 = list(map(lambda x: x*2, numbers)) # удваиваем +new_numbers3 = list(map(lambda x: x**2, numbers)) # возводим в квадрат strings = ['a', 'b', 'c', 'd', 'e'] @@ -624,15 +652,15 @@ new_strings = list(map(lambda x, y: x*y, strings, numbers)) ```py numbers = [-1, 2, -3, 4, 0, -20, 10, 30, -40, 50, 100, 90] -positive_numbers = list(filter(lambda x: x > 0, numbers)) # положительные числа -large_numbers = list(filter(lambda x: x > 50, numbers)) # числа, большие 50 -even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) # четные числа +positive_numbers = list(filter(lambda x: x > 0, numbers)) # положительные числа +large_numbers = list(filter(lambda x: x > 50, numbers)) # числа, большие 50 +even_numbers = list(filter(lambda x: x % 2 == 0, numbers)) # четные числа words = ['python', 'stepik', 'beegeek', 'iq-option'] -new_words1 = list(filter(lambda w: len(w) > 6, words)) # слова длиною больше 6 символов -new_words2 = list(filter(lambda w: 'e' in w, words)) # слова содержащие букву e +new_words1 = list(filter(lambda w: len(w) > 6, words)) # слова длиною больше 6 символов +new_words2 = list(filter(lambda w: 'e' in w, words)) # слова содержащие букву e ``` * Функция `reduce()`: @@ -645,7 +673,9 @@ numbers = [1, 2, 3, 4, 5, 6] summa = reduce(lambda x, y: x + y, numbers, 0) product = reduce(lambda x, y: x * y, numbers, 1) sentence = reduce(lambda x, y: x + ' loves ' + y, words, 'Everyone') +``` +``` # Вывод: 21 720 @@ -654,7 +684,7 @@ Everyone loves python loves stepik loves beegeek loves iq-option --- ### Возвращение лямбда-функции в качестве результата другой функции -Следующий пример показывает, что анонимные функции являются **замыканиями**: возвращаемая функция запоминает значения переменных `a, b, c` из внешнего окружения: +Следующий пример показывает, что анонимные функции являются **замыканиями**, т.е. возвращаемая функция запоминает значения переменных `a, b, c` из внешнего окружения: ```py def generator_square_polynom(a, b, c): return lambda x: a*x**2 + b*x + c @@ -678,9 +708,9 @@ print(result) Анонимные функции поддерживают все способы передачи аргументов: - позиционные; - именованные; -- `*args` - переменный список позиционных аргументов; -- `**kwargs` - переменный список именованных аргументов; -- `*` - обязательные аргументы. +- `*args` – переменный список позиционных аргументов; +- `**kwargs` – переменный список именованных аргументов; +- `*` – обязательные аргументы. ```py f1 = lambda x, y, z: x + y + z @@ -697,7 +727,9 @@ print(f3(1, 2, 3, 4, 5)) print(f4(one=1, two=2, three=3)) print(f5(1)) print(f5(1, y=2, z=3)) +``` +``` # Вывод: 6 6 @@ -725,7 +757,9 @@ dict1 = {0: 'Zero', 1: 'One', 2: 'Two'} dict2 = {'Zero': 0, 'One': 1, 'Two': 2} print(all(dict1)) print(all(dict2)) +``` +``` # Вывод: True False @@ -739,11 +773,13 @@ True Если переданный итерируемый объект пуст, то функция `all()` возвращает значение **`True`**. ```py -print(all([])) # передаем пустой список -print(all(())) # передаем пустой кортеж -print(all('')) # передаем пустую строку -print(all([[], []])) # передаем список, содержащий пустые списки +print(all([])) # передаем пустой список +print(all(())) # передаем пустой кортеж +print(all('')) # передаем пустую строку +print(all([[], []])) # передаем список, содержащий пустые списки +``` +``` # Вывод: True True @@ -767,7 +803,9 @@ dict1 = {0: 'Zero'} dict2 = {'Zero': 0, 'One': 1} print(any(dict1)) print(any(dict2)) +``` +``` # Вывод: False True @@ -781,11 +819,13 @@ True Eсли переданный итерируемый объект пуст, то функция `any()` возвращает значение **`False`**. ```py -print(any([])) # передаем пустой список -print(any(())) # передаем пустой кортеж -print(any('')) # передаем пустую строку -print(any([[], []])) # передаем список, содержащий пустые списки +print(any([])) # передаем пустой список +print(any(())) # передаем пустой кортеж +print(any('')) # передаем пустую строку +print(any([[], []])) # передаем список, содержащий пустые списки +``` +``` # Вывод: False False @@ -799,7 +839,7 @@ False ```py numbers = [17, 90, 78, 56, 231, 45, 5, 89, 91, 11, 19] -result = all(map(lambda x: True if x > 10 else False, numbers)) # Анонимную функцию можно упростить до lambda x: x > 10 +result = all(map(lambda x: True if x > 10 else False, numbers)) # анонимную функцию можно упростить до lambda x: x > 10 if result: print('Все числа больше 10') @@ -821,13 +861,12 @@ else: --- ### Функция `enumerate()` -Встроенная функция `enumerate()` возвращает кортеж из индекса элемента и самого элемента переданной ей коллекции: `enumerate(iterable, start)`, где `iterable` - итерируемый объект (колллекция), а `start` - необязательный параметр, задающий начальное значение индекса (по умолчанию `start = 0`). Эта функция возвращает объект-итератор, который можно перебрать, преобразовать в список функцией `list()` или распаковать `*`. +Встроенная функция `enumerate()` возвращает кортеж из индекса элемента и самого элемента переданной ей коллекции: `enumerate(iterable, start)`, где `iterable` – итерируемый объект (колллекция), а `start` – необязательный параметр, задающий начальное значение индекса (по умолчанию `start = 0`). Эта функция возвращает объект-итератор, который можно перебрать, преобразовать в список функцией `list()` или распаковать `*`. ```py colors = ['red', 'green', 'blue'] print(list(enumerate(colors, start=1))) -# Вывод: -[(1, 'red'), (2, 'green'), (3, 'blue')] +# Вывод: [(1, 'red'), (2, 'green'), (3, 'blue')] ``` --- @@ -841,8 +880,7 @@ romans = ['I', 'II', 'III'] result = zip(numbers, words, romans) print(list(result)) -# Вывод: -[(1, 'one', 'I'), (2, 'two', 'II')] +# Вывод: [(1, 'one', 'I'), (2, 'two', 'II')] ``` ```py @@ -853,8 +891,7 @@ romans = ['I', 'II', 'III'] result = zip(numbers, words, romans) print(list(result)) -# Вывод: -[(1, 'one', 'I'), (2, 'two', 'II'), (3, 'three', 'III')] +# Вывод: [(1, 'one', 'I'), (2, 'two', 'II'), (3, 'three', 'III')] ``` Частые случаи использования `zip()`: @@ -866,8 +903,7 @@ values = ['Timur', 28, 'male'] info = dict(zip(keys, values)) print(info) -# Вывод: -{'name': 'Timur', 'age': 28, 'gender': 'male'} +# Вывод: {'name': 'Timur', 'age': 28, 'gender': 'male'} ``` * Для параллельного итерирования по разным коллекциям: @@ -877,7 +913,9 @@ age = [28, 21, 19] for x, y in zip(name, age): print(x, y) +``` +``` # Вывод: Timur 28 Ruslan 21 diff --git a/content/posts/programming_paradigms/index.md b/content/posts/programming_paradigms/index.md index 6a89d25..4f204a9 100644 --- a/content/posts/programming_paradigms/index.md +++ b/content/posts/programming_paradigms/index.md @@ -12,7 +12,7 @@ tags: ["coding", "paradigms"] ###
Императивное программирование
-Вычислительная техника создавалась для решения математических задач — расчета баллистических траекторий, численного решения уравнений и т.д. Для этого же предназначены первые языки программирования, такие как Fortran, Алгол, реализованные в парадигме императивного программирования. +Вычислительная техника создавалась для решения математических задач – расчета баллистических траекторий, численного решения уравнений и т.д. Для этого же предназначены первые языки программирования, такие как Fortran, Алгол, реализованные в парадигме императивного программирования. Характеристики: * в исходном коде программы записаны инструкции (команды); @@ -32,7 +32,7 @@ tags: ["coding", "paradigms"] --- ###
Структурное программирование
-Струк­тур­ная парадигма программирования на­це­ле­на на со­кра­ще­ние вре­ме­ни раз­ра­бот­ки и уп­ро­ще­ние под­держ­ки про­грамм за счёт ис­поль­зо­ва­ния блоч­ных опе­ра­то­ров и под­про­грамм. От­ли­чительная чер­та струк­тур­ных про­грамм — от­каз от опе­ра­то­ра безусловного пе­ре­хо­да (`goto`), который широко использовался в 1970-х годах. +Струк­тур­ная парадигма программирования на­це­ле­на на со­кра­ще­ние вре­ме­ни раз­ра­бот­ки и уп­ро­ще­ние под­держ­ки про­грамм за счёт ис­поль­зо­ва­ния блоч­ных опе­ра­то­ров и под­про­грамм. От­ли­чительная чер­та струк­тур­ных про­грамм – от­каз от опе­ра­то­ра безусловного пе­ре­хо­да (`goto`), который широко использовался в 1970-х годах. Основные механизмы управления: * последовательное исполнение команд; @@ -42,7 +42,9 @@ tags: ["coding", "paradigms"] * **использование циклов;** * **использование подпрограмм (функций).** +{{< alert "bars" >}} Парадигму структурного программирования предложил нидерландский ученый Эдсгер Дейкстра. +{{< /alert >}} --- ###
Объектно-ориентированное программирование
@@ -68,7 +70,7 @@ tags: ["coding", "paradigms"] --- ###
Декларативное программирование
-Декларативное программирование — парадигма программирования, в которой задаётся спецификация решения задачи, то есть описывается ожидаемый результат, а не способ его получения. Противоположностью декларативного является императивное программирование, при котором на том или ином уровне детализации требуется описание последовательности шагов для решения задачи. В качестве примеров декларативных языков обычно приводят HTML и SQL. При создании HTML с помощью тегов описывается, какую нужно получить страничку в браузере, а не то, как нарисовать на экране заголовок статьи, оглавление и текст. +Декларативное программирование – парадигма программирования, в которой задаётся спецификация решения задачи, то есть описывается ожидаемый результат, а не способ его получения. Противоположностью декларативного является императивное программирование, при котором на том или ином уровне детализации требуется описание последовательности шагов для решения задачи. В качестве примеров декларативных языков обычно приводят HTML и SQL. При создании HTML с помощью тегов описывается, какую нужно получить страничку в браузере, а не то, как нарисовать на экране заголовок статьи, оглавление и текст. К подвидам декларативного программирования также зачастую относят функциональное и логическое программирование. Несмотря на то, что программы на таких языках нередко содержат алгоритмические составляющие, архитектура в императивном понимании (как нечто отдельное от кодирования) в них также отсутствует: схема программы является непосредственно частью исполняемого кода. @@ -79,32 +81,34 @@ tags: ["coding", "paradigms"] В конце 60-х годов XX века Корделл Грин предложил использовать резолюцию как основу логического программирования. Алан Колмеро создал язык логического программирования Prolog в 1971 году. Логическое программирование пережило пик популярности в середине 80-х годов XX века, когда было положено в основу проекта разработки программного и аппаратного обеспечения вычислительных систем пятого поколения. -Важное его преимущество — достаточно высокий уровень машинной независимости, а также возможность откатов, возвращения к предыдущей подцели при отрицательном результате анализа одного из вариантов в процессе поиска решения. +Важное его преимущество – достаточно высокий уровень машинной независимости, а также возможность откатов, возвращения к предыдущей подцели при отрицательном результате анализа одного из вариантов в процессе поиска решения. -Один из концептуальных недостатков логического подхода — специфичность класса решаемых задач. +Один из концептуальных недостатков логического подхода – специфичность класса решаемых задач. -Недостаток практического характера — сложность эффективной реализации для принятия решений в реальном времени, скажем, для систем жизнеобеспечения. +Недостаток практического характера – сложность эффективной реализации для принятия решений в реальном времени, скажем, для систем жизнеобеспечения. --- ###
Функциональное программирование
-Основной инструмент функционального программирования (ФП) — математические функции. +Основной инструмент функционального программирования (ФП) – математические функции. -Математические функции выражают связь между исходными данными и итогом процесса. Процесс вычисления также имеет вход и выход, поэтому функция — вполне подходящее и адекватное средство описания вычислений. Именно этот простой принцип положен в основу функциональной парадигмы программирования. +Математические функции выражают связь между исходными данными и итогом процесса. Процесс вычисления также имеет вход и выход, поэтому функция – вполне подходящее и адекватное средство описания вычислений. Именно этот простой принцип положен в основу функциональной парадигмы программирования. -Функциональное программирование — декларативная парадигма программирования. +{{< alert "circle-info" >}} +Функциональное программирование – декларативная парадигма программирования. +{{< /alert >}} -Функциональная программа — набор определений функций. Функции определяются через другие функции или рекурсивно через самих себя. При выполнении программы функции получают аргументы, вычисляют и возвращают результат, при необходимости вычисляя значения других функций. +Функциональная программа – набор определений функций. Функции определяются через другие функции или рекурсивно через самих себя. При выполнении программы функции получают аргументы, вычисляют и возвращают результат, при необходимости вычисляя значения других функций. Основные идеи функционального программирования: -- неизменяемые переменные — в функциональном программировании можно определить переменную, но изменить ее значение нельзя; -- чистая функция — это функция, результат работы которой предсказуем. При вызове с одними и теми же аргументами, такая функция всегда вернет одно и то же значение. Про такие функции говорят, что они не вызывают побочных эффектов; -- функции высшего порядка — могут принимать другие функции в качестве аргумента или возвращать их; -- рекурсия — поддерживается многими языками программирования, а для функционального программирования обязательна. Дело в том, что в языках ФП отсутствуют циклы, поэтому для повторения операций служит рекурсия. Использование рекурсии в языках ФП оптимизировано, и происходит быстрее, чем в языках императивного программирования; -- лямбда-выражения — способ определения анонимных функциональных объектов. +- неизменяемые переменные – в функциональном программировании можно определить переменную, но изменить ее значение нельзя; +- чистая функция – это функция, результат работы которой предсказуем. При вызове с одними и теми же аргументами, такая функция всегда вернет одно и то же значение. Про такие функции говорят, что они не вызывают побочных эффектов; +- функции высшего порядка – могут принимать другие функции в качестве аргумента или возвращать их; +- рекурсия – поддерживается многими языками программирования, а для функционального программирования обязательна. Дело в том, что в языках ФП отсутствуют циклы, поэтому для повторения операций служит рекурсия. Использование рекурсии в языках ФП оптимизировано, и происходит быстрее, чем в языках императивного программирования; +- лямбда-выражения – способ определения анонимных функциональных объектов. Сильные стороны функционального программирования: -* повышение надёжности кода; +* повышеная надёжность кода; * удобство организации модульного тестирования; * возможности оптимизации при компиляции; * возможности параллелизма. diff --git a/content/posts/random_string/index.md b/content/posts/random_string/index.md index 56d07ee..e87c382 100644 --- a/content/posts/random_string/index.md +++ b/content/posts/random_string/index.md @@ -19,7 +19,7 @@ series_order: 2 * `seed()` - указывает начальное для генератора псевдослучайных чисел (по умолчанию начальное значение - системное время); * `shuffle()` - принимает список в качестве обязательного аргумента и перемешивает его случайным образом; * `choice()` - принимает список (строку, кортеж) в качестве обязательного аргумента и возвращает один случайный элемент; -* `sample()` - принимает два обязательных аргумента: первый – коллекция (последовательность), которая поддерживая индексацию (список, строка, кортеж), второй – количество случайных элементов. Возвращает список из указанного количества уникальных (имеющих разные индексы) случайных элементов; +* `sample()` - принимает два обязательных аргумента: первый – коллекция (последовательность), которая поддерживает индексацию (список, строка, кортеж), второй – количество случайных элементов. Возвращает список из указанного количества уникальных (имеющих разные индексы) случайных элементов. --- ## **Модуль string** @@ -35,7 +35,9 @@ print(string.hexdigits) print(string.octdigits) print(string.punctuation) print(string.printable) +``` +``` # Вывод: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZ diff --git a/content/posts/turtle/index.md b/content/posts/turtle/index.md index e86b58e..effa56c 100644 --- a/content/posts/turtle/index.md +++ b/content/posts/turtle/index.md @@ -20,19 +20,19 @@ series_order: 4 import turtle window = turtle.Screen() turtle.showturtle() -# Код -window.mainloop() # Пишется в конце программы +# Какой-нибудь код +window.mainloop() # Пишется в конце программы ``` --- ### Методы -* `forward(p)` - перемещает "черепашку" вперёд по направлению взгляда на `p` пикселей; `backword(p)` - перемещает черепашку назад на `p` пикселей. -* `left(d)` и `right(d)` поворачивают черепашку влево и вправо соответственно на `d` градусов; `setheading(d)` - устанавливает угол `d`; `heading(d)` - вдобавок к функционалу `setheading()` возвращает текущий угол в градусах. -* `circle(p)` - рисует круг с радиусом `p`; `dot()` - рисует точку; `stamp()` - оставляет штамп черепашки на графике. -* `shape('name')` - изменяет внешний вид черпашки (square, arrow, circle, turtle, triangle, classic); с помощью `turtle.Screen().addshape('file')` можно установить кастомную черепашку; `hideturtle()` прячет черепашку; а `showturtle()` вновь отображает её. -* `speed(n)` - устанавливает скорость анимации `n`, принимающую значения от 0 до 10, при этом 0 отключает анимацию и черепашка перемещается мгновенно. -* `penup()` - поднимает перо; а `pendown()` - опускает его; `pensize(p)` - устанавливает ширину пера в `p` пикселей; `pencolor('color')` - устанавливает цвет пера (если хотим использовать формат RGB, т.е. `pencolor(130, 240, 200)`, то нужно использовать команду `turtle.Screen().colormode(255)`). +* `forward(p)` – перемещает "черепашку" вперёд по направлению взгляда на `p` пикселей; `backword(p)` – перемещает черепашку назад на `p` пикселей. +* `left(d)` и `right(d)` поворачивают черепашку влево и вправо соответственно на `d` градусов; `setheading(d)` – устанавливает угол `d`; `heading(d)` – вдобавок к функционалу `setheading()` возвращает текущий угол в градусах. +* `circle(p)` – рисует круг с радиусом `p`; `dot()` – рисует точку; `stamp()` – оставляет штамп черепашки на графике. +* `shape('name')` – изменяет внешний вид черпашки (square, arrow, circle, turtle, triangle, classic); с помощью `turtle.Screen().addshape('file')` можно установить кастомную черепашку; `hideturtle()` прячет черепашку; а `showturtle()` вновь отображает её. +* `speed(n)` – устанавливает скорость анимации `n`, принимающую значения от 0 до 10, при этом 0 отключает анимацию и черепашка перемещается мгновенно. +* `penup()` – поднимает перо; а `pendown()` – опускает его; `pensize(p)` – устанавливает ширину пера в `p` пикселей; `pencolor('color')` – устанавливает цвет пера (если хотим использовать формат RGB, т.е. `pencolor(130, 240, 200)`, то нужно использовать команду `turtle.Screen().colormode(255)`). * `turtle.Screen().bgcolor('color')` позволяет установить цвет фона (также можно задать RGB формат); с помощью `turtle.Screen().bgpic('file')` можно установить фоновое изображение. -* `clear()` - стирает все в графическом окне (положение черепашки, заданные цвета рисунка и фона остаются неизменными); `reset()` - стирает рисунки и сбрасывает положение черепашки и заданный цвет рисунка (цвет фона остаётся неизменным); `clearscreen()` - возвращает экран в исходное состояние. -* `turtle.Screen().setup(w, h)` - устанавливает размер окна в ширину `w` и высоту `h` в пикселях. -* `goto(x, y)` - перемещает черепашку в координаты $(x, y)$ на экране (при опущенном пере линии будут рисоваться); `pos()` или `position()` возвращает кортеж координат черепешки; `xcor()` возвращает только координату по $x$; а `ycor()` - по $y$. \ No newline at end of file +* `clear()` – стирает все в графическом окне (положение черепашки, заданные цвета рисунка и фона остаются неизменными); `reset()` – стирает рисунки и сбрасывает положение черепашки и заданный цвет рисунка (цвет фона остаётся неизменным); `clearscreen()` – возвращает экран в исходное состояние. +* `turtle.Screen().setup(w, h)` – устанавливает размер окна в ширину `w` и высоту `h` в пикселях. +* `goto(x, y)` – перемещает черепашку в координаты (x, y) на экране (при опущенном пере линии будут рисоваться); `pos()` или `position()` возвращает кортеж координат черепешки; `xcor()` возвращает только координату по x; а `ycor()` – по y. \ No newline at end of file diff --git a/content/posts/work_with_files/index.md b/content/posts/work_with_files/index.md index bbb7e82..7fb0a38 100644 --- a/content/posts/work_with_files/index.md +++ b/content/posts/work_with_files/index.md @@ -18,7 +18,7 @@ series_order: 6 ##
Файловый ввод и вывод
Когда программе нужно сохранить данные для дальнейшего использования, она пишет их в файл. Из файла записанные данные можно считать. -Программисты называют такой процесс сохранения данных — **запись данных** в файл. Когда часть данных пишется в файл, она копируется из переменной, находящейся в оперативной памяти. Файл, куда сохраняются данные, называется **файл вывода**, потому что программа помещает в него выходные данные. +Программисты называют такой процесс сохранения данных – **запись данных** в файл. Когда часть данных пишется в файл, она копируется из переменной, находящейся в оперативной памяти. Файл, куда сохраняются данные, называется **файл вывода**, потому что программа помещает в него выходные данные. Процесс извлечения данных из файла называется **чтением данных** из файла. Данные считываются из **файла ввода**. Программа извлекает входные данные из этого файла. Когда порция данных считывается из файла, она копируется в оперативную память, где на нее ссылается переменная. @@ -28,7 +28,7 @@ series_order: 6 * **Закрыть файл**. После использования файла программой его нужно закрыть, тем самым освободить ресурс и разорвать связь файла с программой. ### Типы файлов -Существует два типа файлов: **текстовые** и **двоичные (бинарные)**. Python позволяет работать и с текстовыми. +Существует два типа файлов: **текстовые** и **двоичные (бинарные)**. Python позволяет работать с любыми из них. Текстовый файл содержит данные, которые были закодированы в виде текста при помощи такой схемы кодирования, как ASCII или Юникод. Даже если файл содержит числа, эти числа в файле хранятся как набор символов. В результате файл можно открыть и просмотреть в текстовом редакторе, таком как Блокнот. @@ -36,7 +36,7 @@ series_order: 6 --- ### Методы доступа к файлам -Большинство языков программирования обеспечивает два способа получения доступа к данным в файле: +Большинство языков программирования обеспечивают два способа получения доступа к данным в файле: * **последовательный**, * **прямой** или **произвольный**. @@ -46,7 +46,7 @@ series_order: 6 --- ### Кодировка файлов -Кодировка UTF-8 самая распространенная, рекомендуем использовать именно ее в качестве кодировки по умолчанию для текстовых файлов. Она довольно сложная, и на кодирование одного символа может уходить до 6 байт. +Кодировка UTF-8 самая распространенная, рекомендуется использовать именно ее в качестве кодировки по умолчанию для текстовых файлов. Она довольно сложная, и на кодирование одного символа может уходить до 6 байт. В операционной системе Windows до сих пор используется однобайтовая кодировка Windows-1251. Чтобы избежать проблем при работе с текстовыми файлами в Windows нужно явно указывать кодировку. @@ -55,8 +55,7 @@ series_order: 6 ### Открытие файла Функция `open()` открывает файлы в Python. Она создает файловый объект и связывает его с файлом на диске. -Формат применения: `файловая_переменная = open(имя_файла, режим_доступа)`, где `файловая_переменная` - имя переменной, которая ссылается на файловый объект (такую -переменную называют дескриптор файла);`имя_файла` - строковый литерал/ключ, задающий имя файла; `режим_доступа` - строковый литерал/ключ, задающий режим доступа. +Формат применения: `файловая_переменная = open(имя_файла, режим_доступа)`, где `файловая_переменная` – имя переменной, которая ссылается на файловый объект (такую переменную называют дескриптор файла); `имя_файла` – строковый литерал/ключ, задающий имя файла; `режим_доступа` – строковый литерал/ключ, задающий режим доступа. Ключи режима доступа: |Ключ|Режим|Примечание| @@ -104,7 +103,9 @@ print(file2.encoding) file1.close() file2.close() +``` +``` # Вывод: cp1252 utf-8 @@ -114,7 +115,7 @@ utf-8 ### Закрытие файлов После окончания работы с файлом его необходимо закрыть по следующим причинам: * если файл изменялся, это позволит корректно его сохранить; -* если открытый файл потребуется другим программам, ваша программа может его блокировать; +* если открытый файл потребуется другим программам, программа на Python может его блокировать; * не стоит держать в памяти лишние, уже не нужные, данные; * удалить открытый кем-то файл проблематично. @@ -136,7 +137,9 @@ print(file1.closed) print(file2.closed) file2.close() +``` +``` # Вывод: True False @@ -188,12 +191,13 @@ for line in file: file.close() ``` -* Метод `readlines()` считывает все строки из файла и возвращает список из всех считанных строк (одна строка — один элемент списка). +#### Метод `readlines()` +`readlines()` считывает все строки из файла и возвращает список из всех считанных строк (одна строка – один элемент списка). При этом, каждая строка в списке заканчивается символом переноса строки `'\n'`. Чтобы удалить символ `'\n'` можно использовать списочное выржение, лямбда-функцию или функцию `map()`: `languages = list(map(str.strip, file.readlines()))` -Если передать в функцию `list()` ссылку на файловый объект `list(file)` , получим тот же результат, что при вызове метода `file.readlines()`. +Если передать в функцию `list()` ссылку на файловый объект `list(file)`, получим тот же результат, что при вызове метода `file.readlines()`. --- ### Курсор в файле @@ -224,7 +228,7 @@ Objective-C ```py file = open('languages.txt', 'r', encoding='utf-8') line1 = file.readline() -file.seek(0) # переводим курсор в самое начало +file.seek(0) # переводим курсор в самое начало line2 = file.readline() print(line1, line2) @@ -240,7 +244,9 @@ line1 = file.readline() print(file.tell()) file.close() +``` +``` # Вывод: 0 8 @@ -250,7 +256,7 @@ file.close() ### Менеджер контекста Чтобы автоматически закрывать файл сразу после окончания работы с ним и осуществлять закрытие даже при возникновении ошибки, можно воспользоваться **менеджером контекстов**. -Менеджер контекста — объект, реализующий одноименный протокол. Объекты, реализующие этот протокол, позволяют использовать следующий специальный синтаксис: +Менеджер контекста – объект, реализующий одноименный протокол. Объекты, реализующие этот протокол, позволяют использовать следующий специальный синтаксис: ```py with object as name: # Здесь нам доступен ресурс name. @@ -267,7 +273,7 @@ file = open('languages.txt', 'r', encoding='utf-8') for line in file: print(line) -file.close() # ручное закрытие файла +file.close() # ручное закрытие файла print('Файл закрыт') ``` @@ -276,7 +282,7 @@ print('Файл закрыт') with open('languages.txt', 'r', encoding='utf-8') as file: for line in file: print(line) - # автоматическое закрытие файла +# автоматическое закрытие файла print('Файл закрыт') ``` @@ -288,7 +294,7 @@ with open('input.txt', 'r') as input_file, open('output.txt', 'w') as output_fil --- ### Запись данных в файл -Для записи используются два файловых метода (файл должен быть открыт для записи - режимы `'w'`, `'а'`, `'r+'`, иначе произойдет ошибка): +Для записи используются два файловых метода (файл должен быть открыт для записи – режимы `'w'`, `'а'`, `'r+'`, иначе произойдет ошибка): * `write()` – записывает переданную строку в файл; * `writelines()` – записывает переданный список строк в файл. diff --git a/docs/404.html b/docs/404.html index 7a06876..c2889c2 100644 --- a/docs/404.html +++ b/docs/404.html @@ -11,7 +11,7 @@ 404 Page not found · HFK - + @@ -55,14 +55,14 @@ - + - + @@ -125,7 +125,7 @@
- +
    -
  • as_integer_ratio() - возвращает кортеж, состоящий из числителя и знаменателя данного Fraction числа.
  • -
  • limit_denominator() - возвращает самую близкую к данному числу рациональную дробь, чей знаменатель не превосходит переданного аргумента:
  • +
# Вывод:
+Числитель дроби равен: 5
+Знаменатель дроби равен: 16
+
    +
  • as_integer_ratio() – возвращает кортеж, состоящий из числителя и знаменателя данного Fraction числа.
  • +
  • limit_denominator() – возвращает самую близкую к данному числу рациональную дробь, чей знаменатель не превосходит переданного аргумента:
from fractions import Fraction
 import math
@@ -1055,18 +1172,47 @@ 

Методы и свойства for d in [1, 5, 50, 90, 100, 500, 1000000]: limited = num.limit_denominator(d) print(limited) - -# Вывод: -PI = 3.141592653589793 -No limit = 3141592653589793/1000000000000000 -3 -16/5 -22/7 -267/85 -311/99 -355/113 -3126535/995207 -

В Python нельзя совершать арифметические операции (+, -, *, /) между типами Decimal и Fraction.**

+
# Вывод:
+PI = 3.141592653589793
+No limit = 3141592653589793/1000000000000000
+3
+16/5
+22/7
+267/85
+311/99
+355/113
+3126535/995207
+
+ + + + +
+ + + + + + + + + + + + + + В Python нельзя совершать арифметические операции (+, -, *, /) между типами Decimal и Fraction. +
+
@@ -1097,14 +1243,13 @@

Комплексные числа в Python print(z1, z2, z3, z4, sep='\n') print(type(z1)) - -# Вывод: -(5+7j) -1j -(-3+5j) -(1.5+3.2j) -<class 'complex'> -

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

+
# Вывод:
+(5+7j)
+1j
+(-3+5j)
+(1.5+3.2j)
+<class 'complex'>
+

Комплексные числа можно создать с помощью литерала, как выше, а можно с помощью функции complex(), которая принимает два аргумента: вещественную и мнимую часть числа, либо строковое представление числа:

z1 = -3 + 2j              # создание на основе литерала
 z2 = complex(6, -8)       # z2 = 6 - 8j
 z3 = complex(0, 2.5)      # z3 = 2.5j
@@ -1112,14 +1257,13 @@ 

Комплексные числа в Pythonz5 = complex('3+4j') # создание на основе строки print(z1, z2, z3, z4, z5, sep='\n') - -# Вывод: -(-3+2j) -(6-8j) -2.5j -(5+0j) -(3+4j) -


+
# Вывод:
+(-3+2j)
+(6-8j)
+2.5j
+(5+0j)
+(3+4j)
+

Методы и свойства @@ -1139,11 +1283,10 @@

Методы и свойства print('Действительная часть =', z.real) print('Мнимая часть =', z.imag) - -# Вывод: -Действительная часть = 3.0 -Мнимая часть = 4.0 -
    +
    # Вывод:
    +Действительная часть = 3.0
    +Мнимая часть = 4.0
    +
    • conjugate() - возвращает сопряжённое комплексное число.
    • Для нахождения модуля комплексного числа, используется встроенная функция abs().
    @@ -1198,7 +1341,7 @@

    Методы и свойства diff --git a/docs/posts/functions/featurelavalamp.svg b/docs/posts/functions/featurelavalamp.svg new file mode 100644 index 0000000..0a282d3 --- /dev/null +++ b/docs/posts/functions/featurelavalamp.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/posts/functions/index.html b/docs/posts/functions/index.html new file mode 100644 index 0000000..0ab5924 --- /dev/null +++ b/docs/posts/functions/index.html @@ -0,0 +1,2281 @@ + + + + + + + + + + Функции в Python · HFK + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    + +
    + + + + + + + + +
    +
    + + + +
    +
    + + + +
    + + +
    + +
      + + + + + + + + + +
    1. + Конспекты/ +
    2. + + + + +
    + + + +

    + Функции в Python +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + ·3361 слово·16 минут· + + + + + + + + + + + + + + + + + + + + + +
    + + + + + +
    + + + + + + + + + + + + + + Python + + + + + + + + Coding + + + + + + + + Functions + + + + + + + + + + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + +
    + +
    + +
    +
    + + +
    + + Оглавление + +
    + +
    +
    + + + + +
    +
    + + +
    + + +
    + + + Python - This article is part of a series. + + + + + + + + + + + + + + + + + + + + +
    + Part 5: This Article +
    + + + + + + + + +
    + + + +
    +
    + Вторая часть функций в Python (первую может выложу, может и нет). Типы аргументов, некоторые встроенные функции и lambda-функции. +
    + + + +

    Необязательные и именованные аргументы +
    + + + # + + +

    + + +

    Позиционные аргументы +
    + + + # + + +

    +

    Когда мы вызываем функции c позиционными аргументами, значения в них подставляются согласно позиции их имен в определении функции. Например код ниже выведет число 7. При вызове функции diff() первому параметру x будет соответствовать первый переданный аргумент – 10, а второму параметру y – второй аргумент – 3.

    +
    def diff(x, y):
    +    return x - y
    +
    +
    +res = diff(10, 3)  # используем позиционные аргументы
    +print(res)
    +

    + + +

    Именованные аргументы +
    + + + # + + +

    +

    Аргументы, передаваемые с именами, называются именованными. Чтобы передать именованные аргументы в функцию, нужно указать их имена, которые были заданы при объявлении функции:

    +
    def bar(length, char1, char2):
    +    return (char1 + char2) * length + char1
    +
    +print(bar(length=3, char1='-', char2='*'))
    +# => -*-*-*-
    +print(bar(char1='-', char2='*', length=3))
    +# => -*-*-*-
    +print(bar(char2='*', length=3, char1='-'))
    +# => -*-*-*-
    +

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

    + + + + + +
    + + + + + + + + + + + + + + Рекомендация по тому, когда стоит использовать именованные аргументы: если функция принимает больше трёх аргументов, нужно хотя бы часть из них указать по имени. +
    + +
    def make_circle(x, y, radius, line_width, fill):
    +    # тело функции
    +
    +make_circle(x=200, y=300, radius=17, line_width=2.5, fill=True)
    +
    + + + + +
    + + + + + + + + + + + + + + Мы можем вызывать функции, используя именованные и позиционные аргументы одновременно. Но позиционные значения должны быть указаны до любых именованных! +
    + +
    + + +

    Необязательные аргументы +
    + + + # + + +

    +

    Бывает, что какой-то параметр функции часто принимает одно и то же значение. Например, для функции print() установили значения параметров sep и end равными символу пробела и символу перевода строки, поскольку эти значения используют наиболее часто.
    +Другим примером служит функция int(), преобразующая строку в число. Она принимает два аргумента: первый аргумент – строка, которую нужно преобразовать в число, второй аргумент – основание системы счисления, значение по умолчению которого равно 10.

    +

    Чтобы задать значение параметра по умолчанию, в списке параметров функции достаточно после имени переменной написать знак равенства и нужное значение.
    +Параметры со значением по умолчанию идут последними.

    + + +

    Изменяемые типы данных в качестве занчений по умолчанию +
    + + + # + + +

    +

    Рассмотрим определение функции append(), где в качестве значения по умолчанию используется изменяемый тип данных:

    +
    def append(element, seq=[]):
    +    seq.append(element)
    +    return seq
    +

    Если вызвать функцию так, то мы получим неожиданный результат:

    +
    print(append(10))
    +print(append(5))
    +print(append(1))
    +
    # Вывод:
    +[10]
    +[10, 5]
    +[10, 5, 1]
    +

    Значение по умолчанию для параметра создается единожды при определении функции (обычно при загрузке модуля) и становится её атрибутом (свойством). Поэтому, если значение по умолчанию изменяемый объект, то его изменение повлияет на каждый следующий вызов функции.
    +Для решения проблемы можно использовать константу None в качестве значения параметра по умолчанию, а в теле функции устанавливать нужное значение:

    +
    def append(element, seq=None):
    +    if seq is None:
    +        seq = []
    +    seq.append(element)
    +    return seq
    +
    +print(append(10))
    +print(append(5))
    +print(append(1))
    +
    # Вывод:
    +[10]
    +[5]
    +[1]
    +

    + + +

    Функции с переменным количеством аргументов +
    + + + # + + +

    + + +

    Позиционные аргументы – *args +
    + + + # + + +

    +

    Рассмотрим определение функции my_func():

    +
    def my_func(*args):
    +    print(type(args))
    +    print(args)
    +
    +
    +my_func()
    +my_func(1, 2, 3)
    +my_func('a', 'b')
    +
    # Вывод:
    +<class 'tuple'>
    +()
    +<class 'tuple'>
    +(1, 2, 3)
    +<class 'tuple'>
    +('a', 'b')
    +
      +
    • В заголовке функции my_func() указан всего один параметр args, но со звездочкой перед ним. Звездочка в определении функции означает, что переменная (параметр) args получит в виде кортежа все аргументы, переданные в функцию при ее вызове от текущей позиции и до конца.
    • +
    • При описании функции можно использовать только один параметр помеченный звездочкой, причем располагаться он должен в конце списка параметров, иначе последующим параметрам не достанется значений.
    • +
    • Параметр со звёздочкой работает, даже если не передать аргументов.
    • +
    +

    Если мы хотим просуммировать несколько разных значений, не упаковывая их в список, можем написать следующую функцию (списки и кортежи при вызове нужно распаковывать):

    +
    def my_sum(*args):
    +    return sum(args)
    +
    +print(my_sum(1, 2, *[3, 4, 5], *(7, 8, 9), 10))
    +
    +# Вывод: 49
    +

    + + +

    Именованные аргументы – **kwargs +
    + + + # + + +

    +
    def my_func(**kwargs):
    +    print(type(kwargs))
    +    print(kwargs)
    +
    +my_func()
    +my_func(a=1, b=2)
    +my_func(name='Timur', job='Teacher')
    +
    # Вывод:
    +<class 'dict'>
    +{}
    +<class 'dict'>
    +{'a': 1, 'b': 2}
    +<class 'dict'>
    +{'name': 'Timur', 'job': 'Teacher'}
    +
      +
    • Именованные аргументы получаются в виде словаря, что позволяет сохранить имена аргументов в ключах.
    • +
    • Именованные аргументы можно передавать в функцию “пачкой” в виде словаря. Для этого нужно перед словарём поставить две звёздочки.
    • +
    • Параметр **kwargs пишется в самом конце, после последнего аргумента со значением по умолчанию. При этом функция может содержать и *args и **kwargs параметры:
    • +
    +
    def my_func(a, b, *args, name='Gvido', age=17, **kwargs):
    +    print(a, b)
    +    print(args)
    +    print(name, age)
    +    print(kwargs)
    +
    +my_func(1, 2, 3, 4, name='Timur', age=28, job='Teacher', language='Python')
    +my_func(1, 2, name='Timur', age=28, job='Teacher', language='Python')
    +my_func(1, 2, 3, 4, job='Teacher', language='Python')
    +
    # Вывод:
    +1 2
    +(3, 4)
    +Timur 28
    +{'job': 'Teacher', 'language': 'Python'}
    +
    +1 2
    +()
    +Timur 28
    +{'job': 'Teacher', 'language': 'Python'}
    +
    +1 2
    +(3, 4)
    +Gvido 17
    +{'job': 'Teacher', 'language': 'Python'}
    +

    + + +

    Keyword-only аргументы +
    + + + # + + +

    +

    В Python 3 добавили возможность пометить именованные аргументы функции так, чтобы вызвать функцию можно было, только передав эти аргументы по именам. Такие аргументы называются keyword-only и их нельзя передать в функцию в виде позиционных:

    +
    def make_circle(x, y, radius, *, line_width=1, fill=True):
    +    #код
    +
    +make_circle(10, 20, 5)                                    # x=10, y=20, radius=5,  line_width=1, fill=True
    +make_circle(x=10, y=20, radius=7)                         # x=10, y=20, radius=7,  line_width=1, fill=True
    +make_circle(10, 20, radius=10, line_width=2, fill=False)  # x=10, y=20, radius=10, line_width=2, fill=False
    +make_circle(x=10, y=20, radius=17, line_width=3)          # x=10, y=20, radius=17, line_width=3, fill=True
    +

    Здесь * выступает разделителем: отделяет обычные аргументы (их можно указывать по имени и позиционно) от строго именованных.
    +То есть аргументы x, y и radius могут быть переданы в качестве как позиционных, так и именованных аргументов. При этом аргументы line_width и fill могут быть переданы только как именованные аргументы.
    +Такой разделитель можно использовать только один раз в определении функции. Его нельзя применять в функциях с неограниченным количеством позиционных аргументов *args.

    +
    + + +

    Функции как объекты +
    + + + # + + +

    +

    Встроенные функции имеют следующий тип объекта:

    +
    print(type(print))
    +
    +# <class 'builtin_function_or_method'>
    +

    Тогда как функции, объявленные программистом, имеют тип <class 'function'>.

    +

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

    +
    def hello():
    +    print('Hello from function')
    +
    +
    +func = hello  #  присваиваем переменной func функцию hello
    +func()        #  вызываем функцию
    +
    +# Вывод: Hello from function
    +
    writeln = print
    +
    +writeln('Hello world!')
    +writeln('Python')
    +
    # Вывод:
    +Hello world!
    +Python
    +

    Присваивание переменной списка функций:

    +
    def f(x):
    +    return x**2
    +
    +
    +def g(x):
    +    return x**3
    +
    +
    +funcs = [f, g]
    +print(funcs[0](5), funcs[1](5))
    +
    +# Вывод: 25 125
    +
    + + + + +
    + + + + + + + + + + + + + + Функции, способные в качестве аргумента принимать или/и возвращать другие функции, называются функциями высшего порядка.
    +Функция, определяющая условия сравнения элементов, называется компаратор.
    +
    + +

    Такие встроенные функции, как min(), max(), sorted() могут принимать необязательный аргумент key – функцию, определяющую, по какому правилу будут сравниваться элементы (значение key должно быть функцией, принимающей один аргумент и возвращающей на его основе ключ для сравнения).

    +
    numbers = [10, -7, 8, -100, -50, 32, 87, 117, -210]
    +
    +print(max(numbers, key=abs))
    +print(min(numbers, key=abs))
    +print(sorted(numbers, key=abs))
    +
    # Вывод:
    +-210  # максимальный по модулю элемент
    +-7    # минимальный по модулю элемент
    +[-7, 8, 10, 32, -50, 87, -100, 117, -210] 
    +
    def compare_by_second(point):
    +    return point[1]
    +
    +
    +def compare_by_sum(point):
    +    return point[0] + point[1]
    +
    +
    +points = [(1, -1), (2, 3), (-10, 15), (10, 9), (7, 18), (1, 5), (2, -4)]
    +
    +print(sorted(points, key=compare_by_second))  # сортируем по второму значению кортежа
    +print(sorted(points, key=compare_by_sum))     # сортируем по сумме кортежа
    +

    + + +

    Функции в качестве возвращаемых значений других функций +
    + + + # + + +

    +

    В Python можно определять функцию внутри функции, ведь функция это объект:

    +
    def generator():
    +    def hello():
    +        print('Hello from function!')
    +    return hello
    +
    +func = generator()
    +func()
    +
    +# Вывод: Hello from function!
    +

    Мы можем написать генератор функций, который по параметрам a,b,c, построит и вернет нам конкретный квадратный трехчлен:

    +
    def generator_square_polynom(a, b, c):
    +    def square_polynom(x):
    +        return a * x**2 + b * x + c
    +
    +    return square_polynom
    +
    +f = generator_square_polynom(a=1, b=2, c=1)
    +g = generator_square_polynom(a=2, b=0, c=-3)
    +h = generator_square_polynom(a=-3, b=-10, c=50)
    +
    +print(f(1))
    +print(g(2))
    +print(h(-1))
    +
    # Вывод:
    +4
    +5
    +57
    +

    Вложенную функцию (square_polynom()), которая использует параметры внешней функции (generator_square_polynom()), называют замыканием.

    +
    + + +

    Функции высшего порядка +
    + + + # + + +

    +

    Функции, которые принимают и/или возвращают другие функции, называются функциями высшего порядка.

    + + +

    Функция map() +
    + + + # + + +

    +

    Функция, преобразующая каждый элемент переданного итерируемого объекта (можно воспринимать как классическое представление функции в математике – отображение множества в другое множество).
    +Возможная реализация:

    +
    def map(function, items):
    +    result = []
    +    for item in items:
    +        new_item = function(item)
    +        result.append(new_item)
    +
    +    return result
    +

    Мы можем совершать преобразования, используя функцию высшего порядка map():

    +
    def square(x):
    +    return x**2
    +
    +
    +def cube(x):
    +    return x**3
    +
    +
    +numbers = [1, 2, -3, 4, -5, 6, -9, 0]
    +
    +strings = map(str, numbers)      # используем в качестве преобразователя функцию str
    +abs_numbers = map(abs, numbers)  # используем в качестве преобразователя функцию abs
    +
    +squares = map(square, numbers)   # используем в качестве преобразователя функцию square
    +cubes = map(cube, numbers)       # используем в качестве преобразователя функцию cube
    +
    +print(strings)
    +print(abs_numbers)
    +print(squares)
    +print(cubes)
    +
    # Вывод:
    +['1', '2', '-3', '4', '-5', '6', '-9', '0']
    +[1, 2, 3, 4, 5, 6, 9, 0]
    +[1, 4, 9, 16, 25, 36, 81, 0]
    +[1, 8, -27, 64, -125, 216, -729, 0]
    +

    Мы также можем строить цепочки преобразований, несколько раз вызывая функцию map() (сначала мы преобразуем список строк в список чисел, затем находим их модуль внешней функцией map()):

    +
    numbers = ['-1', '20', '3', '-94', '65', '6', '-970', '8']
    +new_numbers = map(abs, map(int, numbers))
    +print(new_numbers)
    +
    +# Вывод: [1, 20, 3, 94, 65, 6, 970, 8]
    +

    + + +

    Функция filter() +
    + + + # + + +

    +

    Эта функция отображает часть элементов итерируемого объекта по определённому критерию.
    +Возможная реализация:

    +
    def filter(function, items):
    +    result = []
    +    for item in items:
    +        if function(item):        
    +            result.append(item)  # добавляем элемент item если функция function вернула значение True
    +
    +    return result
    +

    Функция filter() применяет предикат function к каждому элементу и добавляет в итоговый список только те элементы, для которых предикат вернул True.

    +
    def is_odd(num):
    +    return num % 2
    +
    +
    +def is_word_long(word):
    +    return len(word) > 6
    +
    +
    +numbers = list(range(15))
    +words = ['В', 'новом', 'списке', 'останутся', 'только', 'длинные', 'слова']
    +
    +odd_numbers = filter(is_odd, numbers)
    +large_words = filter(is_word_long, words)
    +
    +print(odd_numbers)
    +print(large_words)
    +
    # Вывод:
    +[1, 3, 5, 7, 9, 11, 13]
    +['останутся', 'длинные']
    +

    + + +

    Функция reduce() +
    + + + # + + +

    +

    Функция, применяющая указанную функцию к элементам последовательности, сводя её к единственному значению.
    +Возможная реализация:

    +
    def reduce(operation, items, initial_value):
    +    acc = initial_value
    +    for item in items:
    +        acc = operation(acc, item)
    +
    +    return acc
    +
    def add(x, y):
    +    return x+y
    +
    +
    +def mult(x, y):
    +    return x*y
    +
    +
    +numbers = [1, 2, 3, 4, 5]
    +
    +total = reduce(add, numbers, 0)
    +product = reduce(mult, numbers, 1)
    +
    +print(total)
    +print(product)
    +
    # Вывод:
    +15
    +120
    +

    + + +

    Встроенные функции map(), filter(), reduce() +
    + + + # + + +

    + + +

    Встроенная функция map() +
    + + + # + + +

    +

    Функция, применяющая другую функцию к итерируемому объекту. Имеет сигнатуру map(func, *iterables). В отличии от нашей реализации она может принимать сразу несколько последовательностей, переменное количество аргументов. Под подследовательностями имеются ввиду списки, строки, кортежи, множества, словари.

    +
    def increase(num):
    +    return num + 7
    +
    +
    +numbers = [1, 2, 3, 4, 5, 6]
    +new_numbers = map(increase, numbers)  # используем встроенную функцию map()
    +
    +print(new_numbers)
    +
    +# Вывод: <map object at 0x...>
    +

    Вернулся итерируемый объект <map object at 0x...>. Подобные ему объекты называются итераторами. Если мы хотим получить список/кортеж из итератора, нужно воспользоваться функцией list()/tuple(), а если распкаовать, то * (при этом сделать эти действия возможно только единожды, т.к. итератор “исчерпывает” себя).

    +

    Функции map() можно передать несколько последовательностей. В этом случае в функцию обратного вызова func будут передаваться сразу несколько элементов, расположенных в последовательностях на одинаковых позициях. При этом, если в последовательностях разное количество элементов, то последовательность с минимальным количеством элементов становится ограничителем.

    +
    def func(elem1, elem2, elem3):
    +    return elem1 + elem2 + elem3
    +
    +
    +numbers1 = [1, 2, 3, 4, 5]
    +numbers2 = [10, 20, 30, 40, 50]
    +numbers3 = [100, 200, 300, 400, 500]
    +
    +new_numbers = list(map(func, numbers1, numbers2, numbers3))  # преобразуем итератор в список
    +
    +print(new_numbers)
    +
    +# Вывод: [111, 222, 333, 444, 555]
    +

    Пример удобного использования функции map(), которой передано две последовательности:

    +
    circle_areas = [3.56773, 5.57668, 4.31914, 6.20241, 91.01344, 32.01213]
    +
    +result1 = list(map(round, circle_areas, [1]*6))        # округляем числа до 1 знака после запятой
    +result2 = list(map(round, circle_areas, range(1, 7)))  # округляем числа до 1,2,...,6 знаков после запятой
    +
    +print(circle_areas)
    +print(result1)
    +print(result2)
    +
    # Вывод:
    +[3.56773, 5.57668, 4.31914, 6.20241, 91.01344, 32.01213]
    +[3.6, 5.6, 4.3, 6.2, 91.0, 32.0]
    +[3.6, 5.58, 4.319, 6.2024, 91.01344, 32.01213]
    +

    + + +

    Встроенная функция filter() +
    + + + # + + +

    +

    Функция отображает часть элементов итерируемого объекта по определённому критерию. Имеет сигнатуру filter(func, iterable). В отличии от нашей реализации она может принимать любой итерируемый объект (список, строку, кортеж, и т.д.).

    +
    def func(elem):
    +    return elem >= 0
    +
    +
    +numbers = [-1, 2, -3, 4, 0, -20, 10]
    +positive_numbers = list(filter(func, numbers))  # преобразуем итератор в список
    +
    +print(positive_numbers)
    +
    +# Вывод: [2, 4, 0, 10]
    +

    Функция filter() также возвращает итератор.

    +

    Встроенной функции filter() можно в качестве первого параметра func передать значение None. В таком случае каждый элемент последовательности будет проверен на соответствие значению True. Если элемент в логическом контексте возвращает значение False, то он не будет добавлен в возвращаемый результат. В следующем коде значения списка [0, '', None, [], ()] позиционируется как False:

    +
    true_values = filter(None, [1, 0, 10, '', None, [], [1, 2, 3], ()])
    +
    +for value in true_values:
    +    print(value)
    +
    # Вывод:
    +1
    +10
    +[1, 2, 3]
    +

    + + +

    Функция reduce() +
    + + + # + + +

    +

    Для использования: from functools import reduce.

    +

    Функция, применяющая указанную функцию к элементам последовательности, сводя её к единственному значению. Имеет сигнатуру reduce(func, iterable, initializer=None). Если начальное значение не установлено, то в его качестве используется первое значение из последовательности iterable.

    +
    from functools import reduce
    +
    +
    +def func(a, b):
    +    return a + b
    +
    +
    +numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    +total = reduce(func, numbers, 0)  # в качестве начального значения 0
    +print(total)
    +
    +# Вывод: 55
    +

    + + +

    Анонимные функции +
    + + + # + + +

    +

    lambda – безымянные однострочные функции (называются анонимными или лямбда-функциями). По сути эти функции являются выражениями, при этом они имеют такой же тип данных, как обычные функции – <class 'function'>. После определения их можно сразу вызвать: print((lambda х, у: х + у)(5, 10)) # 5 + 10. +Общий формат определения: lambda список_параметров: выражение. В теле лямбда-функции нельзя использовать несколько действий и циклы, но можно использовать тернарный условный оператор. +Применение таких функций оправдано в следующих случаях:

    +
      +
    • однократное использование функции;
    • +
    • передача функций в качестве аргумента другим функциям;
    • +
    • возвращение функции в качестве результата другой функции.
    • +
    +
    def standard_function(x):        #  стандартное объявление функции
    +    return x*2
    +
    +lambda_function = lambda x: x*2  #  объявление анонимной функции
    +
    +print(standard_function(7))
    +print(lambda_function(7))
    +
    # Вывод:
    +14
    +14
    +
    f1 = lambda: 10 + 20            # функция без параметров
    +f2 = lambda х, у: х + у         # функция с двумя параметрами
    +f3 = lambda х, у, z: х + у + z  # функция с тремя параметрами
    +
    +print(f1())
    +print(f2(5, 10))
    +print(f3(5, 10, 30))
    +

    Лямбда-функции для нетипичной сортировки кортежей:

    +
    points = [(1, -1), (2, 3), (-10, 15), (10, 9), (7, 18), (1, 5), (2, -4)]
    +
    +print(sorted(points, key=lambda point: point[1]))             # сортируем по второму значению кортежа
    +print(sorted(points, key=lambda point: point[0] + point[1]))  # сортируем по сумме элементов кортежа
    +

    + + +

    Передача лямбда-функций в качестве аргументов +
    + + + # + + +

    +
      +
    • Функция map():
    • +
    +
    numbers = [1, 2, 3, 4, 5, 6]
    +
    +new_numbers1 = list(map(lambda x: x+1, numbers))   # увеличиваем на 1
    +new_numbers2 = list(map(lambda x: x*2, numbers))   # удваиваем
    +new_numbers3 = list(map(lambda x: x**2, numbers))  # возводим в квадрат
    +
    +
    +strings = ['a', 'b', 'c', 'd', 'e']
    +numbers = [3, 2, 1, 4, 5]
    +
    +new_strings = list(map(lambda x, y: x*y, strings, numbers))
    +
      +
    • Функция filter():
    • +
    +
    numbers = [-1, 2, -3, 4, 0, -20, 10, 30, -40, 50, 100, 90]
    +
    +positive_numbers = list(filter(lambda x: x > 0, numbers))   # положительные числа
    +large_numbers = list(filter(lambda x: x > 50, numbers))     # числа, большие 50
    +even_numbers = list(filter(lambda x: x % 2 == 0, numbers))  # четные числа
    +
    +
    +words = ['python', 'stepik', 'beegeek', 'iq-option']
    +
    +new_words1 = list(filter(lambda w: len(w) > 6, words))  # слова длиною больше 6 символов
    +new_words2 = list(filter(lambda w: 'e' in w, words))    # слова содержащие букву e
    +
      +
    • Функция reduce():
    • +
    +
    from functools import reduce
    +
    +words = ['python', 'stepik', 'beegeek', 'iq-option']
    +numbers = [1, 2, 3, 4, 5, 6]
    +
    +summa = reduce(lambda x, y: x + y, numbers, 0)
    +product = reduce(lambda x, y: x * y, numbers, 1)
    +sentence = reduce(lambda x, y: x + ' loves ' + y, words, 'Everyone')
    +
    # Вывод:
    +21
    +720
    +Everyone loves python loves stepik loves beegeek loves iq-option
    +

    + + +

    Возвращение лямбда-функции в качестве результата другой функции +
    + + + # + + +

    +

    Следующий пример показывает, что анонимные функции являются замыканиями, т.е. возвращаемая функция запоминает значения переменных a, b, c из внешнего окружения:

    +
    def generator_square_polynom(a, b, c):
    +    return lambda x: a*x**2 + b*x + c
    +

    + + +

    Условный оператор в теле лямбда-функции +
    + + + # + + +

    +

    Общий вид: значение1 if условие else значение2.

    +
    numbers = [-2, 0, 1, 2, 17, 4, 5, 6]
    +
    +result = list(map(lambda x: 'even' if x % 2 == 0 else 'odd', numbers))
    +
    +print(result)
    +
    +# Вывод: ['even', 'even', 'odd', 'even', 'odd', 'even', 'odd', 'even']
    +

    + + +

    Передача аргументов в анонимную функцию +
    + + + # + + +

    +

    Анонимные функции поддерживают все способы передачи аргументов:

    +
      +
    • позиционные;
    • +
    • именованные;
    • +
    • *args – переменный список позиционных аргументов;
    • +
    • **kwargs – переменный список именованных аргументов;
    • +
    • * – обязательные аргументы.
    • +
    +
    f1 = lambda x, y, z: x + y + z
    +f2 = lambda x, y, z=3: x + y + z
    +f3 = lambda *args: sum(args)
    +f4 = lambda **kwargs: sum(kwargs.values())
    +f5 = lambda x, *, y=0, z=0: x + y + z
    +
    +
    +print(f1(1, 2, 3))
    +print(f2(1, 2))
    +print(f2(1, y=2))
    +print(f3(1, 2, 3, 4, 5))
    +print(f4(one=1, two=2, three=3))
    +print(f5(1))
    +print(f5(1, y=2, z=3))
    +
    # Вывод:
    +6
    +6
    +6
    +15
    +6
    +1
    +6
    +

    + + +

    Функции any(), all(), zip(), enumerate() +
    + + + # + + +

    + + +

    Функция all() +
    + + + # + + +

    +

    Встроенная функция all() возвращает значение True, если все элементы переданной ей коллекции истинны, и False в противном случае. При работе со словарями функция all() проверяет на соответствие параметрам True ключи словаря.

    +
    print(all([1, 2, 3]))   
    +print(all([1, 2, 3, 0, 5]))
    +print(all([True, 0, 1]))
    +print(all(('', 'red', 'green')))
    +print(all({0j, 3+4j}))
    +
    +print()
    +
    +dict1 = {0: 'Zero', 1: 'One', 2: 'Two'}
    +dict2 = {'Zero': 0, 'One': 1, 'Two': 2}
    +print(all(dict1))
    +print(all(dict2))
    +
    # Вывод:
    +True
    +False
    +False
    +False
    +False
    +
    +False
    +True
    +

    Если переданный итерируемый объект пуст, то функция all() возвращает значение True.

    +
    print(all([]))        # передаем пустой список
    +print(all(()))        # передаем пустой кортеж
    +print(all(''))        # передаем пустую строку
    +print(all([[], []]))  # передаем список, содержащий пустые списки
    +
    # Вывод:
    +True
    +True
    +True
    +False
    +

    + + +

    Функция any() +
    + + + # + + +

    +

    Встроенная функция any() возвращает значение True, если хотя бы один элемент переданной ей коллекции является истинным, и False в противном случае. При работе со словарями функция any() проверяет на соответствие True ключи словаря.

    +
    print(any([0, 0, 0]))
    +print(any([0, 1, 0]))
    +print(any([False, 0, 1]))
    +print(any(['', [], 'green']))
    +print(any({0j, 3+4j, 0.0}))
    +
    +print()
    +
    +dict1 = {0: 'Zero'}
    +dict2 = {'Zero': 0, 'One': 1}
    +print(any(dict1))
    +print(any(dict2))
    +
    # Вывод:
    +False
    +True
    +True
    +True
    +True
    +
    +False
    +True
    +

    Eсли переданный итерируемый объект пуст, то функция any() возвращает значение False.

    +
    print(any([]))        # передаем пустой список
    +print(any(()))        # передаем пустой кортеж
    +print(any(''))        # передаем пустую строку
    +print(any([[], []]))  # передаем список, содержащий пустые списки
    +
    # Вывод:
    +False
    +False
    +False
    +False
    +

    + + +

    Функции all(), any() в связке с map() +
    + + + # + + +

    +

    Следующий код проверяет, все ли элементы списка больше 10:

    +
    numbers = [17, 90, 78, 56, 231, 45, 5, 89, 91, 11, 19]
    +
    +result = all(map(lambda x: True if x > 10 else False, numbers))  # анонимную функцию можно упростить до lambda x: x > 10
    +
    +if result:
    +    print('Все числа больше 10')
    +else:
    +    print('Хотя бы одно число меньше или равно 10')
    +

    Следующий код проверяет, чётен ли хотя бы один элемент коллекции:

    +
    numbers = [17, 91, 78, 55, 231, 45, 5, 89, 99, 11, 19]
    +
    +result = any(map(lambda x: x % 2 == 0, numbers))
    +
    +if result:
    +    print('Хотя бы одно число четное')
    +else:
    +    print('Все числа нечетные')
    +

    + + +

    Функция enumerate() +
    + + + # + + +

    +

    Встроенная функция enumerate() возвращает кортеж из индекса элемента и самого элемента переданной ей коллекции: enumerate(iterable, start), где iterable – итерируемый объект (колллекция), а start – необязательный параметр, задающий начальное значение индекса (по умолчанию start = 0). Эта функция возвращает объект-итератор, который можно перебрать, преобразовать в список функцией list() или распаковать *.

    +
    colors = ['red', 'green', 'blue']
    +print(list(enumerate(colors, start=1)))
    +
    +# Вывод: [(1, 'red'), (2, 'green'), (3, 'blue')]
    +

    + + +

    Функция zip() +
    + + + # + + +

    +

    Встроенная функция zip() объединяет отдельные элементы из каждой переданной ей коллекции в кортежи. Также возвращает итератор, который можно перебрать, преобразовать или распаковать. Если функции zip() передать итерируемые объекты, имеющие разную длину, то объект с наименьшим количеством элементов определяет итоговую длину.

    +
    numbers = [1, 2, 3, 4]
    +words = ['one', 'two']
    +romans = ['I', 'II', 'III']
    +
    +result = zip(numbers, words, romans)
    +print(list(result))
    +
    +# Вывод: [(1, 'one', 'I'), (2, 'two', 'II')]
    +
    numbers = [1, 2, 3]
    +words = ['one', 'two', 'three']
    +romans = ['I', 'II', 'III']
    +
    +result = zip(numbers, words, romans)
    +print(list(result))
    +
    +# Вывод: [(1, 'one', 'I'), (2, 'two', 'II'), (3, 'three', 'III')]
    +

    Частые случаи использования zip():

    +
      +
    • Для создания словарей, если ключи и значения находятся в разных списках:
    • +
    +
    keys = ['name', 'age', 'gender']
    +values = ['Timur', 28, 'male']
    +
    +info = dict(zip(keys, values))
    +print(info)
    +
    +# Вывод: {'name': 'Timur', 'age': 28, 'gender': 'male'}
    +
      +
    • Для параллельного итерирования по разным коллекциям:
    • +
    +
    name = ['Timur', 'Ruslan', 'Rustam']
    +age = [28, 21, 19]
    +
    +for x, y in zip(name, age):
    +    print(x, y)
    +
    # Вывод:
    +Timur 28
    +Ruslan 21
    +Rustam 19
    +
    +
    + + + + +
    + + + Python - This article is part of a series. + + + + + + + + + + + + + + + + + + + + +
    + Part 5: This Article +
    + + + + + + + + +
    + + + + +
    + + + + + + + + + + + + + + +
    + +
    + + +
    + + + + + + +
    + + + +

    + © + 2024 + Иван Бережной +

    + + + + +

    + + + Работает на Hugo & Blowfish +

    + + +
    + + + + + + +
    + +
    + + + diff --git a/docs/posts/functions2/index.html b/docs/posts/functions2/index.html index 0a01e2c..0b268cd 100644 --- a/docs/posts/functions2/index.html +++ b/docs/posts/functions2/index.html @@ -11,7 +11,7 @@ Функции в Python · HFK - + @@ -102,7 +102,7 @@ "keywords": ["python","coding","functions"], "mainEntityOfPage": "true", - "wordCount": "3363" + "wordCount": "3362" }] @@ -165,7 +165,7 @@
    - +

@@ -410,7 +505,7 @@ Добро пожаловать на мой сайт! :tada::tada:/ @@ -484,7 +579,7 @@

- ·3363 слов·16 минут· + ·3362 слов·16 минут· @@ -869,7 +964,7 @@

Позиционные аргументы

-

Когда мы вызываем функции c позиционными аргументами, значения в их аргументы подставляются согласно позиции их имен в определении функции. Например Такой код выведет число 7 При вызове функции diff() первому параметру x будет соответствовать первый переданный аргумент — 10, а второму параметру y — второй аргумент — 3.

+

Когда мы вызываем функции c позиционными аргументами, значения в них подставляются согласно позиции их имен в определении функции. Например код ниже выведет число 7. При вызове функции diff() первому параметру x будет соответствовать первый переданный аргумент — 10, а второму параметру y — второй аргумент — 3.

def diff(x, y):
     return x - y
 
diff --git a/docs/posts/index.html b/docs/posts/index.html
index 9f84336..361aaae 100644
--- a/docs/posts/index.html
+++ b/docs/posts/index.html
@@ -11,7 +11,7 @@
   Конспекты · HFK
   
   
-  
+  
   
   
   
@@ -127,7 +127,7 @@
   
   
- +

Здесь находятся мои конспекты о языке Python, программировании в целом и о других интересующих меня вещах

-
@@ -736,7 +830,7 @@

- ·1969 слов·10 минут + ·1973 слов·10 минут @@ -806,11 +900,11 @@

+
-
+
@@ -818,7 +912,7 @@

Функции в Python

+ href="/HFK_website/posts/functions/">Функции в Python

@@ -861,7 +955,7 @@

- ·3363 слов·16 минут + ·3361 слово·16 минут @@ -986,7 +1080,7 @@

- ·295 слов·2 минут + ·296 слов·2 минут @@ -1119,7 +1213,7 @@

- ·1324 слов·7 минут + ·1306 слов·7 минут @@ -1385,7 +1479,7 @@

- ·3394 слов·16 минут + ·3367 слов·16 минут diff --git a/docs/posts/index.xml b/docs/posts/index.xml index 91a56af..a9c69f0 100644 --- a/docs/posts/index.xml +++ b/docs/posts/index.xml @@ -24,7 +24,7 @@ Mon, 20 May 2024 00:00:00 +0000 http://localhost:1313/HFK_website/posts/big_o/ - Всё про нотацию Big O на примерах базовых колллекций в Python Big O - нотация, использующаяся в программировании, информатике для описания сложности алгоритмов. + Всё про нотацию Big O на примерах базовых колллекций в Python Big O – нотация, использующаяся в программировании, информатике для описания сложности алгоритмов. @@ -40,12 +40,12 @@ Функции в Python - http://localhost:1313/HFK_website/posts/functions2/ + http://localhost:1313/HFK_website/posts/functions/ Thu, 16 May 2024 00:00:00 +0000 - http://localhost:1313/HFK_website/posts/functions2/ + http://localhost:1313/HFK_website/posts/functions/ Вторая часть функций в Python (первую может выложу, может и нет). - + diff --git a/docs/posts/programming_paradigms/index.html b/docs/posts/programming_paradigms/index.html index c2858e8..2e207b3 100644 --- a/docs/posts/programming_paradigms/index.html +++ b/docs/posts/programming_paradigms/index.html @@ -11,7 +11,7 @@ Парадигмы программирования · HFK - + @@ -157,7 +157,7 @@
- +

+
# Вывод:
+abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+abcdefghijklmnopqrstuvwxyz
+0123456789
+0123456789abcdefABCDEF
+01234567
+!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
+0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ \t\n\r\x0b\x0c
+
@@ -863,7 +957,7 @@

Модуль string diff --git a/docs/posts/turtle/index.html b/docs/posts/turtle/index.html index 9864925..00cdd51 100644 --- a/docs/posts/turtle/index.html +++ b/docs/posts/turtle/index.html @@ -11,7 +11,7 @@ Черепашья графика · HFK - + @@ -66,7 +66,7 @@ - + @@ -101,7 +101,7 @@ "keywords": ["python","coding","turtle","modules"], "mainEntityOfPage": "true", - "wordCount": "295" + "wordCount": "296" }] @@ -164,7 +164,7 @@
- +