单线换向

时间:2019-05-05 20:40:30

标签: python

我正在尝试解决Euler项目的问题7,这是我拥有的代码

function handler () {
    EVENT_DATA=$1

    RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
    echo $RESPONSE
}

线

Run command

不起作用。我知道这不是最紧急的解决方案,需要大量时间,但是我想知道如何将这一行写为一行并使其正常工作。

这行代码应该说是将计数器除以小于计数器的每个数字。如果有任何值不产生余数,则该计数器不是素数

这个问题与欧拉问题7并没有任何关系。碰巧我正试图解决它,并认为它可以帮助您了解我正在努力实现的目标

谢谢

5 个答案:

答案 0 :(得分:3)

假设您想用“ counter[0, counter]范围内的任何数字整除”这样的说法,any就像一个超级字符:

if any((
  counter % i == 0
  for i in range(2, counter)  # note this implicitly contains "if counter != 1" condition
)):
  ...

答案 1 :(得分:3)

代替

if counter%[i for i in range (counter)] == 0 and counter != 1:

使用

if any([counter % i == 0  for i in range (counter)]) and counter != 1:

说明:

列表

[counter % i == 0  for i in range (counter)]

是值TrueFalse的列表-各个counter % i == 0的比较结果i

然后,如果此列表中的至少一个值为any(),则True函数将返回True

答案 2 :(得分:1)

看起来counter % [...]行旨在检查是否有小于当前数字的数字除以当前数字。要正确执行此操作,可以将每个数字从2迭代到当前数字,检查每个数字是否除以当前数字,然后检查较小的数字中没有一个(not any)除以counter。您可以通过重新排列当前检查来做到这一点。

例如:

primes = []
counter = 0
prime_count = 10002

while len(primes) < prime_count:
    counter += 1
    is_prime = counter != 1 and not any([i for i in range(2,counter) if counter % i == 0])
    if is_prime:
        primes.append(counter)

prime_count为10,我们得到primes的以下结果:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

答案 3 :(得分:0)

如果您要进行“真正的”单行素数测试:

import math

isprime=lambda num:all((num%i)!=0 for i in range(2,int(math.sqrt(num)+1)))

count=0
num=1
while count<10001:
  num+=1
  if isprime(num):
    count+=1
    #print(count,num)

print(count,num)
  • allany(同一页上的下一个功能)对于检查是否可迭代元素的所有/任何元素都是True
  • 非常有用
  • 列表理解很好,但是生成器在这里更出色(related howto page)。列表理解一步一步即可创建一个列表,如果所讨论的数字为1 000 000,它将进行所有998个划分(请参见下一点)。生成器随时随地生成其元素,因为1000000已被2整除,all不会询问其他997个划分,因此不会计算
  • 足以进行质数测试(或除数的集合)直到数字的平方根。之后,您发现相同的数字对,但速度较慢:如果inum的除数,那么num/i也是除数。并且,如果i2开始增长,那么num/i将从num/2开始下降。这两个序列在​​num的平方根处相遇,之后找不到“新”除数。

您可以尝试以下非基准测试(差异非常大,这里可以进行单次运行)以查看这些因素的影响:

import math,time

isprime1=lambda num:all((num%i)!=0 for i in range(2,int(math.sqrt(num)+1)))
isprime2=lambda num:all([(num%i)!=0 for i in range(2,int(math.sqrt(num)+1))])
isprime3=lambda num:all((num%i)!=0 for i in range(2,num))
isprime4=lambda num:all([(num%i)!=0 for i in range(2,num)])

def runtest(isprime):
  start=time.time()
  count=0
  num=1
  while count<10001:
    num+=1
    if isprime(num):
      count+=1
  end=time.time()
  print(count,num,end-start)

runtest(isprime1)
runtest(isprime2)
runtest(isprime3)
runtest(isprime4)

对我来说输出是

10001 104743 0.6920690536499023
10001 104743 3.529352903366089
10001 104743 110.67006587982178
10001 104743 1104.40642952919

答案 4 :(得分:0)

零件

if counter%[i for i in range (counter)] == 0 and counter != 1:
    pass
else:
    prime.append(counter)

可以替换为

if all([counter % i  for i in range (counter)]) and counter != 1:
    prime.append(counter)

(对于功能all(),表达式counter % i的行为与counter % i != 0相同,因为非零值被视为True。)