Python代码结构&;约定-为具有循环的列表创建元素

Python代码结构&;约定-为具有循环的列表创建元素,python,Python,我已经在python-guide.org上读了一些文章,并重温了我的一些代码,以清理它们并养成良好的习惯。在我的一个程序中,我想在用户定义的范围内生成奇数列表: i = 3 while i <= limit: #Test whether the number is odd by checking remainder is not 0 if i % 2 != 0: integers.append(i) i += 1 它们都产生相同的输出,但是第二个例

我已经在python-guide.org上读了一些文章,并重温了我的一些代码,以清理它们并养成良好的习惯。在我的一个程序中,我想在用户定义的范围内生成奇数列表:

i = 3
while i <= limit:
    #Test whether the number is odd by checking remainder is not 0
    if i % 2 != 0:
        integers.append(i)
    i += 1
它们都产生相同的输出,但是第二个例子会被归类为有点疯狂吗?一份声明中是否有太多内容

谢谢你的想法,
皮特

此列表:

integers = [int(n) for n in range(2, limit + 1) if (n is 2) or (n % 2 != 0)]
可以进一步简化:

integers = [2] + [n for n in range(3, limit+1) if n % 2]
说明:

  • 您不需要将
    n
    转换为
    int
    ,它已经是一个整数了
  • 您应该使用
    ==
    来比较数字是否相等,而不是
    is
    。不管怎样,从循环中得到这个条件是一个更好的主意,在整个迭代中只有一次是正确的。我宁愿在开头加上数字2
  • 表达式
    n%2!=0
    作为条件等价于
    n%2
    ,因为在Python中
    0
    被认为是虚假的,而任何其他非零值都是真实的
或者,您可以在适当的位置修改列表,以在开头添加缺少的数字(这应该更有效一些):


不,这不会被归类为坚果。这是用Python创建列表的惯用方法,它比编写显式循环更快(性能方面)。

列表理解有一点错误

您使用的是
n is 2
而不是
n==2
。这在你的列表理解中甚至不需要(见@ÓscarLópez的答案),但为了清晰起见,这里就是

is
比较两件事的身份:

>>> id(a)
4298180600
>>> id(9)
4298180600
>>> a is 9
True
>>> 
但是,这与
=
不同,后者只检查它们是否相同,而不接受
id
s

例如,
=
表示以下内容相同(正确响应),但
表示相反:

>>> [1] == [2-1]
True
>>> [1] is [2-1]
False
>>> [2-1]
[1]
>>> 
或:


注意:执行
(n为2)
是错误的。
is
运算符用于比较两个对象的标识。您应该使用
==
来比较值。列表理解被认为更像“python式”,而奥斯卡·洛佩兹答案中较短的一个也很清楚。您确定吗<代码>>>>限制=10>>[int(n)表示范围(2,限制+1)中的n,如果(n是2)或(n%2!=0)]**[2,3,5,7,9]***>[n表示范围(2,限制+1)中的n,如果n%2]**[3,5,7,9]**/code>这是我最初的想法,但我需要数字2作为列表中的第一个元素,这就是为什么(n是2)必须包含在if语句中的原因。。。然后它就失控了。要进一步阅读python约定,请阅读PEP8:ThankÓscar这很有帮助。Well 2并不奇怪,为什么要将它列在列表中?
>>> id(a)
4298180600
>>> id(9)
4298180600
>>> a is 9
True
>>> 
>>> [1] == [2-1]
True
>>> [1] is [2-1]
False
>>> [2-1]
[1]
>>> 
>>> foo = 10
>>> dir(foo) == dir(10)
True
>>> dir(foo) is dir(10)
False
>>>