syntax是罚款(第2条)。 异构体有某些可避免的并发症,这种非一次性的包裹:
for x in range(2,int(sqrt(num))):
if( num % x == 0 ):
flag = False
range(2,Y)
,从2个列入到Y
,其中不包括<>/strong>,因此,你往往不核对最后可能的分歧,因此认为“primes”有许多是t。 作为最简单的固定装置,在<代码>-range上尝试了<1> + int(......。 之后,消除这些可避免的并发症是可取的:例如,
if somebool: return True
else: return False
由于更简单的<代码>回到了某些bool/code>,因此永远没有必要。
举例来说,你整个法典的简化版本(只有不可或缺的优化,但完全是相同的算法)可能是:
from math import sqrt
def isPrime(num):
for x in range(3, int(1 + sqrt(num)), 2):
if num % x == 0: return False
return True
def main():
i, n = 0, 3
end = 6
while i < end:
if isPrime(n):
i += 1
print n
n += 2
if __name__ == __main__ :
main()
“一旦你知道答案”已经解释过,我就增加了一个更为关键的优化(+=2,而不是n<>t>/code>,因为我们的“知识”甚至数字“;3个不是主要内容;3个是“<>range<>>/code>的斜线”。
有可能找到切割者,例如:
def isPrime(num):
return all(num % x for x n range(3, int(1 + sqrt(num)), 2))
虽然如果你不熟悉<<>all的编码>,这也许不会看上去“simpler”,但事实上,这是为了节省了你的工作(和读法者必须遵循的)低水平逻辑,有利于适当程度的抽象,表达功能的关键思想,即“当司被审理时,核心是所有可能的奇分辨者......”(即直接以精确和可执行的形式表述这一概念)。 内部算法实际上仍然相同。
进一步......:
import itertools as it
def odd():
for n in it.count(1):
yield n + n + 1
def main():
end = 5
for i, n in enumerate(it.ifilter(isPrime, odd())):
print n
if i >= end: break
同样,这只是与以往一样的算法,在更为适当的抽象程度上刚刚表述:将奇数的顺序(从3个包括上层)引入自己的<代码>(奇代码>生成者,以及在一定程度上使用<代码>(数字代码>内和itertools
)以避免不适当(和不必要的)低级表述/推理功能。
我再说一遍:尚未适用基本优化——只是适当的抽象。 在其他地方,例如。 (可能也要检查评论!) 这里,我着重说明(如果包含诸如<编码>数字、all
和any
、重要<代码>itertools、加上发电机和发电机表示),在现代螺旋式螺旋式螺旋中,与“C-insed”相比,许多“电离”问题可在较适当的抽象程度在现代螺旋式螺旋式螺旋式螺旋式中表达,而“C-insed”则可能最自然地出现在以C方案拟订方式重新组合的多数方案设计者身上。 (C++使用先由Steanov确定的“强烈惩罚”的学者可能会令人惊讶地看到,Adhury通常会具有“举动溢价”,特别是如果“itertools<>因其bla升速度而广为人知,则广泛而适当地使用......但实际上这是一个不同的主题;-)