Реализация длинного деления с использованием функции-генератора в python

В качестве упражнения, чтобы попытаться понять функции генератора, я пытаюсь написать функцию, которая имитирует длинное деление и возвращает цифру номер один за раз. Я написал эту функцию, и она не работает. Однако, если я пройду через него по строкам в оболочке, он делает именно то, что я хочу, чтобы сделать это, я не уверен, что делать дальше. Я прочитал сообщения в Интернете о функциях генератора здесь:

и из того, что я понимаю, я просто заменяю оператор return оператором yield. Разве это не так? Может кто-нибудь, пожалуйста, скажите мне, что я делаю неправильно? Любая помощь приветствуется.

def decimals(number): """ Takes a numnber and generates the digits of 1/n. """ divisor = number dividend = 1 while dividend % divisor != 0: #Floor division is the // operator quotient = divisor // dividend remainder = dividend % divisor temp = quotient * divisor if remainder != 0 : temp = quotient * divisor if temp > dividend: dividend = dividend * 10 dividend = dividend - temp else: dividend = dividend - temp yield quotient def main(): gen = decimals(4) print(next(gen)) if __name__ == "__main__": main() 

One Solution collect form web for “Реализация длинного деления с использованием функции-генератора в python”

Основная проблема заключается в том, что вы выводите из генератора только одно значение: next(gen) . Чтобы вывести весь генератор, сделайте список из его значений: print(list(decimals(4))) или распечатайте его по значению:

 for digit in decimals(4): print(digit) 

Чтобы иметь дело с бесконечными генераторами (например, из звонка с decimals(3) ), вы можете, например, взять с него только ограниченное количество значений с помощью itertools.islice :

 from itertools import islice for digit in islice(decimals(3), 10): print(digit) 

Кроме того, я думаю, что что-то не так с вашим алгоритмом. Кажется, это не дает правильных результатов. Я думаю, он должен выглядеть примерно так:

 def decimals(number): """ Takes a number and generates the digits of 1/n. """ divisor = number dividend = 1 remainder = 1 while remainder: #Floor division is the // operator quotient = dividend // divisor remainder = dividend % divisor if remainder < divisor: dividend = remainder * 10 else: dividend = remainder yield quotient 

В качестве дополнительной заметки этот код все же может быть сокращен. Например:

 def decimals(number): dividend = 1 while dividend: yield dividend // number dividend = dividend % number * 10 
  • Может ли PyCharm перечислить все ошибки Python в проекте?
  • Opencv3 и Python 2.7 на виртуальном окружении - объект AttributeError: 'module' не имеет атрибута 'createLBPHFaceRecognizer'
  • как получить последнюю часть строки перед определенным символом?
  • Python argparse: Взаимно эксклюзивная группа с требуемым параметром
  • PyCharm включает и изменяет внешнюю библиотеку в проекте
  • Использовать текст Юникода с морским
  • Учитывая диапазон дат, как мы можем разбить его на N смежных поддиапазонов?
  • Как python присваивает значения после оператора присваивания
  • ValueError при использовании Scikit учится. Количество функций модели не соответствует числу функций ввода
  • «is» оператор неожиданно ведет себя с поплавками
  • UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0xc5
  •  
    Interesting Posts for Van-Lav

    Ошибка при установке pymssql на Mac OS X Lion

    Преобразовать шестизначную строку UUID с 32 символами в короткий идентификатор «YouTube» и обратно

    итерация над файловым объектом в Python не работает, но readlines () делает, но неэффективна

    Как отобразить pdf, который был загружен в python

    Локальная переменная, привязанная до назначения в Python

    карта мира без рек с matplotlib / Basemap?

    Почему json.dumps () необходимо в Flask?

    Как я могу конкатенировать серию на DataFrame с помощью Pandas?

    IOError: 13, «Permission denied» при записи в / etc / hosts через Python

    os.path.islink на windows с python

    Солить обе переменные класса и переменные экземпляра?

    Python против Java – что бы вы выбрали для одновременного программирования и почему?

    __init __ () отсутствует 1 требуемый позиционный аргумент: 'количество'

    как реализовать проверку орфографии python с помощью Google, «вы имели в виду?».

    Можно ли переопределить метод, используемый для вызова страницы подтверждения удаления администратора Django?

    Python - лучший язык программирования в мире.