Python从菜鸟到高手(10):循环

  我们现在已经知道了如何使用if语句让程序沿着不同的路径执行,不过程序最大的用处就是利用CPU和GPU强大的执行能力不断重复执行某段代码,想想Google的AlphaGo与柯洁的那场人机大战,尽管表面上是人工智能的胜利,其实人工智能只是算法,人工只能算法之所以会快速完成海量的数据分享,循环在其中的作用功不可没。

  对于初次接触程序设计的读者,可能还不太理解循环到底什么东西。下面先看一下循环的伪代码。

  1. 查看银行卡余额
  2. 没有发工资,等待1分钟,继续执行1
  3. Oh,yeah,已经发工资了,继续执行4.
  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= " ")

程序运行结果如下图所示。

Python从菜鸟到高手(10):循环_第1张图片

《Python从菜鸟到高手》开始转载了,敬请关注

image.png

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从菜鸟到高手(10):循环_第2张图片

《Python从菜鸟到高手》已经出版,开始连载了,购买送视频课程

你可能感兴趣的:(python,人工智能)