Модуль 9.2 Функция-генератор. Оператор yield.
Вводится натуральное число N. Необходимо определить функцию-генератор с именем get_sum, которая бы возвращала текущую сумму чисел последовательности длины N в диапазоне целых чисел [1; N]. Например:
— для первого числа 1 сумма равна 1;
— для второго числа 2 сумма равна 1+2 = 3
….
— для N-го числа сумма равна 1+2+…+(N-1)+NРеализовать функцию-генератор get_sum без использования коллекций. Вызывать ее не нужно, только определить.
# ввод значения N (эту переменную не менять) N = int(input()) # Функция-генератор get_sum принимает на вход число N, которое задает длину последовательности, сумму чисел которой нужно вычислить. def get_sum(N): # Начальная сумма равна 0 current_sum = 0 # В цикле for проходим по всем числам от 1 до N включительно for i in range(1, N+1): # Добавляем к текущей сумме текущее число i current_sum += i # Возвращаем текущую сумму yield current_sum
Мы с вами в заданиях несколько раз генерировали последовательность чисел Фибоначчи, которая строится по правилу: каждое последующее число равно сумме двух предыдущих. Для разнообразия давайте будем генерировать каждое последующее как сумму трех предыдущих чисел. При этом первые три числа равны 1 и имеем такую последовательность:
1, 1, 1, 3, 5, 9, 17, 31, 57, …
Не знаю, есть ли у нее название, поэтому, в рамках уроков, я скромно назову ее последовательностью Балакирева.
Итак, на вход программы поступает натуральное число N (N > 5) и необходимо определить функцию-генератор, которая бы возвращала N первых чисел последовательности Балакирева (включая первые три единицы).
Реализуйте эту функцию без использования коллекций (списков, кортежей, словарей и т.п.). Вызовите ее N раз для получения N чисел и выведите полученные числа на экран в одну строчку через пробел.
# ввод значения N N = int(input()) # Определение функции-генератора get_sum с параметром N def get_sum(N): # Инициализация первых трех чисел a = b = c = 1 # Цикл для генерации N чисел последовательности Балакирева for _ in range(N): # Возвращает текущее значение числа yield a # Обновление значений первых трех чисел a, b, c = b, c, a + b + c # Вывод на экран сгенерированных N чисел последовательности Балакирева print(*get_sum(N))
Вводится натуральное число N (N > 8). Необходимо определить функцию-генератор, которая бы выдавала пароль длиной N символов из случайных букв, цифр и некоторых других знаков. Для получения последовательности допустимых символов для генерации паролей в программе импортированы две строки: ascii_lowercase, ascii_uppercase (см. листинг ниже), на основе которых формируется общий список:
from string import ascii_lowercase, ascii_uppercase chars = ascii_lowercase + ascii_uppercase + "0123456789!?@#$*"Функция-генератор должна при каждом вызове возвращать новый пароль из случайно выбранных символов chars длиной N и делать это бесконечно, то есть, вызывать ее можно бесконечное число раз. Сгенерировать случайный индекс indx в диапазоне [a; b] для символа можно с помощью функции randint модуля random:
import random random.seed(1) indx = random.randint(a, b)Сгенерируйте с помощью этой функции первые пять паролей и выведите их в столбик (каждый с новой строки).
# импортируем модуль random для генерации случайных чисел import random # импортируем строки букв в нижнем и верхнем регистрах из модуля string from string import ascii_lowercase, ascii_uppercase # инициализируем генератор случайных чисел для воспроизводимости результатов random.seed(1) # определяем функцию-генератор pasw, которая принимает один аргумент N - длину пароля def pasw(N): # объединяем строки букв, цифр и символов в одну строку strg = "" # создаем пустую строку для формирования пароля chars = ascii_lowercase + ascii_uppercase + "0123456789!?@#$*" # генерируем пять паролей for j in range(5): # генерируем символы пароля for i in range(N): # выбираем случайный символ из списка chars и добавляем его в строку пароля strg = strg + chars[random.randint(0,len(chars))] # возвращаем пароль как результат выполнения генератора yield strg # обнуляем строку пароля для генерации следующего пароля strg = "" # считываем длину пароля с клавиатуры N = int(input()) # генерируем пароли с помощью функции-генератора и выводим их на экран for i in pasw(N): # выводим пароль print(i)
Вводится натуральное число N. Используя строки из латинских букв ascii_lowercase и ascii_uppercase:
from string import ascii_lowercase, ascii_uppercase chars = ascii_lowercase + ascii_uppercaseзадайте функцию-генератор, которая бы возвращала случайно сформированные email-адреса с доменом mail.ru и длиной в N символов. Например, при N=6, получим адрес: SCrUZo@mail.ru
Для формирования случайного индекса для строки chars используйте функцию randint модуля random:
import random random.seed(1) indx = random.randint(0, len(chars)-1)Функция-генератор должна возвращать бесконечное число таких адресов, то есть, генерировать постоянно. Выведите первые пять сгенерированных email и выведите их в столбик (каждый с новой строки).
import random from string import ascii_lowercase, ascii_uppercase # формируем список символов для пароля chars = ascii_lowercase + ascii_uppercase # устанавливаем начальное значение для генератора случайных чисел random.seed(1) # функция-обертка для добавления домена к email-адресу def add_domen(e="@wrap"): def wrapper(mail): return f"{mail + e}" return wrapper # генерация случайных символов def get_char(n): for i in range(n): char = chars[random.randint(0, len(chars) - 1)] yield char # запрашиваем у пользователя длину пароля ln = int(input()) # добавляем домен к email-адресу domen = "@mail.ru" pswrd = add_domen(domen) # генерируем 5 email-адресов for n in range(5): # создаем строку из случайных символов заданной длины и добавляем домен print(pswrd("".join(get_char(ln))))
Определите функцию-генератор, которая бы возвращала простые числа. (Простое число — это натуральное число, которое делится только на себя и на 1). Выведите с помощью этой функции первые 20 простых чисел (начиная с 2) в одну строчку через пробел.
def primes(n): # создаем список чисел от 2 до n nums = list(range(2, n+1)) i = 0 # проходим по всем числам до корня из n while i < len(nums) and nums[i] <= int(n**0.5): # удаляем все числа, кратные текущему числу nums = [x for x in nums if x == nums[i] or x % nums[i] != 0] i += 1 return nums # выводим первые 20 простых чисел print(*primes(100)[:20])
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы