【问题标题】:Implementing long division using a generator function in python在python中使用生成器函数实现长除法
【发布时间】:2015-06-08 01:56:28
【问题描述】:

作为尝试理解生成器函数的练习,我正在尝试编写一个模拟长除法并一次返回一个数字的函数。我已经编写了这个函数,但它似乎不起作用。但是,如果我在 shell 中逐行执行它,它会完全按照我的意愿执行,所以我不确定接下来要做什么。我在这里阅读了互联网上有关生成器功能的帖子:

据我了解,我只是将 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()

【问题讨论】:

  • 到底有什么问题。你还没有真正描述问题。第二。如果这个数分成无穷大,程序将永远不会停止。打印功能会因为尝试输出的数据量而滞后。
  • 次要评论,您可以将商/余数计算减少到quotient, remainder = divmod(dividend, divisor)。其实......为什么你有两个颠倒你所拥有的? divisor 不是在 dividend 后面吗?

标签: python python-2.7 generator division


【解决方案1】:

您的主要问题是您只从生成器输出一个值: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 2018-07-12
    • 2019-02-15
    • 2011-09-18
    • 1970-01-01
    • 2020-08-08
    相关资源
    最近更新 更多