我们现在已经知道了如何使用if语句让程序沿着不同的路径执行,不过程序最大的用处就是利用CPU和GPU强大的执行能力不断重复执行某段代码,想想Google的AlphaGo与柯洁的那场人机大战,尽管表面上是人工智能的胜利,其实人工智能只是算法,人工只能算法之所以会快速完成海量的数据分享,循环在其中的作用功不可没。
对于初次接触程序设计的读者,可能还不太理解循环到底什么东西。下面先看一下循环的伪代码。
- 查看银行卡余额
- 没有发工资,等待1分钟,继续执行1
- Oh,yeah,已经发工资了,继续执行4.
- 去消费
我们可以看到,这段伪代码重复展示了一个循环到底是怎样的。对于一个循环来说,首先要有一个循环条件。如果条件为True,继续执行循环,如果条件为False,则退出循环,继续执行循环后面的语句。对于这段伪代码来说,循环条件就是“是否已经将工资打到银行卡中”,如果银行卡中没有工资,那么循环条件为True,继续执行第1步(继续查看银行卡余额),期间会要求等待1分钟,其实这个过程可以理解为循环要执行的时间。如果发现工资已经打到银行卡上了,那么循环条件就为False,这时就退出循环,去消费。
在Python语言中,有两类语句可以实现这个循环操作,这就是while循环和for循环,本文将详细讲解这两类循环的使用方法。
1. while循环
为了更方便理解while循环,下面先用“笨”方法实现在Python控制台输出1到10共10个数字。
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
print(10)
我们可以看到,在上面这段代码中,调用了10次print函数输出了1到10共10个数字,不过这只是输出了10个数字,如果要输出10000个或更多数字呢?显然用这种一行一行写代码的方式实现显得相当笨重,下面就该我们的主角while循环出场了。
现在就直接用Python代码解释一下while循环的用法。
x = 1
while x <= 10:
print(x)
x += 1
我们可以看到,while关键字的后面是条件表达式,最后用冒号(:)结尾,这说明while循环也是一个代码块,因此,在while循环内部的语句需要用缩进的写法。
在上面的代码中,首先在while循环的前面定义一个x变量,初始值为1。然后开始进入while循环。在第1次执行while循环中的语句时,会用print函数输出x变量的值,然后x变量的值加1,最后while循环中的语句第1次执行完毕,然后会重新判断while后面的条件,这时x变量的值是2,x <= 10的条件仍然满足,所以while循环将继续执行(第2次执行),直到while循环执行了10次,这时x变量的值是11,x <= 10不再满足,所以while循环结束,继续执行while后面的语句。
while循环是不是很简单呢?其实下一节要介绍的for循环也并不复杂,只是用法与while循环有一些差异。
2. for循环
while循环的功能非常强大,它可以完成任何形式的循环,从技术上说,有while循环就足够了,那么为什么还要加一个for循环呢?其实对于某些循环,while仍然需要多写一些代码,为了更进一步简化循环的代码,Python语句推出了for循环。
for循环主要用于对一个集合进行循环(序列和其他可迭代的对象),每次循环,会从集合中取得一个元素,并执行一次代码块。直到集合中所有的元素都被枚举(获得集合中的每一个元素的过程称为枚举)了,for循环才结束(退出循环)。
在使用for循环时需要使用到集合的概念,由于现在还没有讲到集合,所以本节会给出最简单的集合(列表)作为例子,在后面的章节中,会详细介绍集合与for循环的使用方法。
在使用for循环之前,先定义一个keywords列表,该列表的元素是字符串。然后使用for循环输出keywords列表中的所有元素值。
>>> keywords = [‘this‘, ‘is‘, ‘while‘, ‘for‘,‘if‘] # 定义一个字符串列表
>>> for keyword in keywords: # 用for循环输出列表中的元素
... print(keyword)
...
this
is
while
for
if
上面这段for循环的代码非常号理解,for语句中将保存集合元素的变量和集合变量用in关键字分隔。在本例中,keywords是集合,当for循环执行时,没执行一次循环,就会依次从keywords列表中获取一个元素值,直到迭代(循环的另一种说法)到列表中的最后一个元素“if”为止。
可能有的读者会发现,for循环尽管迭代集合很方便,但可以实现while循环对一个变量进行循环吗?也就是说,变量在循环外部设置一个初始值,在循环内部,通过对变量的值不断改变来控制循环的执行。其实for循环可以用变通的方式来实现这个功能,我们可以想象,如果定义一个数值类型的列表,列表的元素值就是1到10,那么不就相当于变量x从1变到10了吗!
>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> for number in numbers:
... print(number, end=" ") # 输出1到10共10个数字
...
1 2 3 4 5 6 7 8 9 10 >>>
如果使用这种方式,从技术上说是可以实现这个功能的,不过需要手工填写所有的数字太麻烦了,因此,我们可以使用一个range函数来完成这个工作。range函数有两个参数,分别是数值范围的最小值和最大值加1,要注意,range函数会返回一个半开半闭区间的列表,如果要生成1到10的列表,应该使用range(1, 11)。
>>> for num in range(1,11): # 用range函数生成元素值为1到10的列表,并对这个列表进行迭代
... print(num, end=" ")
...
1 2 3 4 5 6 7 8 9 10 >>>
本例演示了使用顺序结构,while循环和for循环输出相邻数字的方法,其中for循环使用了range函数快速生成一个包含大量相邻数字的列表,并对这些列表进行迭代。
print(1,end=" ")
print(2,end=" ")
print(3,end=" ")
print(4,end=" ")
print(5,end=" ")
print(6,end=" ")
print(7,end=" ")
print(8,end=" ")
print(9,end=" ")
print(10)
# 用while循环输出1到10
print("用while循环输出1到10")
x = 1
while x <= 10:
print(x,end=" ")
x += 1
# 定义一个列表
numbers = [1,2,3,4,5,6,7,8,9,10]
print("\n用for循环输出列表中的值(1到10)")
for num in numbers:
print(num, end= " ")
# 用range函数生成一个元素值从1到9999的列表
numbers = range(1,10000)
print("\n用for循环输出列表中的值(1到9999)")
for num in numbers:
print(num, end= " ")
print("\n用for循环输出列表中的值的乘积(1到99)")
# 用range函数生成一个元素值为0到99的的列表,并对该列表进行迭代
for num in range(100): # range函数如果只指定一个参数,产生的列表元素值从0开始
print(num * num, end= " ")
程序运行结果如下图所示。
3. 跳出循环
在前面介绍的while循环中,是通过while后面的条件表达式的值确定是否结束循环的,不过在很多时候,需要在循环体内部之间跳出循环,这就要使用到break语句。
>>> x = 0
>>> while x < 100:
... if x == 5:
... break;
... print(x)
... x += 1
...
0
1
2
3
4
在上面的代码中,while循环的条件语句是x < 100,而x变量的初始值是0,因此,如果在while循环中,每次循环都对x变量值加1,那么while循环会循环100次。不过在while循环中通过if语句进行了判断,当x的值是5时,执行break语句退出循环。所以这个while循环只会执行6次(x从0到5),当执行到最后一次时,执行了break语句推出while循环,而后面的语句都不会调用,所以这段程序只会输出0到4共5个数字。
与break语句对应的还有另外一个continue语句,与break语句不同的是,continue语句用来终止本次循环,而break语句用来彻底退出循环。continue语句终止本次循环后,会立刻开始执行下一次循环。
>>> x = 0
>>> while x < 3:
... if x == 1:
... continue;
... print(x)
... x += 1
...
0
在上面的代码中,当x等于1时执行了continue语句,因此,if条件语句后面的所有语句都不会执行,while循环会继续执行下一次循环。不过这里有个问题,当我们执行这段代码时,会发现进入死循环了。所谓死循环,是指while循环的条件表达式的值永远为True,也就是循环永远不会结束。死循环是在使用循环时经常容易犯的一个错误。
现在让我们来分析一下这段代码。如果要让while循环正常结束的话,x必须大于等于3,但当x等于1时执行了continue语句,所以if语句后面的所有语句在本次循环中都不会被执行了,但while循环最后一条语句是x += 1,这条语句用于在每次循环中将x变量的值加1。但这次没有加1,所以下一次循环,x变量的值仍然是1,也就是说,if语句的条件永远满足,因此,continue语句将永远执行下去,所以x变量的值永远不可能大于等于3了。最终导致的后果是while循环中的语句会永远执行下去,也就是前面提到的死循环。
解决的方法也很简单,只要保证执行continue语句之前让变量x加1即可。或者将x += 1放到if语句的前面,或放到if语句中。
>>> x = 0
>>> while x < 3:
... if x == 1:
... x += 1 # 需要在此处为x加1,否则将进入死循环
... continue
... print(x)
... x += 1
...
0
2
break和continue语句同样支持for循环,而且支持嵌套循环。不过要注意,如果在嵌套循环中使用break语句,那么只能退出当前层的循环,不能退出最外层的循环。在实例3.8中会为读者演示循环更复杂的使用方法。
本例除了演示while和for循环的基本用法以外,还在满足一定条件的前提下,通过break语句终止了整个while和for循环,以及使用continue语句终止了while和for语句的本次循环,最后在while循环中嵌套了一个for循环,从而形成一个嵌套循环,在这个嵌套循环中,输出了二维列表 中的所有元素值。在Python语句中,嵌套循环可以嵌套任意多成的循环。
x = 0
while x < 100: # 开始while循环
if x == 5: # 当x == 5时终止循环
break;
print(x, end=" ")
x += 1
names = ["Bill", "Mike", "Mary"] # 定义一个列表变量
print("\nbreak语句在for循环中的应用")
for name in names: # 对names列表进行迭代
if not name.startswith("B"): # 遇到列表元素值不是以B开头的,就终止for循环
break;
print(name)
print("break语句在for循环中的应用")
for name in names: # 对names列表进行迭代
# 遇到列表元素值以B开头的,会跳过本次循环,继续执行下一次循环
if name.startswith("B"):
continue;
print(name, end=" ")
print("\n嵌套循环")
arr1 = [1,2,3,4,5]
arr2 = ["Bill", "Mary", "John"]
arr = [arr1, arr2] # 定义一个二维列表变量
i = 0;
while i < len(arr): # 使用嵌套循环枚举二维列表中的每一个元素值
for value in arr[i]:
print(value, end = " ") # 输出二维列表中的元素值
i += 1
print()
程序运行结果如下图所示。
《Python从菜鸟到高手》已经出版,开始连载了,购买送视频课程
原文地址:http://blog.51cto.com/androidguy/2171898