在 python 中使用生成器函数实现长除法
Implementing long division using a generator function in python
作为尝试理解生成器函数的练习,我正在尝试编写一个模拟长除法的函数,并且 return 一次计算一位数。这个函数我写了,好像不行。但是,如果我在 shell 中逐行执行它,它会完全按照我想要的方式执行,所以我不确定下一步该怎么做。我已经阅读了互联网上关于生成器函数的帖子:
据我所知,我只是用 yield 语句替换了 return 语句。不是这样吗?谁能告诉我我做错了什么?感谢任何帮助。
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()
您的主要问题是您只从生成器输出一个值: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
作为尝试理解生成器函数的练习,我正在尝试编写一个模拟长除法的函数,并且 return 一次计算一位数。这个函数我写了,好像不行。但是,如果我在 shell 中逐行执行它,它会完全按照我想要的方式执行,所以我不确定下一步该怎么做。我已经阅读了互联网上关于生成器函数的帖子:
据我所知,我只是用 yield 语句替换了 return 语句。不是这样吗?谁能告诉我我做错了什么?感谢任何帮助。
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()
您的主要问题是您只从生成器输出一个值: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