[Python] 入门(6):Python 基础 -- 循环,条件和迭代器

Python 入门系列:

  • [Python] 入门(1):安装 Python 及必要组件
  • [Python] 入门(2):Python 基础 – 变量
  • [Python] 入门(3):Python 基础 – 内建函数
  • [Python] 入门(4):Python 基础 – 列表和词典的方法
  • [Python] 入门(5):Python 基础 – 字符串的方法
  • [Python] 入门(6):Python 基础 – Python 基础 – 循环,条件和迭代器(本文)
  • [Python] 入门(7):Python 基础 – 自定义函数
  • [Python] 入门(8):Python 基础 – 解析式,生成器和程序错误
  • [Python] 入门(9):Python 基础 – 字符串格式化
  • [Python] 入门(10):Python 基础 – 面向对象编程

文章目录

  • for 循环 * while 循环 * if 条件 * 迭代器 * 嵌套 * break 声明 * continue 声明

for 循环

假如你有一个列表 lst = [“apple”, “pear”, “banana”, “orange”],想把每个水果名字都打印一遍,你会怎么做?你当然可以用 print(lst) 来做到,但是假如你想在每个水果前加一个序号呢?这就用到了 for 循环。

for 循环的基本语法是:

1for 元素 in 可遍历对象/迭代器: 2 元素的动作 3 4

for 循环的运行原理是:从对象里的第一个元素开始执行一个动作,然后是第二个元素执行相同的动作,…直到所有元素都执行了相同的动作,循环结束。**循环的主体(也就是第二行开始)需要缩进*,通常是四个空格(_ _ _ _)。**用一张图来表示:
现在我们来看一下如何把水果名字依次打印:

1>>> for fruit in lst: 2... print(fruit) 3apple 4pear 5banana 6orange 7 8

*注:所有循环、条件和自定义函数的主体都需要缩进,缩进要么是四个连续的空格要么是一个 tab,但同一个主体里不能既有空格又有 tab,否则会报错。

现在来看稍微复杂一点的循环:在水果前加序号。还记得第三篇里提到的 enumerate 函数吗:

1>>> for i, fruit in enumerate(lst, 1): 2... print(i, ": ", fruit, sep = "") 31: apple 42: pear 53: banana 64: orange 7 8

这里有几个小知识点:

  • enumerate函数默认从 0 开始,我们强制它从 1 开始;
  • print 函数默认可以同时打印多个变量,用 , 隔开即可;在变量之间默认有空格,我们设置 sep = "" 取消空格(否则打印出来:1_:__apple)

while 循环

for 循环是有限循环,迭代完了可迭代对象,for 循环就停止了。while 循环不一样,它的运行原理是:运行前先判断该元素在一定条件下是否为真,如果为真,执行一个动作;判断下一个元素在同样条件下是否为真,如果为真,继续执行;…直到某元素在条件下为假,循环停止。用一张图来表示:
while 循环的语法是:

1while 判断条件: 2 动作 3 4

下面来举一个例子:用 while 循环打印所有小于 5 的正数。

1>>> i = 1 2>>> while i < 5: 3... print(i) 4... i += 1 51 62 73 84 9 10

首先我们先给了一个初始值 i = 1。然后代入 while 判断,1 < 5,条件成立,执行循环语句 打印 i。后面的 i += 1 把 i 加 1 变成 2(现在 i 是 2 了),返回循环的开始重新判断条件是否满足:2 < 5,满足,继续执行动作。直到 i 变成了 5,5 不小于 5,条件不满足了,循环停止。

while 循环有个隐患,那就是如果条件设置有问题,一直为真,这个 while 循环就会一直运行下去,直到内存耗尽,或者天荒地老…这种循环叫“无限循环”。下面的 while 循环就是一个例子:

1>>> i = 1 2>>> while True: 3... print(i) 4... i += 1 5 6

有人有胆运行一下吗?老宅是不敢,害怕电脑罢工,辛辛苦苦写的文档灰飞烟灭…

if 条件

假如你想出去旅游,但是下雨的话就不出去了。这可以用 if 条件来实现:

1if 不下雨: 2 旅游 3else: 4 待在家 5 6

if 条件的语法正是如此:

1if 为真: 2 执行一个动作 3else: 4 执行另一个动作 5 6

可是很多时候,条件不是非黑即白,可能是三选一,上面的 if 条件加一个 elif 即可:

1if 为真: 2 执行一个动作 3elif 为真: 4 执行另一个动作 5else: 6 执行另一个动作 7 8

如果是四选一,五选一…只要用足够的 elif 就可以了。来看一个示例:

1>>> age = 20 2>>> if age < 15: 3... print("小家碧玉") 4... elif age < 30 and age >= 15: 5... print("大家闺秀") 6... elfi age < 50 and age >= 30: 7... print("风韵犹存") 8... else: 9... print("半老徐娘") 10大家闺秀 11 12

如果一个变量同时满足 if 条件里的好几个条件,这个变量看谁?我们来试一试:

1>>> a = 10 2>>> if a < 15: 3... print("a < 15") 4... elif a < 20: 5... print("a < 20") 6... elif a < 25: 7... print("a < 25") 8... else: 9... print("") 10a < 15 11 12

看到了吧,如果变量到每一个条件满足了,它就忽略后面的条件了。所以 if 条件的工作流程是:
关于“if 条件”还有一个梗:

1老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”当晚,程序员老公手捧一个包子进了家门……老婆怒道:“你怎么就买了一个包子?”老公答曰:“因为看到了卖西瓜的。” 2 3

迭代器

老宅在前文中曾经比喻迭代器是“生产汤圆的机器”。迭代器一般可以由 iter 生成。有一个特殊的函数 next(),调用以后会返回下一个元素;如果所有元素已经返回,则返回 StopIteration 异常(异常在第八篇里会提到)。

1>>> rng = iter(range(1)) 2>>> next(rng) 30 4>>> next(rng) 5--------------------------------------------------------------------------- 6StopIteration Traceback (most recent call last) 7<ipython-input-23-dd7cab303dc2> in <module> 8 1 rng = iter(range(1)) 9 2 next(rng) 10----> 3 next(rng) 11 12StopIteration: 13 14

嵌套

循环里套循环、条件里套条件、循环里套条件、条件里套循环都是可以的。

break 声明

有时候我们希望循环或条件提前结束,这时候就要用到 break 声明。举一个例子:依次打印 1-10,但在 5 停止(你有病啊!直接打印 1-5 不就好了!)。

1>>> for i in range(1, 11): 2... if i < 6: # 循环里套条件 3... print(i) 4... else: 5... break 61 72 83 94 105 11 12

continue 声明

假如我们想在每个节点跳过执行,可以用 continue 声明。举一个例子:打印 1-5 以内的奇数。

1>>> for i in range(1, 6): 2... if i % 2 == 1: 3... print(i) 4... else: 5... continue 61 73 85 9 10

练习(写出生成如下变量的代码或结果):

给定 1-10,假如可以被 2 整除,打印 foo;假如可以被 3 整除,打印 bar;如果可以被 6 整除,打印 foobar;其它数打印自己。

答案下篇文章公布。欢迎把答案留言与老宅交流、互动!


上一篇练习的答案:

1# 给定一个字符串 str = "apple pear orange banana grape"(`\t` 代表缩进): 2# 1. 在字母之间加 "-"; 3>>> str = " apple pear orange banana grape\t" 4>>> str2 = "-" 5>>> str3 = str.split() # 先分离 6>>> str4 = str2.join(str3) 7>>> str4 8'apple-pear-orange-banana-grape' 9# 2. 以 "strewbarry" 代替 "pear"。 10>>> str.replace("pear", "strewbarry") 11'apple strewbarry orange banana grape' 12 13

代码交流 2021