【问题标题】:Python 3: Make a list of odd numbers without iteration [closed]Python 3:在没有迭代的情况下制作奇数列表[关闭]
【发布时间】:2017-05-25 21:55:46
【问题描述】:

我的计算机科学老师给我们布置了一个问题:我们必须在不使用迭代的情况下列出前 100 个奇数。 我完全被卡住了。

【问题讨论】:

  • 答案 = [1, 3, 5, 7, ...]。一旦写出这种东西,就会学到循环构造的好处。

标签: python list python-3.x tuples


【解决方案1】:

您可以使用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

那里没有跳跃。没有跳跃 == 没有迭代。

【讨论】:

  • 在内部确实如此 - 开发人员没有使用给定任务的迭代。在 Python 2.x 上使用 range() 会直接产生一个列表,尽管在内部使用了相同的原理,但没有人会考虑这种“迭代”。
  • @Uriel - 您能否指出在上述代码中显示迭代的选项代码? while 循环就是迭代的定义...
  • 我不敢相信我必须在 SO 上引用基本的 Programming 101 定义:在计算机编程的上下文中,迭代是一个过程,其中一组指令或结构在序列指定次数或直到满足条件。。没有跳跃就不能进行迭代,而不是在经典的计算机硬件上。如果你要争辩说抽象出的迭代被认为是应用程序级别的迭代,那么2 * 2 就是一个迭代......随你的便吧,我不是来争论或教导的。跨度>
  • 我没有看到 2 * 2 的跳转,但您声称抽象的迭代很重要。从 Python 开发人员的角度来看,2 * 2list(range(10)) 一样多 - 它不是,尽管两者都迭代一组指令(分别在 CPU 级别和机器指令级别)。至于citingmea culpa,我的意思是引用,Techopedia 与任何资源一样好 - 拿起任何编程教科书,你会得到非常相似的定义,我会引用你的,但是我没有保留教科书的习惯,而且我很久以前就获得了计算机科学学位。无论哪种方式,一次又一次。
  • 我不是来争论的,虽然我不同意,但你似乎被一种被宣布为正确的冲动所占据。恭喜,你赢得了我的支持。
【解决方案2】:

你可以这样做:

>>> list(range(200))[1::2]

【讨论】:

  • 没有理由生成整个 200 元素列表只是为了在之后对其进行切片,让range() 来做你的竞标。
  • @zwer 是的,你是对的,这确实不如你的方法有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-26
  • 2021-01-10
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
相关资源
最近更新 更多