我正在尝试解决Euler项目的问题7,这是我拥有的代码
function handler () {
EVENT_DATA=$1
RESPONSE="{\"statusCode\": 200, \"body\": \"Hello from Lambda!\"}"
echo $RESPONSE
}
线
Run command
不起作用。我知道这不是最紧急的解决方案,需要大量时间,但是我想知道如何将这一行写为一行并使其正常工作。
这行代码应该说是将计数器除以小于计数器的每个数字。如果有任何值不产生余数,则该计数器不是素数
这个问题与欧拉问题7并没有任何关系。碰巧我正试图解决它,并认为它可以帮助您了解我正在努力实现的目标
谢谢
答案 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)]
是值True
和False
的列表-各个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)
all
和any
(同一页上的下一个功能)对于检查是否可迭代元素的所有/任何元素都是True
1 000 000
,它将进行所有998个划分(请参见下一点)。生成器随时随地生成其元素,因为1000000已被2整除,all
不会询问其他997个划分,因此不会计算i
是num
的除数,那么num/i
也是除数。并且,如果i
从2
开始增长,那么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
。)>