如何解决使用yield from重构析因实现,产生了意外结果
我正在尝试在此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
希望您能明白为什么它不起作用。
相反,您可以尝试使用zip
和itertools.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 举报,一经查实,本站将立刻删除。