Решение модуля 9.2 Добрый, добрый Python

Модуль 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])

Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы

Понравилась статья? Поделиться с друзьями:
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x