循环通常是用来解决复杂问题的必备结构 在Python中 有while循环和for循环这两种结构 它们的应用场景不太一样 但是它们的使用方式都很简单 先来看while循环 我们直接来看这个例子 “while j < 10” 后面带一个冒号 有了if语句的经验 我们大概能猜到 这是while的一个条件 它的条件就是j小于10 j小于10的情况下执行哪些语句呢 我们看到这边的两条语句 它们的缩进方式是一样的 所以这就是while的代码块 也就是说在j小于10的情况下 反复执行这样的两条语句 直到什么时候跳出循环呢 大家想一想是不是应该是 在不满足条件的情况下 也就是说j已经大于等于10了 我们看这里应该是j等于10的情况下 跳出循环 再回过头来看这个完整的程序 在最前面有sumA和j的两条赋值语句 这个赋值我们把它称为是赋初值 也就是给变量一个初始的值 在这个前提下 不断地累加j的值 让j的值不断地增加1 其实这个程序在做什么 是不是就是0加到9 所以最后的结果是45 j跳出循环以后它的值是10 我们再回过头来看一下while循环的语法 while后面是条件表达式 在这个表达式的值 是为True的情况下 反复执行代码块 直到表达式的值为假 在写循环结构的时候 要特别注意一些地方 比如说初值 还有循环变量改变的一些语句 因为如果不注意这些问题的话 容易会写出有死循环的程序 大家不要害怕死循环 谁没写过几个死循环的程序呢 再来看for循环 Python中的while循环的语法规则和功能 和其他很多程序语言类似 但是for循环跟其他语言相比 却有比较大的区别 Python中的for循环语句功能更强大 在Python中for循环执行时 获取可迭代对象iterable 一次性产生一个迭代器iterator 可迭代对象指可以按次序迭代 也就是循环的对象 包括像序列 迭代器以及其他可以迭代的对象 如字典的键和文件的行等等 那迭代器是什么呢 它是一种特殊的可迭代对象 它可以在迭代到某一个元素的时候 才计算这个元素 所以我们想一想 它是不是特别适合用于遍历一些 很大甚至是无限的数据集合 我们后面学到的某些函数返回的结果 就是一个迭代器 像用于枚举序列元素的enumerate()函数 它返回的就是一个迭代器 for语句的执行是这样的 执行时先取可迭代对象中的一个值 执行语句序列 然后再取下一个值 再执行语句序列 直到没有元素可取就结束循环 我们先来看如何用for循环 遍历一个数据集内的元素 列表解析和生成器 我们在后续的列表部分再介绍 先来看第一个例子 range()函数返回的是一个range对象 它是可迭代的 这里的程序功能就是逐个遍历range对象中元素 这个结果就是3,5,7,9 一个一个地取 直到没有元素可取 然后输出 所以输出结果就是这样的 再来看第二个例子 字符串属于序列 本身也是可迭代的 因此我们也可以通过for语句 遍历它的每一个字符后输出 所以结果是这样 这里再扩充一下 for循环在遍历序列类型对象时有两种遍历的方式 一种就是这样直接遍历每一个序列项 这里就是每一个字符 这种方式称为序列项迭代 这种方式常常更便捷 还有一种方式是遍历序列中 每一个元素的索引通过索引访问元素 这种方式称为索引迭代 序列索引是从0开始的 每个元素它的索引 也就是下标是从0,1,2,…这样来组织的 通过索引访问元素的方式是sequence[index] 想一想如果我们要遍历Python这个字符串 如何进行索引迭代呢 是不是这样就行了 索引从0到字符串的长度减1 然后访问以后输出 这两种迭代方式 等后面学了序列后大家再仔细体会 针对不同的问题可能会选择不同的迭代方式 为了更好地理解for循环 我们这里对它内部的实现机制 来做一个相对深入的探讨 for循环实际是一个语法糖 语法糖 听上去很甜 是的 简单来说 语法糖就是将一些复杂的语法机制隐藏起来 用户只需要用简单的方式就可以表示这些功能 例如对于这个例子 我们来模拟一下for循环背后的实现 首先用iter()函数基于可迭代对象产生一个迭代器 然后调用迭代器对象的 next()方法获取每个值 next(3) 继续 在获取值的过程中 随时检测边界也就是检查 是否抛出了 StopIteration 这样的异常 如果有值时当然不会 我们可以再继续看 我们发现抛出了这样的异常 这时候迭代就结束了 有点意思吧 这边顺便教大家一个方法 来判断某个对象 它是可迭代对象或者是一个迭代器 一个生成器等等 我们可以用这个模块导入Iterator和Iterable 然后使用isinstance()内建函数 这个的功能与type()有点像 只不过它除了能判断某个对象 是不是属于某个类以外 还能判断是不是属于某个子类 比type()要强一些 例如range(10)是不是一个迭代器呢 False 我们在它前面加一个iter() 再来看 就是True,range(10)是一个可迭代对象 学会了吧 回到实际的例子 我们还是来猜数字 之前我们猜数字只能猜一次 现在我们学了循环是不是就可以猜多次了 例如我们要猜5次 那么是不是只要在之前的语句外 套上一个这样的for循环就可以了 注意缩进 如果用while语句来表示这个循环功能怎么表示呢 是不是只要定义一个循环变量例如i 初值是0 然后当i < 5时执行以下语句 并且需要在循环体内加上 让循环变量更改的语句i += 1 我们看到这种循环次数 确定的情况用for循环会更方便 下面我们来实际写两个例子 第一个例子是用辗转相除法 计算两个整数x和y的最大公约数 x和y由键盘输入 先来输入x和y 我们先把x和y基于大小处理一下 假设要求x大 如果x小于y先交换一下 下面就是辗转相除法的算法部分 判断x除以y的余数是否为0 如果是的话y就是两者的最大公约数 否则就把y赋给x 余数赋值给y 重复执行直到x与y的余数为0 这时y就是我们要的结果 x%y如果不等于0时我们反复执行 r就是余数 把y赋值给x 把余数赋值给y 跳出循环我们的结果就是y 保存, 然后执行这个程序 结果是正确的 再来看另一个简单的例子 编程统计一元人民币兑换成一分 两分和五分的所有兑换方案个数 虽然物价上涨了 但是这个问题只是示意 这个问题怎么样用程序来解决呢 我们是不是只要把一分 两分和五分的个数设为循环变量 如果合计正好是一元则满足条件 然后计数就可以了 我们来写一下程序 分别用i、j和k这三个变量表示五分 两分和一分的个数 初值都设为0 我们知道i的取值范围是[0, 20] j的取值范围是[0, 50] k的取值范围是[0, 100] 到20要写成21 到50要写成51 表示1分的最多100个写成101 这里我们来优化一下程序 因为k的值可以通过i、j和100等计算获得 因此我们可以直接写出k代表的表达式 这样可以少写一重循环 只要让k大于等于0就可以了 如果k大于等于0 可以统计个数 在前面加上count 初值是0,count += 1 最后输出count的值 保存 执行一下这个程序 我们看到结果是541 这一小节我们讨论了Python中的两种循环 while循环和for循环 大家要多多理解它们的思想以及它们之间的不同 特别是for循环 学会先解决小问题 然后逐渐用来解决一些复杂问题