Материал: Bilety_Programmirovanie

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
  1. Написание рекурсивных функций

Рекурсивной называется функция, внутри которой встречается вызов этой же функции, но с другими параметрами. Такая рекурсия называется простой.

Косвенной называется рекурсия, когда вызов функции осуществляется опосредованно: функция A вызывает функцию B, а функция B вызывает функцию A.

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

Общий формат записи рекурсивной функции:

def func(arg):

if граничные_условия:

return значение

else:

return выражение_с_рекурсивным_вызовом

Например, факториал числа

n!=1*2*...*(n-1)*n = (n-1)! * n,

0! = 1! = 1.

Т.е. n! выражается через (n-1)!

def fact(n):

if n == 0 or n == 1:

return 1

else:

return fact(n-1) * n

print('1! =', fact(1))

print('5! =', fact(5))

Рекурсивными могут функции, которые не возвращают значения.

Рассмотрим функцию для перевода десятичного числа в систему счисления (СС) с основанием n<10

def trans(a, n=2):

#если не указывать основание СС,

# то число переводится в 2-ичную СС

if a > 0:

trans(a//n, n) #переводим сначала целцю часть от деления a на n

print(a % n, end='')#выводим остатое от деления a на n

print()

trans(14)#перевод числа 14 в 2-ичную систему счисления

print()

trans(14, 3)#перевод числа 14 в 3-ичную систему счисления

print()

trans(14, 8)#перевод числа 14 в 8-ичную систему счисления

  1. Анонимные функции (lambda-выражение)

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

func = lambda x, y: x+y

print(func(4, 10))

print(func('Ivan ', 'Ivanov '))

Вывод: 14, Ivan Ivanov

Анонимные функции чаще всего используют внутри других стандартных функций, например, в sorted, filter, map, reduce и других.

Например, имеется последовательность чисел, вывести только четные элементы

s = [5, 4, 8, 6, 2, 1, 7]

s = filter(lambda x: x % 2 == 0, s)

print(*s)

Вывод: 4 8 6 2

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

In [18]:

d = {'bol': 3, 'map':5, 'ring': 2, 'apple':3, 'number':3, 'doll': 5, 'look':3}

d = sorted(d.items(), key=lambda x: (-x[1], x[0]))

print(d)

[('doll', 5), ('map', 5), ('apple', 3), ('bol', 3), ('look', 3), ('number', 3), ('ring', 2)]

  • Анонимная функция может иметь 0 или более параметров, но в теле функции есть только одно выражение (expression). Значение выражения является возвращенным значением функции. Но нельзя использовать оператор return сразу перед выражением.

  • Список параметров разделен запятой, и не должен быть в круглых скобках ( ).

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

  • Анонимная функция не может вызвать напрямую функцию print, так как lambda требует выражение.

  1. Понятие модуля. Модули в Python. Подключение модулей. Создание своего модуля и пакета модулей.

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

Подключение модулей

Подключить модуль можно с помощью инструкции import.После ключевого слова import указывается название модуля.

import time

Использование псевдонимов

Если название модуля слишком длинное, или оно вам не нравится по каким-то другим причинам, то для него можно создать псевдоним, с помощью ключевого слова as.

import math as m

Подключить определенные атрибуты модуля можно с помощью инструкции from.

from math import cos

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

Если необходимо импортировать все фукнции, классы и т.п. из модуля, то воспользуйтесь следующей формой оператора from имя_модуля import *

Создание своего модуля

Чтобы создать свой модуль в Python достаточно сохранить ваш скрипт с расширением .py Теперь он доступен в любом другом файле. Например, создадим два файла: module_1.py и module_2.py и сохраним их в одной директории. В первом запишем:

def hello():

print ("Hello from module_1")

А во втором вызовем эту функцию:

from module_1 import hello

hello()

Выполнив код второго файла получим:

Hello from module_1

Пакеты модулей

Отдельные файлы-модули с кодом на Python могут объединяться в пакеты модулей. Пакет это директория (папка), содержащая несколько отдельных файлов-скриптов.

Например, имеем следующую структуру:

|_ my_file.py

|_ my_package

|_ __init__.py

|_ inside_file.py

В файле inside_file.py определена некая функция foo. Тогда чтобы получить доступ к функции foo, в файле my_file следует выполнить следующий код:

from my_package.inside_file import foo

  1. Модуль math, Модуль random

Встроенный модуль math в Python предоставляет набор функций для выполнения математических, тригонометрических и логарифмических операций. Некоторые из основных функций модуля:

pow(num, power): возведение числа num в степень power ;sqrt(num): квадратный корень числа num

ceil(num): округление числа до ближайшего наибольшего целого

floor(num): округление числа до ближайшего наименьшего целого; factorial(num): факториал числа

degrees(rad): перевод из радиан в градусы; radians(grad): перевод из градусов в радианы

cos(rad): косинус угла в радианах; sin(rad): синус угла в радианах

tan(rad): тангенс угла в радианах; acos(rad): арккосинус угла в радианах

asin(rad): арксинус угла в радианах; atan(rad): арктангенс угла в радианах

log(n, base): логарифм числа n по основанию base; log10(n): десятичный логарифм числа n

Также модуль math предоставляет ряд встроенных констант, такие как PI и E:  import math  radius = 30 # площадь круга с радиусом 30  area = math.pi * math.pow(radius, 2)  print(area)  number = math.log(10, math.e) # натуральный логарифм числа 10  print(number) 

Модуль random предоставляет функции для генерации случайных чисел, букв, случайного выбора элементов последовательности.

random.random() - возвращает случайное вещественное число от 0 до 1

random.randrange([start,] stop[, step]) - возвращает случайно выбранное число из последовательности range([start,] stop[, step])

random.randint(A, B)- возвращает случайное целое число N из отрезка от А до B

random.choice(sequence) - возвращает случайный элемент непустой последовательности sequence

random.shuffle(sequence, [rand]) - перемешивает последовательность sequence, изменяется сама последовательность. Поэтому функция не работает для неизменяемых объектов

random.sample(population, k) - возвращает список длиной k из последовательности population

random.uniform(A, B) - возвращает случайное число с плавающей точкой N, A ≤ N ≤ B (или B ≤ N ≤ A)

Рассмотрим примеры.

import random

print("random:", random.random(), random.random(), random.random())#случайное вещественное число от 0 до 1

print("random:", random.random()*100, random.random()*100, random.random()*100) #случайное вещественное число от 0 до 100

print("uniform:", random.uniform(50, 100), random.uniform(50, 100), \

random.uniform(50, 100)) #случайное вещественное число от 50 до 100

print("randrange(100):", random.randrange(100), random.randrange(100),\ #randrange(100): 84 50 82 12

random.randrange(100), random.randrange(100)) #случайные числа из последовательности чисел от 0 до 100

print("randrange(50,100):", random.randrange(50,100), \ #randrange(50,100): 69 91 95

random.randrange(50,100), random.randrange(50,100)) #случайные числа из последовательности чисел от 50 до 100

print("randrange(50,100,2):", random.randrange(50,100,2), \ #randrange(50,100,2): 52 78 90

random.randrange(50,100,2), random.randrange(50,100,2)) #случайные чётные числа из последовательности чисел от 50 до 100

print(random.choice([10, 3, -3, 789, 323, 5, 12])) #случайный элемент из последовательности

s = [10, 3, -3, 789, 323, 5, 12]

random.shuffle(s) #Перемешиваем элементы последовательности s

#!!! Нельзя применять к строкам и кортежам

print(s) #[10, 3, -3, 789, 323, 5, 12]

s = [10, 3, -3, 789, 323, 5, 12]

#последовательность из 3-х случайных элементов последовательности s

print(random.sample(s, 3)) #[789, -3, 12]

  1. Модуль datatime, Модуль itertools

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

Класс datetime.date(year, month, day) - стандартная дата. Атрибуты: year, month, day. Неизменяемый объект.

datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None) - стандартное время, не зависит от даты. Атрибуты: hour, minute, second, microsecond, tzinfo

datetime.timedelta - разница между двумя моментами времени, с точностью до микросекунд

datetime.tzinfo - абстрактный базовый класс для информации о временной зоне (например, для учета часового пояса и / или летнего времени)

datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None) - комбинация даты и времени

Методы класса datetime:

datetime.today() - объект datetime из текущей даты и времени. Работает также, как и datetime.now() со значением tz=None.

datetime.fromtimestamp(timestamp) - дата из стандартного представления времени.

datetime.fromordinal(ordinal) - дата из числа, представляющего собой количество дней, прошедших с 01.01.1970.

datetime.now(tz=None) - объект datetime из текущей даты и времени.

datetime.combine(date, time) - объект datetime из комбинации объектов date и time.

datetime.strptime(date_string, format) - преобразует строку в datetime (так же, как и функция strptime из модуля time).

datetime.strftime(format) - см. функцию strftime из модуля time.

datetime.date() - объект даты (с отсечением времени).

datetime.time() - объект времени (с отсечением даты).

datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]) - возвращает новый объект datetime с изменёнными атрибутами.

datetime.timetuple() - возвращает struct_time из datetime.

datetime.toordinal() - количество дней, прошедших с 01.01.1970.

datetime.timestamp() - возвращает время в секундах с начала эпохи.

datetime.weekday() - день недели в виде числа, понедельник - 0, воскресенье - 6.

datetime.isoweekday() - день недели в виде числа, понедельник - 1, воскресенье - 7.

datetime.isocalendar() - кортеж (год в формате ISO, ISO номер недели, ISO день недели).

datetime.isoformat(sep='T') - красивая строка вида "YYYY-MM-DDTHH:MM:SS.mmmmmm" или, если microsecond == 0, "YYYY-MM-DDTHH:MM:SS"

import datetime as dt

print("Today", dt.datetime.today()) #Today 2020-12-08 17:24:42.701024

print("Today", dt.datetime.today().strftime("%d.%m.%Y")) #Today 08.12.2020

print("Now", dt.datetime.now()) #Now 2020-12-08 17:24:42.702023

Модуль itertools

Модуль служит для создания собственных итераторов.

# подключение модуля

import itertools

Модуль itertools. Бесконечные последовательности

count([start = 0][, step = 1]) – создает бесконечную нарастающую последовательность элементов

for i in itertools.count():

if i > 10 : break

print(i, end = ' ') #0 1 2 3 4 5 6 7 8 9 10

cycle(последовательность) – на каждой итерации возвращается очередной элемент последовательности, после того как достигнут последний элемент последовательности перебор начинается сначала

repeat (объект [, количество повторов]) – возвращает объект указанное кол-во раз

for i in itertools.repeat([1, 2, 3], 2):

print(i)

[1, 2, 3]

[1, 2, 3]

Источник: https://studfile.net/preview/16688519/