python 中的 for 循环

282 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情

python 中的 for 循环

到目前为止,我们使用的 while 循环是高度程式化的,通常迭代一个整数序列。蟒蛇提供了一种语言

机制,for 循环,可用于简化包含此类迭代的程序。

for 语句的一般形式是(回想一下,斜体字是对可能出现的内容的描述,而不是实际代码):

image.png

for 后面的变量绑定到序列中的第一个值,并执行代码块。然后为变量分配序列中的第二个值,并再次执行代码块。该过程一直持续到序列用尽或在代码块中执行 break 语句为止。例如,代码

image.png

将打印 91。表达式 (77, 11, 3) 是一个元组。我们将在第 5 节中详细讨论元组。现在,只需将元组视为值序列即可。

绑定到变量的值序列通常使用内置函数范围生成,该函数范围返回一系列整数。范围函数采用三个整数参数:开始、停止和单步。它产生进度开始,开始+步骤,开始+ 2 步骤等。如果 step 为正数,则最后一个元素是最大整数,使得(开始 + istep)严格小于 stop。如果 step 为负数,则最后一个元素是最小整数,使得(开始 + i*步长)大于停止。例如,表达式范围 (5, 40, 10) 生成序列 5, 15, 25, 35,表达式范围 (40, 5, -10) 生成序列 40, 30, 20, 10。如果省略范围的第一个参数,则默认为 o,如果省略最后一个参数(步长),则默认为 1。例如,范围 (0, 3) 和 range(3) 都生成序列 o, 1, 2.级数中的数字是在“根据需要”的基础上生成的,因此即使像范围 (1000000) 这样的表达式也消耗很少的内存。我们将在第 5.2 节中更深入地讨论范围。

考虑代码

image.png

图 2-9 中的代码。重新实现图 2-7 中的算法,以便对整数进行平方(经过更正,使其适用于负数)。请注意,与 while 循环实现不同,迭代次数不受显式测试控制,并且索引变量num_iterations不会显式递增。

image.png

请注意图 2-9 中的代码。不会更改 for 循环主体中num_iterations的值。这是典型的,但不是必需的,这就提出了一个问题,即如果在 for 循环中修改索引变量会发生什么情况。考虑

image.png

你认为它会打印o,o,1,o,然后停止吗?还是你认为它会一遍又一遍地打印o?

答案是 o, o, 1, o。在 for 循环的第一次迭代之前,将计算范围函数,并将其生成的序列中的第一个值分配给索引变量 i。在开始时循环的每次后续迭代,i 都会被分配序列中的下一个值。当序列用尽时,循环终止。上面的 for 循环等效于代码

image.png

请注意,顺便说一句,带有 while 循环的代码比 for 循环要麻烦得多。for 循环是一种方便的语言机制。

现在,你认为x=1是什么?

image.png

只是 o,因为 for 行中 range 函数的参数是在循环的第一次迭代之前计算的,而不是在后续迭代中重新计算的。

现在,让我们看看当我们嵌套循环时,事物的计算频率。考虑

image.png

对于范围中的 j(x): 对于范围中的 i:x=2

两个循环中的每一个执行多少次?我们已经看到,控制外部循环的范围 (x) 在第一次到达时被计算,而不是为每次迭代重新评估,因此外部循环有四次迭代。这意味着内部 for 循环达到四次。第一次到达时,变量 x = 4,因此将有四次迭代。但是,接下来的三次达到,x= 2,因此每次都会有两次迭代。因此,如果您运行

image.png

它打印

image.png

外循环迭代 内循环迭代 内循环迭代 内循环迭代 外循环迭代 内循环迭代 内循环迭代 外循环迭代 内循环迭代 内循环迭代

for 语句可以与 in 运算符结合使用,以方便地循环访问字符串的字符。例如

image.png

对字符串中由文字“12345678”表示的数字求和,并打印总计。

手指练习:编写一个程序,打印大于2和小于1000的素数之和。提示:您可能希望使用 for 循环,该循环是嵌套在 for 循环中的素数测试,可迭代 3 到 999 之间的奇数。