Реализация длинного деления с использованием функции-генератора в 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 
  • как установить six.moves.xmlrpc_client?
  • Установка numpy в качестве зависимости с помощью setuptools
  • Пип-установка pygraphviz терпит неудачу: Неудачное строительное колесо для pygraphviz
  • В CMD «python» запускает Python 3.3, «py» запускает Python 2.7, как мне это изменить?
  • Как установить ограничение памяти для потока или процесса в python?
  • «is» оператор неожиданно ведет себя с поплавками
  • Как клонировать объект db sqlalchemy с новым первичным ключом
  • Ошибка с программой для угадывания игры
  • Python - лучший язык программирования в мире.