跳转到主要内容
模块 2 · 第 1 课(共 4)课程中的5/36~10 min
模块课程(1/4)

for 循环和范围

Python 中的 for 循环用于迭代项目的序列: 列表、字符串、范围、字典……任何“可迭代”的东西。

Python
parole = ["ciao", "mondo", "!"]
for p in parole:
    print(p)
# ciao
# mondo
# !

模式始终相同:for <variable> in <iterable>: 后跟 将为每个项目执行一次的缩进块。

range(...):生成整数间隔

range 生成一个惰性整数序列。三种形式:

Python
range(5)         # 0, 1, 2, 3, 4
range(2, 6)      # 2, 3, 4, 5
range(0, 10, 2)  # 0, 2, 4, 6, 8     (step)
range(5, 0, -1)  # 5, 4, 3, 2, 1     (negative step)

range 在右端独占,就像 slice 一样。它是一个惰性对象: 它不会为所有数字分配内存,而是一次生成一个数字。

Python
totale = 0
for i in range(1, 11):
    totale = totale + i
totale  # 55  (1+2+...+10)

使用索引迭代:enumerate

当您需要该项目及其索引在一起时,请使用 enumerate:

Python
parole = ["ciao", "mondo", "!"]
for i, p in enumerate(parole):
    print(i, p)
# 0 ciao
# 1 mondo
# 2 !

enumerate 产生 (index, value) 对,我们直接分配给两个 通过元组解包变量(我们将在专用于的模块中看到它) 数据结构)。

并行迭代两个序列:zip

Python
nomi = ["Ada", "Linus", "Grace"]
anni = [36, 54, 79]
for n, a in zip(nomi, anni):
    print(f"{n} ha {a} anni")

zip 在最短的序列处停止。

range() 和 Python 的惰性

在 Python 中, range() 函数不会在内存中分配实际列表:它返回一个惰性生成器,根据请求一次生成一个数字(例如,在 for 循环中)。这允许迭代数百万个整数,而不会导致 RAM 膨胀。要将范围值检查为列表,您可以使用 list(range(5)) 显式转换它。

自己尝试一下

锻炼#python.m2.l1.e1
尝试:0加载中...

使用 for 循环覆盖 range(...) 计算从 1 到 100(含)的数字总和,将其分配给“total”并对其求值。

正在加载编辑器...
显示提示

range(1, 101) 生成 1, 2, ..., 100(不包括右侧)。

3 次尝试后可用的解决方案

复习练习

锻炼#python.m2.l1.e2
尝试:0加载中...

给定列表 `words = ['uno', 'due', 'tre']`,使用枚举构建一个字符串列表 `pairs`,如 '0:uno', '1:due', '2:tre'。评估“对”。

正在加载编辑器...
显示提示

enumerate(words) 在每次迭代时返回 (index, value)。

3 次尝试后可用的解决方案

额外的挑战

锻炼#python.m2.l1.e3
尝试:0加载中...

Calculate the sum of all even numbers from 2 to 20 inclusive using a `for` loop over a `range`. Store the final sum in `even_sum` and evaluate it.

正在加载编辑器...
显示提示

使用 range(2, 21, 2) 仅迭代 2 到 20 之间的偶数。

3 次尝试后可用的解决方案