以下程序[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]。为什么呢?
它是否与在迭代循环的循环中修改序列时遇到的麻烦有关?
感谢您的任何提示。
答案 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
是作为参数传递的,它永远不会改变。