1from typing import Dict, Generator
+ + +4def filter_by_currency(date_list: list, currency: str = "USD") -> Generator[Dict, str, None]:
+5 """
+6 принимает на вход список словарей, представляющих транзакции.
+7 Функция должна возвращать итератор, который поочередно выдает транзакции,
+8 где валюта операции соответствует заданной (например, USD).
+ +10 :param date_list:
+11 :param currency:
+12 :return:
+13 """
+14 if not date_list or currency is None:
+15 return # если список отсутствует - выходим из функции
+ +17 normalized_currency = currency.strip().upper()
+18 """ currency надлежащего вида без пробелов и в верхнем регистре """
+ +20 for transaction in date_list:
+21 transaction_temp = transaction.get("operationAmount").get("currency")
+22 """ данную переменную завел на случай, если понадобится определять валюту не по коду а по имени """
+23 if transaction_temp.get("code") is not None and transaction_temp.get("code") == normalized_currency:
+24 yield transaction
+ + +27def transaction_descriptions(date_list: list) -> Generator[str]:
+28 """
+29 Принимает список словарей с транзакциями
+30 и возвращает описание каждой операции по очереди
+ +32 :param date_list:
+33 :return:
+34 """
+35 if not date_list:
+36 yield "Нет доступных транзакций"
+37 return # если список отсутствует - выходим из функции
+ +39 for transaction in date_list:
+40 description = str(transaction.get("description", "")).strip()
+41 """ описание транзакции если она имеется """
+42 if description is not None:
+43 yield description
+ + +46def card_number_generator(start_value: int = 1, end_value: int = 5) -> Generator[str]:
+47 """
+48 Генерирует номера карт
+49 от 0000 0000 0000 0001 до 9999 9999 9999 9999
+ +51 :param start_value: - начальное значение.
+52 Если стартовое значение <= 0 тогда оно автоматом приравнивается к 1
+53 :param end_value: - конечное значение
+54 :return:
+55 """
+ +57 zero_card = "0" * 16
+58 """ исходная пустая карта """
+ +60 current_number_card_integer = start_value if start_value > 0 else 1
+61 """ текущий номер карты """
+ +63 while True:
+64 current_number_card_str = str(current_number_card_integer)
+65 """ текущий номер карты в строковом эквиваленте """
+66 current_number_card_len = len(current_number_card_str)
+67 """ длинна сгенерированного номера в символах """
+68 zero_card = zero_card[:-current_number_card_len] + current_number_card_str
+69 yield f"{zero_card[0:4]} {zero_card[4:8]} {zero_card[8:12]} {zero_card[12:16]}"
+70 current_number_card_integer += 1
+71 if current_number_card_integer > end_value or current_number_card_integer > 9999999999999999:
+72 break # raise "Out of range!"
+