循环语句用来重复执行一些代码块,通常用来遍历序列、字符串、字典、迭代器等,然后对其中的每个元素做相同或类似处理,字典、迭代器后续将介绍。Python有两种循环,即for循环和while循环。for循环通常用于已知对象;while循环基于某个条件,满足这个条件则执行循环,否则结束循环。
先看for循环的一个简单实例,从range(10)中每次读取一个数,然后打印这个数,代码如下。
for循环的关键字为for,接下来是循环变量(这里为i,当然也可以是其他变量),然后是关键字in,关键字in后是序列、字符串、字典等可迭代对象,最后以冒号结束。每次循环结束时,循环变量就被设置成下一个值,直到获取最后一个值为止。
for循环与if语句一起使用,可以生成各种各样的数据。比如,利用for循环及if语句可以统计列表lst41=["a","b","a","a","b"]中的a和b各出现了多少次。
列表lst41的分类统计,用代码实现如下。
while循环的执行过程:先检查循环条件为True或False,如果为True,就执行循环;如果为False,就跳出循环,执行后面的语句。下面用while循环实现上一小节for循环的内容。
使用while循环时,要避免出现死循环的问题。如果这个while循环少了i=i+1这个条件,那么这个循环将一直执行下去,除非强制结束循环或按Ctrl+C组合键停止执行当前任务。
Python中的for循环和while循环都可以进行循环嵌套,即for循环中又有for循环或while循环;while循环中又有while循环或for循环。
下面看一个for循环中又有for循环的情况。比如要累加列表lst42=[[1,2,3],[4,5,6],[7,8,9]]中的9个数据,可以先用一个for循环读取里面的每个列表的元素,然后再用一个for循环累加读取出的每个列表的元素,具体实现如下。
循环是很耗资源的,编程时要尽量避免使用循环,尤其是循环嵌套,因为循环嵌套可读性较差,而且耗资源,运行又慢。后续章节将介绍不使用循环,直接利用矩阵进行计算的方法,其性能是使用循环的几倍甚至几十倍、几百倍。
在for循环、while循环中,都可以使用break跳出整个循环,不再执行剩下的循环语句。如果break在循环嵌套里,那么它将跳出所在的或当前的循环。
比如,在一个列表中查找一个单词,如果没有找到则继续查询,一旦找到,就停止查找,退出循环。
结果如下。
从总的查询次数是3次可以看出,一旦找到就停止循环,不再查找了。
与break跳出循环不同,continue不是立即跳出整个循环,而是立即返回循环开头,继续循环,直到循环结束。
上一节的查找例子,如果把break换成continue,会是什么情况呢?
结果如下。
说明找到白骨精后,循环还在继续,直到找遍列表中的所有元素为止。找到目标后,break结束循环,continue继续循环,这就是两者最大的区别。
4.1节介绍了Python控制语句的一大特点,就是能把if语句与循环语句有机地结合在一起,这个特点打开了一扇“方便高效”之门。把此功能在列表中使用,可得列表推导式;在字典中使用,可得字典推导式。除了推导式还有生成器等概念,这些都是Python非常有特色,也是人们非常喜爱的新特点,这些内容后续将陆续介绍。
本小节主要介绍列表推导式,列表推导式提供了一种简单明了的方法来创建列表。它的结构是在一个中括号里包含一个表达式,然后是一个for语句,后面再接0个或多个for语句或者if语句。这个表达式可以是任意的,意味着可以在列表中放入任意类型的对象,返回结果将是一个新的列表,以下通过实例来说明。
假设要把从1到100这100个自然数中的偶数取出来,为实现这个需求,我们采用两种方法,一种是普通方法,另一种是列表推导式,然后比较这两种方法。
1.使用普通方法
使用普通方法就是先创建一个空列表,执行一个循环语句,在循环语句里加上if语句,判断数字是否为偶数,如果是偶数,则追加到这个列表中。
2.使用列表推导式
使用列表推导式,就是把for循环和if语句写在一行来完成整个逻辑,具体代码如下。
一行代码就完成了,简洁明了,还高效!
Python的控制语句是强大的,在实际开发项目的过程中会经常使用,可以利用它们完成业务逻辑或调试程序。那么,如何利用控制语句来调试程序呢?
假设有一个循环语句,循环次数可能是10000次,甚至更多,在循环过程中突然报一个错误,但因为里面有很多变量和参数,不知道是哪些变量或参数出了问题。
如果可以看到这些变量或参数的值,或许就可以诊断出问题。查看这些变量或参数值,可以使用print语句,为了尽快完成循环,测试时可以引入break语句,这样就无须每次循环10000次,运行一次即可,并且改动量是极小的。