005、 函数enumerate() 和 range(len())的应用场景和差异

理论概述

enumerate()
  • 功能enumerate() 是一个内置函数,用于将一个可迭代对象(如列表、元组或字符串)组合为一个索引序列,返回一个 enumerate 对象。这个对象包含了迭代对象中的每个元素及其对应的索引。
  • 语法enumerate(iterable, start=0)
    • iterable:一个可迭代对象。
    • start:可选参数,指定索引的起始值,默认为0。
range(len())
  • 功能range(len()) 是通过 range() 函数和 len() 函数结合使用,生成一个从0到 len(iterable)-1 的索引序列,常用于遍历列表的索引。
  • 语法range(stop)range(start, stop[, step])
    • start:起始值,默认是0。
    • stop:结束值(不包含在结果中)。
    • step:步长,默认为1。

实例讲解

基本用法示例

示例1:遍历列表并输出索引和元素值

使用 enumerate()

fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
    print(f'Index: {index}, Fruit: {fruit}')

使用 range(len())

fruits = ['apple', 'banana', 'cherry']
for i in range(len(fruits)):
    print(f'Index: {i}, Fruit: {fruits[i]}')
处理多个列表

示例2:同时遍历两个列表并输出索引和元素值

使用 enumerate()

fruits = ['apple', 'banana', 'cherry']
colors = ['red', 'yellow', 'red']
for index, (fruit, color) in enumerate(zip(fruits, colors)):
    print(f'Index: {index}, Fruit: {fruit}, Color: {color}')

使用 range(len())

fruits = ['apple', 'banana', 'cherry']
colors = ['red', 'yellow', 'red']
for i in range(len(fruits)):
    print(f'Index: {i}, Fruit: {fruits[i]}, Color: {colors[i]}')
修改列表中的元素

示例3:将列表中的每个元素平方

使用 enumerate()

numbers = [1, 2, 3, 4]
for index, value in enumerate(numbers):
    numbers[index] = value ** 2
print(numbers)

使用 range(len())

numbers = [1, 2, 3, 4]
for i in range(len(numbers)):
    numbers[i] = numbers[i] ** 2
print(numbers)
读取文件内容并输出行号和内容

示例4:读取文件并输出每行的行号和内容

使用 enumerate()

with open('example.txt') as file:
    for line_number, line in enumerate(file, start=1):
        print(f'Line {line_number}: {line.strip()}')

使用 range(len())

with open('example.txt') as file:
    lines = file.readlines()
    for i in range(len(lines)):
        print(f'Line {i + 1}: {lines[i].strip()}')
处理不同长度的列表

示例5:比较两个列表对应位置的元素是否相等

使用 enumerate()

list1 = [1, 2, 3]
list2 = [1, 2, 4, 5]
for index, value in enumerate(list1):
    if index < len(list2):
        print(f'Index: {index}, List1: {value}, List2: {list2[index]}, Equal: {value == list2[index]}')
    else:
        print(f'Index: {index}, List1: {value}, List2: None, Equal: N/A')

使用 range(len())

list1 = [1, 2, 3]
list2 = [1, 2, 4, 5]
for i in range(len(list1)):
    if i < len(list2):
        print(f'Index: {i}, List1: {list1[i]}, List2: {list2[i]}, Equal: {list1[i] == list2[i]}')
    else:
        print(f'Index: {i}, List1: {list1[i]}, List2: None, Equal: N/A')
处理嵌套列表

示例6:输出嵌套列表(矩阵)中的每个元素及其位置

使用 enumerate()

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for row_index, row in enumerate(matrix):
    for col_index, value in enumerate(row):
        print(f'Value at ({row_index}, {col_index}): {value}')

使用 range(len())

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        print(f'Value at ({i}, {j}): {matrix[i][j]}')

深入理解

优点
  • enumerate()

    • 简洁性和可读性:代码更简洁,易读,尤其在需要同时获取索引和值的情况下。
    • 减少错误:避免手动索引可能带来的错误,如越界错误。
    • 灵活性:可以设置起始索引,使代码更灵活。
  • range(len())

    • 灵活性高:适用于需要索引访问多个列表或更复杂的索引操作。
    • 明确索引:明确指出使用索引,可以方便进行索引操作。
缺点
  • enumerate()

    • 结合其他方法:在遍历多个列表时,需要结合其他方法(如 zip())。
    • 不如 range(len()) 灵活:对于一些复杂索引操作,enumerate() 不如 range(len()) 灵活。
  • range(len())

    • 代码冗长:代码较为冗长,不易读。
    • 容易出错:手动索引容易出现索引越界错误。
    • 嵌套结构复杂:在嵌套结构中使用较为复杂。

结论

在大多数情况下,enumerate() 更简洁和易读,减少了潜在的错误,特别是在需要同时获取索引和值的情况下。因此,建议在实际编程中优先使用 enumerate()。但是在需要复杂索引操作时,range(len()) 也有其用武之地,尤其是需要明确索引或遍历多个列表时。通过丰富的实例和详细的解释,我们希望能更好地理解和选择适合的工具来实现高效的编程。

相关推荐

  1. MySQL几种引擎差别应用场景汇总

    2024-06-17 12:14:02       29 阅读
  2. PyTorch中 Dataset、DataLoader enumerate()

    2024-06-17 12:14:02       56 阅读
  3. SIFTSURF差异已经使用场景分析

    2024-06-17 12:14:02       34 阅读
  4. armx86差别应用场景学习笔记

    2024-06-17 12:14:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 12:14:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 12:14:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 12:14:02       82 阅读
  4. Python语言-面向对象

    2024-06-17 12:14:02       91 阅读

热门阅读

  1. SVG in VSCode: A Comprehensive Guide

    2024-06-17 12:14:02       32 阅读
  2. vscode 创建一个测试单个js文件的项目

    2024-06-17 12:14:02       33 阅读
  3. 网络命令大全windows linux

    2024-06-17 12:14:02       29 阅读
  4. vue前端-静态资源下载小坑记录

    2024-06-17 12:14:02       35 阅读
  5. QComboBox使用详解(Qt)

    2024-06-17 12:14:02       31 阅读
  6. 小程序wx:if 和hidden的区别?

    2024-06-17 12:14:02       31 阅读
  7. R语言自定义vlookup函数

    2024-06-17 12:14:02       28 阅读
  8. Spark 面试题(六)

    2024-06-17 12:14:02       29 阅读
  9. Android 自定义SeekBar显示进度百分比

    2024-06-17 12:14:02       28 阅读