控制语句 - 循环语句 while 与 for
1. for 循环语句
Python 中的 for 语句与其他高级程序语言有很大的不同,其他高级语言 for 语句要用循环控制变量来控制循环。Python 中 for 语句是通过遍历循环某一序列对象(比如列表,元组,字典)来构建循环,循环结束的条件就是对象被遍历完成。
for 语句的形式如下:
for '循环变量' in '遍历对象':
'语句'
示例:
# 打印 1 到 5 的立方
# 创建一个包含 1,2,3,4,5 的列表
list_num = [1, 2, 3, 4, 5]
# 使用 for 循环,依次遍历列表内的所有元素
for num in list_num: # i 是循环变量,每次循环,i会依次获取列表中的元素
print(f'{num}的平方是:{num ** 3}') # 这里用到了之前讲的格式化字符串
2. range() 函数
看到上面的代码,有些同学可能会产生这样的问题,如果我想要计算 1 到 100 的立方,难道我需要把 1~100 输入一遍吗?
当然不需要,这里我们用到了与 for 循环经常搭配使用的 range()
函数。for 语句中的对象集合可以是列表,字典以及元组等,也可以通过 range()
函数产生一个整数列表,以完成计数循环。
range()
函数的原型如下:
range([start,] stop[, step])
其中参数含义如下:
start
:可选参数,起始值,默认为 0stop
:终止值,如果 range 只有一个参数 num,则 range 产生一个从 0 到 num-1的整数列表;step
:可选参数,步长,即每次循环序列增长值。
注意:产生的整数序列的最大值为 stop - 1
。
示例:
# 打印 1 到 100 的立方
# 使用 for 循环与 range() 函数,注意:1~100,应该是range(1, 101)
for num in range(1, 101):
print(f'{num}的平方是:{num ** 3}')
3. while 循环
for 循环语句是以遍历对象的方式构造循环,的确给我们带来的很大的方便,而有时我们需要构建无限循环的程序控制结构或以某种不确定运行次数的循环,就需要用到 while 语句。
while
也是 Python 中构造循环结构程序的主要语句之一,在 Python 中,虽然绝大多数的循环结构都是用 for 语句来完成的,while 语句也可以完成 for 语句的功能,只不过 for 语句来的简单明了,而 while 语句在 Python 中主要用于构建特别的循环。
while 语句的基本形式如下:
while '条件':
'语句'
与 for 循环不同的是,while 语句只有在测试条件为假时,才会停止。在 while 语句的循环体中一定要包含改变测试条件的语句,以保证循环能够结束,避免死循环的出现。
while
循环包含与 if 语句相同的条件语句,如果条件为真,就执行循环体;如果条件为假,则终止循环。
示例如下:
# 用 while 循环打印 1 到 5 的立方
# 创建一个包含 1,2,3,4,5 的列表
list_num = [1, 2, 3, 4, 5]
# 获取该列表的长度
length = len(list_num)
# 初始化循环控制变量
i = 0
# 使用 while 循环,依次遍历列表内的所有元素
while i < length: # i 从 0 至 length - 1
print(f'{list_num[i]}的平方是:{list_num[i] ** 3}')
i = i + 1 # 修改循环控制变量
4. 增量赋值运算符
Python 中提供的增量赋值运算符很多,基本的运算符都有对应的增量赋值运算符:+ - * / // ** %
。
基本写法如下:
x += 1
等同于:
x = x + 1
在 while 循环中,用增量赋值运算符修改循环控制变量的值非常方便。例如将上一段代码中的 while 语句就可以修改为:
# 使用 while 循环,依次遍历列表内的所有元素
while i < length: # i 从 0 至 length - 1
print(f'{list_num[i]}的平方是: {list_num[i] ** 3}')
i += 1 # 使用增量赋值控制变量
之前我们用 for 循环也写过 1~100 的立方,现在我们用 while 写一遍,示例如下:
# 用 while 循环打印 1 到 100 的立方
# 初始化循环控制变量
i = 1
# 使用 while 循环
while i <= 100:
print(f'{i}的平方是: {i ** 3}')
i += 1 # 使用增量赋值控制变量
5. 循环进阶
5.1. break 语句
break
语句作用是中断循环的执行,如果在 for 循环中执行了 break 语句,循环语句的遍历就会立即终止,即使还有未遍历完的数据,还是会立即终止循环。
示例如下:
# 从列表 list_num = [1, 3, 5, 2, 7, 9, 10] 中寻找1个偶数并输出
# 声明一个列表变量
list_num = [1, 3, 5, 2, 7, 9, 10]
# 使用 for 循环
for num in list_num:
# 对 列表内的元素对 2 取余,如果余数为 0 则为偶数,中止循环并打印结果
if num % 2 == 0:
print(num)
break
# 使用 while 循环
# 初始化循环变量
i = 0
# 获取列表长度
length = len(list_num)
while i < length:
if list_num[i] % 2 == 0:
print(list_num[i])
break
i += 1 # 修改步进值
5.2. continue 语句
continue
语句的作用是跳过本轮循环,执行下一轮。在循环中如果执行了 continue
, 则continue
语句后的循环体语句不会被执行,即提前结束了本次循环,然后进入下一个遍历循环。
示例如下:
# 打印 100 以内的所有奇数和
# 使用 for 循环
# 初始化一个变量,用来存储 for 循环的奇数和
sum_for = 0
for i in range(101):
if num % 2 == 0:
continue
sum_for += 1
print(sum_for)
# 使用 while 循环
# 初始化循环变量
num = 0
# 初始化一个变量,用来存储 while 循环的奇数和
sum_while = 0
while num < 100: # 这里为什么是 100?请同学们思考一下
num += 1 # 循环变量为什么放到这里?
# 如果是偶数,则跳过
if num % 2 == 0:
continue
sum_while += num
print(sum_while)
5.3 遍历字典
首先,我们遍历字典中的键, 遍历字典中的键有两种方法
# 创建一个字典
dict_a = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
# 第一种方法遍历字典中的键
for key in dict_a:
print(key)
# 第二种方法就是keys()函数获取字典中的键
print(dict_a.keys())
for key in dict_a.keys():
print(dict_a[key])
接下来就是获取字典中的值
# 首先,你可以通过键获取值
for key in dict_a.keys():
print(dict_a[key])
# 使用values()函数,只获取值,不获取键
for value in dict_a.values():
print(value)
同时获取 key 和 value, 使用 items() 函数
for key, value in dict_a.items():
print(f'key: {key}, value: {value}')
5.4. 嵌套循环
所谓嵌套循环就是一个外循环的主体部分是一个内循环。内循环或外循环可以是任何类型,例如 while 循环或 for 循环。 例如,外部 for 循环可以包含一个 while 循环,反之亦然。外循环可以包含多个内循环。 循环链没有限制。
在嵌套循环中,迭代次数将等于外循环中的迭代次数乘以内循环中的迭代次数。在外循环的每次迭代中,内循环执行其所有迭代。 对于外循环的每次迭代,内循环重新开始并在外循环可以继续下一次迭代之前完成其执行。嵌套循环通常用于处理多维数据结构,例如打印二维数组、迭代包含嵌套列表的列表。嵌套循环是控制流语句的一部分,可帮助您了解 Python 的基础知识。
在此示例中,我们在 for 循环中使用了 for 循环。 在本例中,我们打印 10 次 1-5。
for i in range(10):
for j in range(1, 6):
print(j, end=' ')
print()
外部 for 循环使用 range() 函数迭代前 10 个数字。对于每个外部数字,内部 for 循环将执行 5 次。在内循环的主体中,我们将打印内部数字的值。
接下来我们试着在 Python 中打印99乘法表。
# 外层循环,循环9次
for i in range(1, 10):
# 内部循环 i 次
for j in range(1, i + 1):
print(f'{i} * {j} = {i*j}', end='\t')
print()
5.5. 推导式
推导式是指,在 Python 中,以紧凑的方式对列表,元组,字典等序列或一系列的元素进行处理,处理结果仍然被放到一个列表,字典等序列之中的语法形式。
典型的列表推导基本形式如下:
[ <i 的表达式> for i in iterator]
iterator 是指一个可遍历的对象,比如列表,元组,也可以是 range() 函数。其语义为:用循环变量 i 去遍历 iterator,并将 i 相关表达式的值放入一个列表中。
每当对列表,元组,字典序列中的元素进行处理时,你都可以尝试使用列表推导式来完成,这样非常有助于降低程序的复杂性,缩短了程序的长度。
示例:
# 获取 1~5 的立方
list_cube = [i ** 3 for i in range(1, 6)]
print(list_cube)
字典也可以实现其推导式语法,基本形式如下:
{'key 的表达式':'value 的表达式' for key, value in iterator}
示例:
keys = ['name', 'age', 'weight']
values = ['Mike', '20', '75']
# zip 的作用是将多个可迭代对象按顺序对应打包成一个个元组,然后返回有这些元组组成的元素
info_dict = {key, value for key, value in zip(keys, values)}
print(info_dict)
列表推导式和字典推导式不仅可以对遍历的元素进行全部处理,还可以使用 if 语句实现有选择地处理遍历序列中的元素。其基本形式如下:
[ 'i 相关表达式' for i in iterator if '条件']
['key 相关表达式': 'value 相关表达式' for key, value in iterator if '条件']
示例:
# 使用列表推导式获取 10以内所有偶数的立方
list_cube = [i ** 3 for i in range(11) if i % 2 == 0]
print(list_cube)