Python生成器;两个看似相同的程序工作方式不同

时间:2015-10-17 20:14:28

标签: python generator sieve

以下程序[Python 3.4]是一个简单的Eratosthenes筛子:

from itertools import *
def excl(ns,pr):
    return (i for i in ns if i%pr)
def sieve(ns):
    while True:
        pr=next(ns)
        yield pr
        ns=excl(ns,pr)
        # ns=(i for i in ns if i%pr)
r=list(islice(sieve(count(2)),10))

产生[2,3,5,7,11,13,17,19,23,29]。好。取消注释内联excl()并注释该调用的行,给出[2,3,4,5,6,7,8,9,10,11]。为什么呢?

它是否与在迭代循环的循环中修改序列时遇到的麻烦有关?

感谢您的任何提示。

1 个答案:

答案 0 :(得分:2)

您的问题是,生成器表达式引用的Sheet1 Exception in thread "main" com.google.gdata.util.InvalidEntryException: Bad Request Blank rows cannot be written; use delete instead. at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:602) at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:564) at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:560) at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:538) at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:536) at com.google.gdata.client.Service.insert(Service.java:1409) at com.google.gdata.client.GoogleService.insert(GoogleService.java:613) at GoogleSheetsApiTest.testConnectToSpreadSheet(GoogleSheetsApiTest.java:69) at GoogleSheetsApiTest.main(GoogleSheetsApiTest.java:27) 是您在while循环的下一次迭代中修改的相同pr ,因此每个数字都是不能被之前的“素数”整除。号码被视为' prime'。它本身会修改pr等等。在pr函数中,您引用的excl是作为参数传递的,它永远不会改变。