上一章节,我们介绍了遍历循环,或说for循环,在这一章节我们将介绍Python常用的另一种循环方式——条件循环或while循环。同时,我们还将进一步讲解循环的深入使用方法。
一、条件循环或while循环
不同于for循环对给定的数据序列进行遍历,while循环是在某个给定的条件下进行循环。其实,从单词的含义就能看出端倪,for表示“关于、对于”,而while则是“当……时”。因此,while循环的结构通常是:
while condition is True:do_something()
按照上面的结构逻辑,对于求阶乘的例子,我们就可以表达为:
n = int(input(" >>> "))factorial, i = 1, 1while i <= n:factorial *= ii += 1print(factorial)
或者:
n = int(input(" >>> "))factorial, i = 1, 0while i < n:i += 1factorial *= iprint(factorial)
两端代码的不同就是循环成立条件的区别带来对i递增时先后顺序的不同。
while循环和for循环是一种先判断后执行的循环,每一次迭代都是先判断控制条件是否成立(或遍历是否已经到结尾),然后再执行循环中的代码。在其他高级语言如C/C++中,还提供了“do…while”循环,即先执行后判断,以应对一些特殊的工作需求。然而只要是循环,无论先判断后执行还是先执行后判断,都是通过一些控制条件实现相互转换的。
while循环的其他一些使用示例:
vegitables = ["potato", "tomato", "cucumber"]i = 0while i < len(vegitables):print(vegitables[i], end=" ")i += 1# Output: potato tomato cucumber
二、代码结构的嵌套
(1)多重循环嵌套
类似于“if-else”的嵌套,循环也可以使用多重嵌套,且for循环和while循环可以混合嵌套,其结构大致为:
# for 循环嵌套for val_1 in sequence_1:do_something()for val_2 in sequence_2:do_something_else()# while 循环嵌套while condition_1 is True:do_something()while condition_2 is True:do_something_else()# for-while 混合嵌套while condition is True:do_something()for val in sequence:do_something_else()for val in sequence:do_something()while condition is True:do_something_else()
同样的,Python是缩进敏感的,因此我们必须确保在同一层级执行的代码指令有相同的缩进单位。
(2)循环中的条件判断
很好理解,例如食物分类,这是一个循环,过程中我们可能只需要将蔬菜留下,这需要做一次判断。因此,在循环中,我们可以将if判断使用进去:
foods = {"apple": "fruit","carrot": "vegetable","peach": "fruit","pumpkin": "vegetable"}for key, val in foods.items():if val == "vegetable":print(key, end=" ")# Output: carrot pumpkin
同样的,我们需要留意代码的缩进,避免if中的代码因缩进问题导致错误。
这里我们使用了items函数,它可以将字典变量中的键值对以元组序列的形式返回,即for循环的每次遍历都是访问了一个元组键值对:
foods = {"apple": "fruit","carrot": "vegetable",}for item in foods.items():print(item, end=" ")# Output: ('apple', 'fruit') ('carrot', 'vegetable')
因此我们可以使用“key, val”的多变量承接形式来去提取元组中的内容,这种表达类似于:
key_val_tuple = ("key", "val")key, val = key_val_tuple
key_val_tuple就是items返回给for循环每一次遍历时使用的键值对。
有了循环中使用判断,我们也可以有判断中使用循环,其具体示例这里就不多分析了,和上面的过程差不多:
foods = {"fruits": ["apple", "banana"],"vegetables": ["carrot", "spinach"],}for key, value in foods.items():if key == "fruits":for val in value:print(val + "(f)", end=" ")else:for val in value:print(val + "(v)", end=" ")# Output: apple(f) banana(f) carrot(v) spinach(v)
(3)简易循环
循环的作用不止于以多行代码的形式书写,有些时候你可能会想循环生成一个列表或字典等等,例如生成一个都是平方数的列表或者数字及其对应平方数的字典:
array = list()square = dict()for i in range(10):array.append(i ** 2)square[i] = i ** 2
如果以多行代码的形式来写,有些不太elegant,这时可以用简易循环表达,以一行代码来完成这个工作:
array = list(i ** 2 for i in range(10))square = dict((i, i ** 2) for i in range(10))
简易循环中,for后面的变量是参与循环的变量,通常作用于for前的表达式。注意上面代码中的一点,字典的循环生成是通过一系列的二元元组来生成,而非通过键值的方式来实现。这种简易循环也可以写成嵌套循环的形式,但更多情况下,一层循环会更加容易理解代码功能。
往期回顾:
Python中文分词神器jieba|精准拆分文本,数据分析必备!