【问题标题】:Python For loops in While loop, starting for loop with a specific valueWhile循环中的Python For循环,以特定值开始for循环
【发布时间】:2012-12-12 18:51:38
【问题描述】:

我几天前开始学习 Python,在编写代码时遇到了一个程序。

这就是我想使用 C++ 代码做的事情

number = SOME_NUMBER;
while(1) {
    for(int i=number; i<sizeOfArray; i++) {
        // do something
    }
    number = 0;
}

基本上,对于我的 for 循环的第一次迭代,我想从数字开始 i。 然后每隔一次我通过 for 循环,我想从 0 开始。

我现在能想到的一种 hacky 想法是:

number = SOME_NUMBER
for i in range(0, len(array)):
    if i != number:
        continue
    // do something

while True:
    for i in range(0, len(array)):
        // do something

这是最好的方法还是有更好的方法?

【问题讨论】:

  • 这取决于// do something 是什么。
  • 在 Python 中按索引循环遍历列表没有意义,它很慢而且读取效果不好 - 而是循环遍历这些值。
  • 嗯 - 你已经得到了答案 - 但我会在你的 C++ 代码中写 for(;;) 而不是 while(1) - 我相信这是写“永远”的方式......
  • 如果您有解决问题的答案,您可以标记为已接受。

标签: python variables for-loop while-loop initialization


【解决方案1】:

这有什么问题?

starting_num = SOME_NUMBER
while True:
    for i in xrange(starting_num, len(array)):
        # do code
    starting_num = 0

它完全符合您的要求。

但是,我认为有更好的方法来做事,特别是如果解决方案看起来“hacky”。​​

如果你对自己想做的事情有一个想法,也许有更好的方法

【讨论】:

  • 哦,那是真的,我从来没想过把starting_num放在xrange中。
【解决方案2】:

我不明白为什么你不能做和 C 一样的事情:

number = SOME_NUMBER
while True:
    for i in range(number, len(array)):
        # do something
    number = 0

顺便说一句,根据您使用的 Python 版本,xrange 可能比range 更可取。在 Python 2.x 中,range 将生成所有数字的实际列表。 xrange 会产生一个迭代器,并且当范围很大时消耗的内存要少得多。

【讨论】:

  • xrange 和 range 有什么区别?
  • 我更新了我的答案,但xrange 将生成一个迭代器,而range 将生成一个列表。在 Python 3 中,range 生成一个迭代器。
  • 如果范围真的很小,2-4,使用xrange还是更好吗?
【解决方案3】:

在 Python 中,跨过传统意义上的集合并不理想。循环 - 迭代 - 对象的能力由对象控制,因此您无需像在 C++ 中的 for 循环中那样手动单步执行计数器。

据我了解,您在这里尝试做的是对 list 中的每个项目执行相同的代码(Python 中没有 数组),多个次。

这样做:

def whatever_function(foo):
   # some code here that works on each item on the list
   # foo is an item of the list

while True:
   map(whatever_function, some_list)

【讨论】:

  • 嗯,我的程序是一个纸牌游戏,只看每个人的回合。
  • 最初,我有它,所以它是在游戏仍在运行时:对于玩家中的玩家:执行所有这些,但我将其更改为索引,以便我可以跟踪哪个玩家“最后一次玩" 只存储播放器索引。一轮可能会持续几个 for 循环,玩家可以轮到自己通过。如果在 for 循环的一次迭代中,这个人原来已经采取了行动(通过更改 if i == last_played_moved_index)这意味着每个人都轮到他们通过。然后我会重置所有内容,以便开始新一轮
猜你喜欢
  • 2012-09-19
  • 1970-01-01
  • 2020-05-15
  • 2016-06-07
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多