【发布时间】:2017-05-25 21:55:46
【问题描述】:
我的计算机科学老师给我们布置了一个问题:我们必须在不使用迭代的情况下列出前 100 个奇数。 我完全被卡住了。
【问题讨论】:
-
答案 = [1, 3, 5, 7, ...]。一旦写出这种东西,就会学到循环构造的好处。
标签: python list python-3.x tuples
我的计算机科学老师给我们布置了一个问题:我们必须在不使用迭代的情况下列出前 100 个奇数。 我完全被卡住了。
【问题讨论】:
标签: python list python-3.x tuples
您可以使用range 为您生成列表:
first_hundred_odd = list(range(1, 200, 2)) # get an iterator in 1..200 range with step of 2
你不需要在 Python 2.x 上把它变成一个列表。
更新:
是的,将range() 迭代器转换为list 本质上是执行迭代以填充列表,但这是在语言实现级别 - 您不会使用range() 迭代任何内容:
def first_odd(num):
return list(range(1, num * 2, 2))
.
2 0 LOAD_GLOBAL 0 (list)
3 LOAD_GLOBAL 1 (range)
6 LOAD_CONST 1 (1)
9 LOAD_FAST 0 (num)
12 LOAD_CONST 2 (2)
15 BINARY_MULTIPLY
16 LOAD_CONST 2 (2)
19 CALL_FUNCTION 3 (3 positional, 0 keyword pair)
22 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
25 RETURN_VALUE
那里没有跳跃。没有跳跃 == 没有迭代。
【讨论】:
range() 会直接产生一个列表,尽管在内部使用了相同的原理,但没有人会考虑这种“迭代”。
while 循环就是迭代的定义...
2 * 2 就是一个迭代......随你的便吧,我不是来争论或教导的。跨度>
2 * 2 的跳转,但您声称抽象的迭代很重要。从 Python 开发人员的角度来看,2 * 2 与 list(range(10)) 一样多 - 它不是,尽管两者都迭代一组指令(分别在 CPU 级别和机器指令级别)。至于citing,mea culpa,我的意思是引用,Techopedia 与任何资源一样好 - 拿起任何编程教科书,你会得到非常相似的定义,我会引用你的,但是我没有保留教科书的习惯,而且我很久以前就获得了计算机科学学位。无论哪种方式,一次又一次。
你可以这样做:
>>> list(range(200))[1::2]
【讨论】:
range() 来做你的竞标。