微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用yield from重构析因实现,产生了意外结果

如何解决使用yield from重构析因实现,产生了意外结果

下面的第一个函数使用yield语句实现阶乘函数的递归版本。

我正在尝试在此yield from中使用factorial()语句,以进行实验和学习。 因此,我编写了factorial2()函数,尽管该函数打印了正确的阶乘,但并未输出所有先前的值,例如factorial()

我想知道是否有办法获得与factorial()中的factorial2()完全相同的功能

def factorial(n):
    if n == 1:
        yield 1
    else:
        for u in factorial(n - 1):
            yield u
        yield u * n

def factorial2(n):
    if n == 1:
        yield 1
    else:
        yield from (i * n for i in factorial2(n - 1))

def main():
    for u in factorial(12):
        print(u)
    for a in factorial2(12):
        print(a)

if __name__ == '__main__': main()

输出

1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
479001600

预期输出:(与factorial()相同)

1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600
1
2
6
24
120
720
5040
40320
362880
3628800
39916800
479001600

解决方法

您可以使用生成器中的返回值来完成此操作,这是<script src="https://www.paytabs.com/express/v4/paytabs-express-checkout.js" id="paytabs-express-checkout" data-secret-key="merchant_secret_key" data-merchant-id="merchant_id" data-url-redirect="http://example.com/callback/" data-amount="10.0" data-currency="SAR" data-title="John Doe" data-product-names="Iphone" data-order-id="25" data-customer-phone-number="5486253" data-customer-email-address="john.deo@paytabs.com" data-customer-country-code="973" > </script> 表达式最终将返回的结果:

yield from
,

您为factorial2使用的代码等效于:

# wrong code,do not use
def factorial2(n):
    if n == 1:
        yield 1
    else:
        for i in factorial2(n - 1):
            yield i * n

希望您能明白为什么它不起作用。

相反,您可以尝试使用zipitertools.count从另一方面解决此问题。

from itertools import count

def factorial3(n):
    yield 1
    if n > 1:
        yield from (u * i for u,i in zip(factorial3(n - 1),count(2)))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。