【问题标题】:Why we use range(len) in for loop in python?为什么我们在 python 的 for 循环中使用 range(len)?
【发布时间】:2018-11-18 07:27:01
【问题描述】:

我已经开始学习python,现在学习python for loop。我正在使用在线资源来学习python。但我对 for 循环有点困惑。

的输出
list = ["geeks", "for", "geeks"]
for index in range(len(list)):
    print (list[index])

list = ["geeks", "for", "geeks"]
for i in list:
    print(i)

那么为什么要使用 range(len) 方法呢?

提前致谢。

【问题讨论】:

  • @user4815162342 抱歉,我完全忘记选择答案作为最佳答案。谢谢提醒

标签: python python-3.x


【解决方案1】:

对于这种简单的情况,for ind in range(len(sequence)) 通常被认为是一种反模式。但是,在某些情况下,有索引很有用,例如当您需要分配回列表时:

for ind in range(len(lst)):
    elem = lst[ind]
    # ... Do some processing
    lst[ind] = processed_elem

即使在这种情况下,range(len(...)) 最好用enumerate 表达:

for ind, elem in enumerate(lst):
    # ... Do some processing
    lst[ind] = processed_elem

另外,正如 comment 中已经指出的那样,建议避免与内置函数冲突的变量名称,例如 list

【讨论】:

  • 感谢您的帮助。有没有最好的学习for循环的资源?
  • @Alex44 买一本关于 Python 的好书,它肯定会涵盖 for 循环以及您需要的其他内容。
  • 没有内置的index 函数。内置序列类型有一个 index 方法,但没有与之冲突的风险。
  • @user2357112 我没钱买书。这就是我选择在线学习python的原因。
  • @EricDuminil 这会创建一个新列表,这可能是也可能不是您想要的。此外,使用for 循环可能还有其他原因,例如处理不适合单个表达式,或者需要使用控制流语句,例如breakcontinuereturnraise、@ 987654337@ 和循环体内的其他人。
【解决方案2】:

你永远不应该使用第一个,它不是pythonic。使用第二个。如果出于某种原因需要索引,请使用枚举,例如

for index, item in enumerate(some_list):
    print(f'Item with index {index} is {item}')

【讨论】:

    【解决方案3】:

    虽然后者绝对是一种方式,只要它符合您的需求,因为它清晰且符合 Python 风格,但在某些情况下您确实需要元素的索引。

    一个例子是排序算法,比如这里的 BubbleSort (src):

    def bubbleSort(arr):
        n = len(arr)
    
        # Traverse through all array elements
        for i in range(n):
    
            # Last i elements are already in place
            for j in range(0, n-i-1):
    
                # traverse the array from 0 to n-i-1
                # Swap if the element found is greater
                # than the next element
                if arr[j] > arr[j+1] :
                    arr[j], arr[j+1] = arr[j+1], arr[j]
    

    这里的顺序元素的列表索引用于交换它们在列表中的位置,如果它们的排序顺序不正确,而列表中的位置是for elem in arr循环中元素的纯值没有的任何连接到了。因此,在这种情况下,您不会在列表的 len 或类似名称上使用 range,因此这不是非 Python 定义的。

    最后但同样重要的是,如果您需要索引和值,那么一个很好的组合是 Python 的enumerate

    for index, value in enumerate(arr):
         print(index, value)
    

    尽管可以在上面的 BubbleSort 示例中使用它,但您会开始将 value 变量与 arr[index] 表达式混合在一起,这对于代码的可读性来说并不是一个好主意。所以在这里,这也很大程度上取决于使用一个构造或另一个构造是否有意义,没有明确的选择。

    【讨论】:

      【解决方案4】:

      和其他人一样,我想不出for idx in range(len(x)): 的许多用例。唯一真正想到的是,如果您需要在 for 循环的过程中从 x 中删除元素(在这种情况下,如 cmets 中所指出的,您应该倒退),或者您想要执行多个等于len(x) 的循环,由于某种原因未连接到x 上的操作。

      但是是的,如果您在 x 上迭代,通常不要使用 for _ in range(len(x)):

      【讨论】:

      • 但是如果你想删除变量,你应该反过来:range(len(x) -1, -1, -1)
      猜你喜欢
      • 1970-01-01
      • 2021-10-08
      • 2016-01-26
      • 2021-12-05
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多