我正在尝试创建所有小于或等于给定数字的质数的列表。我使用for循环成功做到了这一点。我试图使用python使用列表理解来实现相同的目的。但是我的输出有一些意外的值。
这是我的代码。
pr=[2]
pr+=[i for i in xrange(3,num+1) if not [x for x in pr if i%x==0]]
Run Code Online (Sandbox Code Playgroud)
num我从用户那里输入的号码在哪里?
上面代码的输出为
num=20 is this: [2, 3, 5, 7, 9, 11, 13, 15, 17, 19]
Run Code Online (Sandbox Code Playgroud)
我对为什么输出中有9和15感到困惑。我在这里做错了什么?
这样根本行不通。列表推导是单独评估的,因此可以像这样想象:
pr = [2]
tmp = [i for i in xrange(3,num+1) if not [x for x in pr if i%x==0]]
pr += tmp
Run Code Online (Sandbox Code Playgroud)
在tmp评估时间时,pr仅包含2,因此您仅检查数字是否可被2整除(即,是否为偶数)。这就是为什么您得到所有不平衡数字的原因。
你根本解决不了这个很好†应用列表解析。
†不好,但是很丑陋,而且很笨拙,通过滥用可以在列表理解内调用函数:
pr = [2]
[pr.append(i) for i in xrange(3,num+1) if not [x for x in pr if i%x==0]]
print(pr) # [2, 3, 5, 7, 11, 13, 17, 19]
Run Code Online (Sandbox Code Playgroud)
这会滥用列表理解力,并且基本上会None为您添加到的每个素数收集一个值pr。因此,除了我们不必要地None在列表中收集值外,它本质上与您的常规for循环类似,因此您应该允许自己使用换行符而仅使用常规循环。