2020-10-13 DAY 5 流程控制语句

目录

控制语句

选择结构

条件表达式详解

选择结构嵌套

循环结构

推导式创建序列


控制语句

前面学习的变量、数据类型(整数、浮点数、布尔)、序列(字符串、列表、元组、字典、集合),可以看做是数据的组织方式。数据可以看做是“砖块”!流程控制语句是代码的组织方式,可以看做是“混凝土”。一个完整的程序,离不开“砖块”,也离不开“混凝土”。他们的组合,才能让我们建立从小到“一个方法”,大到“操作系统”,这样各种各样的“软件”。

选择结构

选择结构通过判断条件是否成立,来决定执行哪个分支。选择结构有多种形式,分为:单分 支、双分支、多分支。

条件表达式详解

在选择和循环结构中,条件表达式的值为 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 条件判断)

注意一个生成器只能运行一次。第一次迭代可以得到数据,第二次迭代发现数据已经没有了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值