为什么我们在Python的for循环中使用range(len)?

时间:2018-11-18 07:27:02

标签: python python-3.x

我已经开始学习python,现在学习python for loop。我正在使用在线资源来学习python。但是我很少,但是对于循环感到困惑。

的输出
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)方法呢?

谢谢。

4 个答案:

答案 0 :(得分:4)

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

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

即使在这种情况下,最好避免使用enumeraterange(len(...))

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

另外,如comment中已指出的,避免使用与内置变量冲突的变量名,例如list

答案 1 :(得分:1)

尽管后者显然是适合您的需求的方式,因为它清晰明了且具有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循环中元素的纯值,不再有任何联系。因此,在这种情况下,您将无法在列表的range上使用len或类似名称,所以从定义上讲,这并非非Python的。

最后但并非最不重要的一个好组合,如果您同时需要索引和值,则为Python的enumerate

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

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

答案 2 :(得分:0)

您永远不要使用第一个,因为它不是Python语言。使用第二个。如果出于任何原因需要索引,请使用枚举,例如

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

答案 3 :(得分:0)

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

但是,是的,如果要遍历x,通常不要使用for _ in range(len(x)):