一、程序控制的三种基本结构
1. 顺序
- 按照先后顺序一条条执行
- 例如:先洗手,再吃饭,再洗碗
2. 分支
- 根据不同的情况判断,条件满足执行某条件下的语句
- 例如:先洗手,如果饭没有做好,玩游戏;如果饭做好了,就吃饭;如果没有做饭,叫外卖
3. 循环
- 条件满足就反复执行,不满足就不执行或不再执行
- 例如:先洗手,看饭好了没有,没有好,一会儿来看一次是否好了,一会儿来看一次,知道饭好了,才可以吃饭。这里循环的条件是饭没有好,饭没有好,就循环的来看饭好了没有
二、分支结构
1. 单分支
if condition:
代码块
if 1 < 2: # if True:
print("1 less than 2") # 代码块
- condition必须是一个bool类型,这个地方有一个隐式转换bool(condition),相当于False等价
- if语句这行最后,会有一个冒号,冒号之后如果有多条语句的代码块,需要另起一行,并缩进
① if、for、def、class等关键字后面都可以跟代码块
② 这些关键字后面,如果有一条语句,也可以跟在这一行后面。例如: if 1 > 2: pass (不建议)
2. 多分支
if condition1:
代码块1
elif condition2:
代码块2
elif condition3:
代码块3
……
else:
代码块
a = 5
if a < 0:
print("negative")
elif a == 0: # 相当于 a >= 0
print("zero")
else: # 相当于 a > 0
print("positive")
- 分支结构,只要有一个分支被执行,其他分支都不会被执行
- 前一个条件被测试过,下一个条件相当于隐含着这个条件
- python中没有switch…case
# 嵌套
a = 5
if a == 0:
print("zero")
else:
if a > 0:
print("positive")
else:
print("negative")
for循环、while循环都可以相互嵌套,形成剁成循环,但循环嵌套不易过深。
三、while循环
while循环多用于死循环,或者不明确知道循环次数的场景
while cond:
block
while True: # 死循环
pass
a = 10
while a: # 条件满足则进入循环
print(a)
a -= 1
- 上例执行结果是什么?
- 为什么?
- 会不会打印出0?要注意边界的分析
- 如果flag = -10可以么?如何改?回忆一下,False等价是什么?
四、for语句
for element in iterable: # 可迭代对象中有元素可以迭代,进入循环体
block
for i in range(0, 10):
print(i)
遍历:容器中所有的元素不重复的取一遍
range()内建函数,直接返回一个range对象,并不是直接立即返回数据,惰性对象
惰性对象,必须使用一些方法,去里面拿出数据,你不拿,他不给。拨一下转一下,我们得驱使惰性对象运转。
range对象 是 可以迭代得对象,它有内容,但是你必须驱动它
for i in range(3): # 默认会一次次驱动它,直到可迭代对象遍历完成
print(i)
range(stop) -> range object 给终点,默认起点是0,返回的是[0, stop) / [0, stop -1]
range(start, stop[, step]) -> range object
range(i),i大于0,相当于计数器
range(0, 1) <==> range(1) 0 1个数据 计数器
range(0, 10) <==> range(10) 0 ~9 1个数据 计数器
练习:
① 打印1到10
② 打印10以内的奇数
③ 打印10以内的偶数
④ 倒着打印10以内的奇数或偶数
⑤ 打印2的0次幂的值
五、continue
跳过当前循环的当次循环,继续下一次循环
for i in range(10):
if i % 2 !=0:
continue
print(i)
for i in range(0, 10):
if i & 1 !: continue # 按位与
print(i)
六、break
结束当前循环
练习:计算1000以内的被7整除的前20个正整数(for循环)
count = 0
for i in range(7, 1000, 7):
count += 1
print(count, i)
if count == 20:
break
总结:
- continue和break是循环的控制语句,只影响当前循环,包括while、for循环
- 如果循环嵌套,continue和break也只影响语句所在的那一层循环
- continue和break只影响循环,所以if cond: break不是跳出if,而是终止if外的break所在的循环
- 分支和循环结构可以嵌套使用,可以嵌套多层
七、else子句
如果循环正常结束,else子句会被执行,即使是可迭代对象没有什么元素可迭代
for i in range(0): # 可迭代对象没有迭代
pass
else:
print("OK")
for i in range(0, 10):
break
else:
print("OK")
for i in range(0, 10):
continue
else:
print("OK")
一般情况下,循环正常执行,只要当前循环不是被break打断的,就可以执行else子句。
哪怕是range(0),也可以执行else子句