目录
控制语句
前面学习的变量、数据类型(整数、浮点数、布尔)、序列(字符串、列表、元组、字典、集合),可以看做是数据的组织方式。数据可以看做是“砖块”!流程控制语句是代码的组织方式,可以看做是“混凝土”。一个完整的程序,离不开“砖块”,也离不开“混凝土”。他们的组合,才能让我们建立从小到“一个方法”,大到“操作系统”,这样各种各样的“软件”。
选择结构
选择结构通过判断条件是否成立,来决定执行哪个分支。选择结构有多种形式,分为:单分 支、双分支、多分支。
条件表达式详解
在选择和循环结构中,条件表达式的值为 False 的情况如下:
False、0、0.0、空值 None、空序列对象(空列表、空元祖、空集合、空字典、空字符串)、空 range 对象、空迭代对象。
其他情况,均为 True。这么看来,Python 所有的合法表达式都可以看做条件表达式,甚至包括函数调用的表达式。
条件表达式中,不能有赋值操作符“=”
在 Python 中,条件表达式不能出现赋值操作符“=”,避免了其他语言中经常误将关系运算符“==”写作赋值运算符“=”带来的困扰。如下代码将会报语法错误:
if 3<c and (c=20):
print("赋值符不能出现在条件表达式中")
三元条件运算符
Python 提供了三元运算符,用来在某些简单双分支赋值情况。这种写法更加简洁,易读。
三元条件运算符语法格式如下:
条件为真时的值 if (条件表达式) else 条件为假时的值
选择结构嵌套
选择结构可以嵌套,使用时一定要注意控制好不同级别代码块的缩进量,因为缩进量决定了 代码的从属关系。
练习:输入一个分数。分数在 0-100 之间。90 以上是 A,80 以上是 B,70 以上是 C,60 以上是 D。60 以下是 E。
初始代码:
score = int(input('请输入一个0-100之间的数字:'))
grade = ''
if score>100 or score<0: #语句1
score = int(input('输入错误!请重新输入一个0-100之间的数字:'))
else:
if score <60:
grade ='E'
elif score <70:
grade ='D'
elif score <80:
grade ='C'
elif score <90:
grade ='B'
else:
grade ='A'
print("分数是{0},等级是{1}".format(score, grade))
运行结果:
错误原因:当输入的数字超出(0-100)的区间后,进入语句1,重新输入的数字也无法从该语句中跳出来,导致后面的语句无法运行,结果无法输出
纠正后的代码:
while True: #无限循环
score = int(input('请输入一个0-100之间的数字'))
grade = ' '
if score >100 or score <0: #语句1
print('输入错误!')
continue #当输入的数字超出范围,结束本次循环,继续下一次循环
else:
if score <60:
grade ='E'
elif score <70:
grade ='D'
elif score <80:
grade ='C'
elif score <90:
grade ='B'
else:
grade ='A'
print("分数是{0},等级是{1}".format(score, grade))
运行结果:
continue语句解决了当输入数字超出范围后,可以结束本次循环,跳出语句1,重新运行代码
循环结构
循环结构用来重复执行一条或多条语句。表达这样的逻辑:如果符合条件,则反 复执行循环体里的语句。在每次执行完后都会判断一次条件是否为 True,如果 为 True 则重复执行循环体里的语句。图示如下:
循环体里面的语句至少应该包含改变条件表达式的语句,以使循环趋于结束;否则,就会变成一个死循环。
while 循环
while 循环的语法格式如下:
while 条件表达式:
循环体语句
练习:利用 while 循环,计算 1-100 之间数字的累加和;计算 1-100 之间偶数的累加和, 计算 1-100 之间奇数的累加和。
#利用while 循环计算1-100之间的数字的累加和
num = 0
sum_all = 0 #1-100 所有数的累加和
sum_even = 0 #1-100 偶数的累加和
sum_odd = 0 #1-100 奇数的累加和
while num<=100:
sum_all += num
if num%2==0:
sum_even += num
else:
sum_odd += num
num += 1 #迭代,改变条件表达式,使循环趋于结束
print("1-100 所有数的累加和",sum_all)
print("1-100 偶数的累加和",sum_even)
print("1-100 奇数的累加和",sum_odd)
for 循环(和可迭代对象遍历)
for 循环通常用于可迭代对象的遍历。for 循环的语法格式如下:
for 变量 in 可迭代对象:
循环体语句
例如:遍历一个元组或列表
for x in (20,30,40):
print(x*3)
可迭代对象 (Python 包含以下几种可迭代对象):
1. 序列。包含:字符串、列表、元组
2. 字典
3. 迭代器对象(iterator) ,如range 对象
4. 生成器函数(generator)
5. 文件对象
嵌套循环和综合练习:利用嵌套循环打印九九乘法表
#利用循环嵌套打印99乘法口诀
for x in range(1,10):
for y in range(1,x+1):
print('{0}*{1}={2}'.format(x,y,x*y),end="\t")
print()
break 语句
break 语句可用于 while 和 for 循环,用来结束整个循环。当有嵌套循环时,break 语句只 能跳出最近一层的循环。
continue 语句
continue 语句用于结束本次循环,继续下一次。多个循环嵌套时,continue 也是应用于最 近的一层循环。
练习:要求输入员工的薪资,若薪资小于 0 则重新输入。最后打印出录入员工的数量和 薪资明细,以及平均薪资
empNum = 0
salarySum= 0
salarys = []
while True:
s = input("请输入员工的薪资(按 Q 或 q 结束)")
if s.upper()=='Q':
print("录入完成,退出")
break #循环结束,输出结果
if float(s)<0:
continue #结束本次循环,重新开始下一次循环
empNum +=1
salarys.append(float(s))
salarySum += float(s)
print("员工数{0}".format(empNum))
print("录入薪资:",salarys)
print("平均薪资{0}".format(salarySum/empNum))
else 语句
while、for 循环可以附带一个 else 语句(可选)。如果 for、while 语句没有被 break 语句 结束,则会执行 else 子句,否则不执行。语法格式如下:
练习:员工一共 4 人。录入这 4 位员工的薪资。全部录入后,打印提示“您已经全部录 入 4 名员工的薪资”。最后,打印输出录入的薪资和平均薪资
salarySum= 0
salarys = []
for i in range(4):
s = input("请输入一共 4 名员工的薪资(按 Q 或 q 中途结束)")
if s.upper()=='Q':
print("录入完成,退出")
break
if float(s)<0:
continue
salarys.append(float(s))
salarySum += float(s)
else:
print("您已经全部录入 4 名员工的薪资")
print("录入薪资:",salarys)
print("平均薪资{0}".format(salarySum/4))
代码优化
虽然计算机越来越快,空间也越来越大,我们仍然要在性能问题上“斤斤计较”。编写循环 时,遵守下面三个原则可以大大提高运行效率,避免不必要的低效计算:
1. 尽量减少循环内部不必要的计算
2. 嵌套循环中,尽量减少内层循环的计算,尽可能向外提。
3. 局部变量查询较快,尽量使用局部变量
4. 连接多个字符串,使用 join()而不使用+
5. 列表进行元素插入和删除,尽量在列表尾部操作
使用 zip()并行迭代
我们可以通过 zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停 止。
#测试 zip()并行迭代
names = ("高淇","高老二","高老三","高老四")
ages = (18,16,20,25)
jobs = ("老师","程序员","公务员")
for name,age,job in zip(names,ages,jobs):
print("{0}--{1}--{2}".format(name,age,job))
运行结果:
推导式创建序列
推导式是从一个或者多个迭代器快速创建序列的一种方法。它可以将循环和条件判断结合, 从而避免冗长的代码。
列表推导式(生成列表对象)
语法如下:
[表达式 for item in 可迭代对象 ] 或:[表达式 for item in 可迭代对象 if 条件判断]
#方法1 推导式创建列表
ells = [(row,col) for row in range(1,10) for col in range(1,10)]
print(cells)
#方法2:用for循环遍历,一个个添加列表元素
cells = []
for x in range(1,10):
for y in range(1,10):
cells.append((x,y))
print(cells)
字典推导式(生成字典对象)
格式如下:
{key_expression : value_expression for 表达式 in 可迭代对象}
类似于列表推导式,字典推导也可以增加 if 条件判断、多个 for 循环。
#统计文本中字符出现的次数:
my_text = ' i love you, i love sxt, i love gaoqi'
#方法1:推导式
char_count = {c:my_text.count(c) for c in my_text}
print(char_count)
#方法2:用for循环遍历
char = {}
for x in my_text:
char[x]=my_text.count(x)
print(char)
集合推导式(生成集合)
和列表推导式的语法格式类似,如下:
{表达式 for item in 可迭代对象 } 或者:{表达式 for item in 可迭代对象 if 条件判断}
生成器推导式(生成器对象,需用tuple()转换成元组)
语句和列表推导式类似,如下:
(表达式 for item in 可迭代对象 )或者:(表达式 for item in 可迭代对象 if 条件判断)
注意:一个生成器只能运行一次。第一次迭代可以得到数据,第二次迭代发现数据已经没有了。