gpt4 book ai didi

python-3.x - Python : set(sympy. 素数范围(a,b))

转载 作者:行者123 更新时间:2023-12-01 01:58:28 25 4
gpt4 key购买 nike

(Python 3.5.1)

我一直在尝试使用 Sympy 解决一些 Project Euler 问题,但我遇到了一些奇怪的问题,关于如何 set(sympy.primerange(a, b))和类似的结构工作。

>>> import sympy
>>> PR = sympy.primerange(1, 20)
>>> set(PR)
{2, 3, 5, 7, 11, 13, 17, 19}

到现在为止还挺好。但:
>>> import sympy
>>> PR = sympy.primerange(1, 20)
>>> set(PR)
{2, 3, 5, 7, 11, 13, 17, 19}
>>> set(PR)
set()

只需调用 PR给我 <generator object primerange at 0x039C1720>调用 list(PR) 后一次或两次。 for p in PR: print(p) 也会发生同样的事情。和 list(PR) .

为什么这不起作用:
>>> import sympy, itertools
>>> sympy.sieve.extend(100)
>>> set(itertools.takewhile(lambda p: p<20, sympy.sieve))
set()
>>> sympy.sieve
<Sieve with 25 primes sieved: 2, 3, 5, ... 89, 97>

我们为什么不得到集合 {2, 3, 5, 7, 11, 13, 17, 19} ?

最佳答案

第一个现象与发电机有关。 sympy.primerange 返回 发电机 ,而不是列表。生成器让您可以迭代它们的元素一次,按需生成它们。对 set() 的调用迭代生成器 PR 中的每个元素,并使用它。

itertools.takewhile 的第二个参数需要一个可迭代对象。 sympy.sieve 是 不是 一个可迭代的。它允许您按索引请求任意素数,并维护动态内部筛子。因为 sympy.sieve 不是可迭代的,所以 takewhile 不能从中提取任何元素。这就是为什么你没有得到你预期的结果。

感谢你做 Project Euler。

关于python-3.x - Python : set(sympy. 素数范围(a,b)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38602194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com