在程序中经常会出现需要重复执行某一些代码的情况,比如我们计算1-100之间的数字的和,其实相当于把1开始的100个数字重复加到和上面去, 这个过程就是典型的重复执行过程,这种重复,我们叫做循环。
循环也需要语句支持,Python中循环分为两种(其实机会所有语言都这样):
- for循环
- while循环
这里面重复下,很多小白喜欢瞎想究竟学习哪种语言,或者想哪种语言好一些,我非常不推荐这样,毕竟我们不是学语言比较学的, 所有计算机语言严格上讲都是指令集,而这个真不是拍脑袋随便创造的,背后有完整的知识体系,比如编译原理,所以可以说, 所有计算机语言逻辑都是一致的,这也造成其实每种语言的大致组成部分都大差不差
for循环
for循环适合那种有固定重复次数的循环,比如我们上面的例子,计算 1-100 之间所有数字的和,这里其实有明确的循环次数,只有100个数字, 我们需要精准执行100次计算才行。
for循环的语句格式如下所示:
for 变量 in 序列:
语句1
语句2
...
以上for循环的指令格式表示的意思是:
- 对于后面指定的序列里面的每一个值
- 我们把这个值暂时存放大气变量中
- 然后执行下面的语句1, 语句2 … …
- 重复这样的步骤直到每一个值都遍历一次
列表就是一列数字或者其他值,一般用中括号表示 例如 [‘zhangsan’, ‘lisi’, ‘wangwu’, 999]
举个栗子吧
请看下面的案例:
# 列表就是一列数字或者其他值,一般用中括号表示
# 例如 ['zhangsan', 'lisi', 'wangwu','jingjing']
# 打印学生列表姓名
for name in ['zhangsan', 'lisi', 'wangwu','jingjing']:
print(name)
上面的代码机器简单,就是一个简单的遍历循环,需要注意的是中括号表示一共列表,我们后面会重点讲述列表的内容,这里暂时理解成 一队有顺序的数据, 运行结果如下所示:
zhangsan
lisi
wangwu
jingjing
我们啰嗦下上面案例的执行过程:
- 对于一列字符串组成的列表,需要依次执行
- 首先把列表中某个(其实是按顺序运行的)值赋值给变量
name - 执行
for的语句循环体,即打印出这个变量的值 - 依次执行,直到把列表中所有的值都遍历一遍
循环体是否执行,如何执行跟变量
name其实没任何关系,循环体中也完全可以不出现name相关任何操作
一个说明性的案例如下:
# 本案例中变量跟循环体没任何关系,循环体也没出现变量
# 打印三遍北京图灵学院的校训
for i in [1,2,3]:
print("我爱王晓静")
# 结果会打印出三遍 '我爱王晓静'
# 但for循环后面出现的打印语句,跟变量没任何关系
# 这里for的作用就只是负责让下面代码执行三遍而已
一个正经的栗子
上面案例过于简单,下面的例子是,我们对列表里的人挨个进行检查,知道我们喜欢的静静出现为止:
# 打印学生列表姓名
# 如果是jingjign,那肯定是我的最爱呀,
# 如果是别的学生,那要冷酷的拒绝他
for name in ['zhangsan', 'lisi', 'wangwu','jingjing']:
print(name)
if name == "jingjing":
print("我的最爱{0}出现了".format(name))
else:
print("同学我们不约,不约,同学请自重")
在循环体重,我们加入了一个判断语句,只有当我们喜欢的静静出现了才执行else语句,其余的人我们只好残忍的拒绝:
zhangsan
同学我们不约,不约,同学请自重
lisi
同学我们不约,不约,同学请自重
wangwu
同学我们不约,不约,同学请自重
jingjing
我的最爱jingjing出现了
range介绍
我们经常会需要一队数字,这队数字从0或者1开始,然后按顺序递增,Python为我们准备了这样一个功能,可以让我们方便的生成一队数字,这些数字 按照一定的规律变化,这就是 range 函数。
下面解释并不精准,为了理解方便,我先这么说,后面会具体讲到
range使用的技术点。
在range函数中,首要功能是是生成一列数字,这列数字有始有终,在使用中,我们需要指定数字的开头和结尾,请看下面栗子:
# range练习
# 打印从1-10的数字
# 注意,一般在python中,如果由表示数字范围的两个数,一般是包含左边数字不包含右边数字
# randint是特例,他左右都包含
# range函数在python2 和 python3中有严重区别
for i in range(1,11):
print(i)
案例中,我们用range生成了一列数字,这列数字是由括号内两个数字表示,第一个数字表示这列数字从1开始,第二个数字11表示到11截止,并不 包括11, 每次增加1(即步长), 这样就会为我们生成需要的数字,请看运行结果:
1
2
3
4
5
6
7
8
9
10
如果需要,range还可以生成步长不为1的数列,比如我们需要1-100内的所有能被7整除的数字,可以这样行:
for i in range(7,100, 7):
print(i)
上面的代码range函数中第一个和第二个数字的作用我们已经给大家介绍过了,第三个数字的作用是告诉系统,生成的数字队列每次增加7,即步长为7。
for-else语句
以上是for语句的简单介绍,除了正常的逻辑之外,我们经常会有一种需求,即我们按照一定次数进行循环,当循环结束后,我们还希望能进行另外一个 单独的操作,你可以把它当成一个收尾工作,比如我让你跑操场10圈,跑完后去冲澡,此处冲澡就是一个收尾工作,且跟你跑多少圈没关系,只在最后执行一次。
在Python中,我们用for-else语句来实现这种功能,这里必须说明的是,else语句其实是一种可选语句,你可以看做世界上本来没有for循环,所谓的 for语句只是for-else语句的一个特例。
请看下面的例子:
# for-else语句
# 打印列表中的同学,
# 如果没有在列表中,或者列表结束了,我们需要打印提示语句,表示不在爱了
# 打印学生列表姓名
# 如果是jingjign,那肯定是我的最爱呀,
# 如果是别的学生,那要冷酷的拒绝他
for name in ['zhangsan', 'lisi', 'wangwu','jingjing']:
print(name)
if name == "jingjing":
print("我的最爱{0}出现了".format(name))
else:
print("同学我们不约,不约,同学请自重")
else:
print("别的都不是我的学生,不会在爱了")
print("别的都不是我的学生,不会在爱了")
print("别的都不是我的学生,不会在爱了")
上面代码,正常循环完毕后还以后一个else语句,这个语句一共由三句话,即三个打印语句。
执行结果如下:
zhangsan
同学我们不约,不约,同学请自重
lisi
同学我们不约,不约,同学请自重
wangwu
同学我们不约,不约,同学请自重
jingjing
我的最爱jingjing出现了
别的都不是我的学生,不会在爱了
别的都不是我的学生,不会在爱了
别的都不是我的学生,不会在爱了
循环之break,continue,pass
除了正经的循环语句,我们可能还需要有一些特殊的需求,比如循环到一半不想继续了,或者跳过本次循环直接进入下一轮等,我们使用下面三个关键字实现:
- break: 无条件结束整个循环,简称循环猝死
- continue:无条件结束本次循环,从新进入下一轮循环
- pass:表示略过,通常用于占位,也可以用在函数或者类里面,因为根据语法,某个地方必须有代码才可以,但我们暂时可能不确定具体内容,就用pass占位
break,continue语句对所有循环都有效,包括后面学习的while循环。
炒个栗子吧:
# 在数字1-10中,寻找数字7,一旦找到,打印出来,其余则什么都不做
# for 循环中的变量表示,一般用i,k,m,n,或者indx,idx,item之类
# 在python中,如果循环变量名称不重要,可以用下划线(_)代替
for i in range(1,11):
if i == 7:
print("我找到了")
# 此出break表示结束整个for循环
break
else:
continue
# 注意,此处print永远不会被执行,思考为什么?
print(i)
再炒个栗子:
# continue语句联系
# 在数字1-10中,寻找所有偶数,找到偶数后打印偶数
for i in range(1,11):
if i % 2 == 1:
# 不是偶数就啥也不干,这里的continue有点多余,可以用另外更简洁的形式
# 此处纯属练习
continue
# 打印语句不会被执行
print(i)
else:
print("{0} 是偶数".format(i))
运行结果是:
2 是偶数
4 是偶数
6 是偶数
8 是偶数
10 是偶数
# continue语句 版本 2
# 在数字1-10中,寻找所有偶数,找到偶数后打印偶数
for i in range(1,11):
if i % 2 == 0:
print("{0} 是偶数".format(i))
2 是偶数
4 是偶数
6 是偶数
8 是偶数
10 是偶数
一个比上面简洁点的🌰 :
# continue语句 版本 2
# 在数字1-10中,寻找所有偶数,找到偶数后打印偶数
# 本案例完整显示continue的用法和作用
for i in range(1,11):
if i % 2 == 1:
continue
print("{0} 是偶数".format(i))
运行结果跟上面一致:
2 是偶数
4 是偶数
6 是偶数
8 是偶数
10 是偶数
一个pass的🌰:
# pass例子,一般用于占位
# pass没有跳过功能
for i in range(1,11):
pass
print("wo zai zheli")
运行结果是下面这样的,结果清楚的表明pass语句没有跳过功能:
wo zai zheli
wo zai zheli
wo zai zheli
wo zai zheli
wo zai zheli
wo zai zheli
wo zai zheli
wo zai zheli
wo zai zheli
wo zai zheli