python复习(分支结构和循环结构)

317 阅读8分钟

if语句

Python中if语句的一般形式如下所示:

if condition_1:  
    statement_block_1  
elif condition_2:  
    statement_block_2  
else:  
    statement_block_3
  • 如果 "condition_1" 为 True 将执行 "statement_block_1" 块语句
  • 如果 "condition_1" 为False,将判断 "condition_2"
  • 如果"condition_2" 为 True 将执行 "statement_block_2" 块语句
  • 如果 "condition_2" 为False,将执行"statement_block_3"块语句

Python 中用 elif 代替了 else if,所以if语句的关键字为:if – elif – else。

注意
1、每个条件后面要使用冒号:,表示接下来是满足条件后要执行的语句块。
2、使用缩进来划分语句块,相同缩进数的语句在一起组成一个语句块。

In

# 用户名是admin且密码是123456则身份验证成功否则身份验证失败
username = input('请输入用户名: ')
password = input('请输入密码: ')

if username == 'admin' and password == '123456':
    print('身份验证成功!')
else:
    print('身份验证失败!')

Out

身份验证成功!

当然如果要构造出更多的分支,可以使用if...elif...else...结构或者嵌套的if...else...结构,下面的代码演示了如何利用多分支结构实现分段函数求值。

image.png

In

x = float(input('x = '))
if x > 1:
    y = 3 * x - 5
elif x >= -1:
    y = x + 2
else:
    y = 5 * x + 3
print('f(%.2f) = %.2f' % (x, y))

Out

f(3.00) = 4.00

当然根据实际开发的需要,分支结构是可以嵌套的,例如判断是否通关以后还要根据你获得的宝物或者道具的数量对你的表现给出等级(比如点亮两颗或三颗星星),那么我们就需要在if的内部构造出一个新的分支结构,同理elif和else中也可以再构造新的分支,我们称之为嵌套的分支结构,也就是说上面的代码也可以写成下面的样子。

多分支if/elif/else语句

多分支结构比较复杂,可以画图表示如下:

image.png

实例

从键盘输入标准价格和订货量。根据订货量大小,价格给以不同的折扣,计算应付货款(应付货款=订货量×价格×(1-折扣))。

  • 订货量300以下,没有折扣;
  • 订货量300及以上,500以下,折扣为3%;
  • 订货量500及以上,1000以下,折扣5%;
  • 订货量1000及以上,2000以下,折扣8%;
  • 订货量2000及以上,折扣10%。

In

price=float(input('请输入标准价格'))
quantity=int(input('请输入订货量'))

if quantity<0:
    coff=-1
elif quantity<300:
    coff=0.0
elif quantity<500:
    coff=0.03
elif quantity<1000:
    coff=0.05
elif quantity<2000:
    coff=0.08
else:
    coff=0.1

if quantity>=0 and price>=0:
    pays=quantity*price*(1-coff)
    print('支付金额:',pays)
else:
    print('输入的订货量与标准价格均不能小于零!')

Out

支付金额: 4750.0

选择结构的嵌套

在某一个分支的语句体中,又嵌套新的分支结构,这种情况称为选择结构的嵌套。选择结构的嵌套形式因问题不同而千差万别,因此分析透彻每一个分支的逻辑情况是编写程序的基础。

实例
输入客户类型、标准价格和订货量。根据客户类型(<5为新客户,>=5老客户)和订货量给予不同的折扣,计算应付货款(应付货款=订货量×价格×(1-折扣))。
如果是新客户:
订货量800以下,没有折扣;
否则折扣为2%。
如果是老客户:
订货量500以下,折扣为3%;
订货量500及以上,1000以下,折扣5%;
订货量1000及以上,2000以下,折扣8%;
订货量2000及以上,折扣10%。

In

ctype=int(input('请输入客户类型(小于5为新客户):'))
price=float(input('请输入标准价格:'))
quantity=int(input('请输入订货数量:'))

if ctype>0 and price>0 and quantity>0:
    if ctype<5:
        if quantity<800:
            coff=0
        else:
            coff=0.02
    else:
        if quantity<500:
            coff=0.03
        elif quantity<1000:
            coff=0.05
        elif quantity<2000:
            coff=0.08
        else:
            coff=0.1
    pays=quantity*price*(1-coff)
    print('支付金额:',pays)
else:
    print('输入错误')

for循环

应用场景
我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。
例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中,让机器人向球门方向移动就是一个需要重复的动作,当然这里还会用到上一课讲的分支结构来判断机器人是否持球以及是否进入射门范围。
再举一个简单的例子,如果要实现每隔1秒中在屏幕上打印一次“hello, world”并持续打印一个小时,我们肯定不能够直接把print('hello, world')这句代码写3600遍,这里同样需要循环结构。

循环结构就是程序中控制某条或某些指令重复执行的结构。在Python中构造循环结构有两种做法,一种是for-in循环,一种是while循环。

如果明确的知道循环执行的次数或者要对一个容器进行迭代(后面会讲到),那么我们推荐使用for-in循环,例如下面代码中计算1~100求和的结果。

for语句

for循环可以遍历任何可迭代对象,如一个列表或者一个字符串。
for循环的一般格式如下: In

for <variable> in <sequence>:    
    <statements>    
else:    
    <statements>

for循环实例:

languages = ["C", "C++", "Perl", "Python"] 
for x in languages:
    print (x)

Out

C
C++
Perl
Python

break

以下 for 实例中使用了 break 语句,break 语句用于跳出当前循环体:

In

sites = ["Baidu", "Google","jindong","Taobao"]
for site in sites:
    if site == "jindong":
        print("购物!")
        break
    print("循环数据 " + site)
else:
    print("没有循环数据!")
print("完成循环!")

Out

循环数据 Baidu
循环数据 Google
购物!
完成循环!

执行脚本后,在循环到 "jindong"时会跳出循环体,完成循环

continue

上面的代码中使用了break关键字来提前终止循环,需要注意的是break只能终止它所在的那个循环,这一点在使用嵌套的循环结构(下面会讲到)需要引起注意。除了break之外,还有另一个关键字是continue,它可以用来放弃本次循环后续的代码直接让循环进入下一轮

和分支结构一样,循环结构也是可以嵌套的,也就是说在循环中还可以构造循环结构。下面的例子演示了如何通过嵌套的循环来输出一个九九乘法表。

In

for i in range(1, 10):
    for j in range(1, i + 1):
        print('%d*%d=%d' % (i, j, i * j), end='\t')
    print()

Out

1*1=1	
2*1=2	2*2=4	
3*1=3	3*2=6	3*3=9	
4*1=4	4*2=8	4*3=12	4*4=16	
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81	

 range()函数

如果你需要遍历数字序列,可以使用内置range()函数。它会生成数列,例如:

In

for i in range(5):
    print(i)

Out

0
1
2
3
4

利用range()函数计算1~100和:

In

sum = 0
for x in range(101):
    sum += x
print(sum)

Out

5050

需要说明的是上面代码中的range(1, 101)可以用来构造一个从1到100的范围,当我们把这样一个范围放到for-in循环中,就可以通过前面的循环变量x依次取出从1到100的整数。当然,range的用法非常灵活,下面给出了一个例子:

  • range(101):可以用来产生0到100范围的整数,需要注意的是取不到101。
  • range(1, 101):可以用来产生1到100范围的整数,相当于左闭右开
  • range(1, 101, 2):可以用来产生1到100的奇数,其中2是步长,即每次数值递增的值。
  • range(100, 0, -2):可以用来产生100到1的偶数,其中-2是步长,即每次数字递减的值。

知道了这一点,我们可以用下面的代码来实现1~100之间的偶数求和。

In :

sum = 0
for x in range(2, 101, 2):
    sum += x
print(sum)

Out

2550

思考:如何求1~100之间的奇数求和?

当然,也可以通过在循环中使用分支结构的方式来实现相同的功能,代码如下所示。

In

sum = 0
for x in range(1, 101):
    if x % 2 == 0:
        sum += x
print(sum)

Out

2550

tips:相较于上面直接跳过奇数的做法,下面这种做法很明显并不是很好的选择。

您可以结合range()和len()函数以遍历一个序列的索引,如下所示:

In

a = ['Google', 'Baidu', 'ModelWhale', 'Taobao', 'QQ']
for i in range(len(a)):
    print(i, a[i])

while循环

如果要构造不知道具体循环次数的循环结构,我们推荐使用while循环。while循环通过一个能够产生或转换出布尔值的表达式来控制循环,表达式的值为True则继续循环;表达式的值为False则结束循环。

while语句

while 判断条件(condition):    
    执行语句(statements)……

以下实例使用了 while 来计算 1 到 100 的总和:

In :

n = 100
 
sum = 0
counter = 1
while counter <= n:
    sum = sum + counter
    counter += 1
 
print("1 到 %d 之和为: %d" % (n,sum))

Out

1  100 之和为: 5050

无限循环

我们可以通过设置条件表达式永远不为 false 来实现无限循环,实例如下:

In :

var = 1
while var == 1 :  # 表达式永远为 true
   num = int(input("输入一个数字  :"))
   print ("你输入的数字是: ", num)
 
print ("Good bye!")

Out

你输入的数字是:  3
你输入的数字是:  4

无限循环在服务器上客户端的实时请求非常有用。

while循环使用else语句

如果 while 后面的条件语句为 false 时,则执行 else 的语句块。
语法格式如下:

while <expr>:    
    <statement(s)>    
else:    
    <additional_statement(s)>

expr 条件语句为 true 则执行 statement(s) 语句块,如果为 false,则执行 additional_statement(s)。

循环输出数字,并判断大小:

In

count = 0
while count < 5:
   print (count, " 小于 5")
   count = count + 1
else:
   print (count, " 大于或等于 5")

下面我们通过一个“猜数字”的小游戏来看看如何使用while循环。猜数字游戏的规则是:计算机出一个1到100之间的随机数,玩家输入自己猜的数字,计算机给出对应的提示信息(大一点、小一点或猜对了),如果玩家猜中了数字,计算机提示用户一共猜了多少次,游戏结束,否则游戏继续。

In

import random

answer = random.randint(1, 100)#随机取1~100之间的一个整数
counter = 0
while True:
    counter += 1
    number = int(input('请输入: '))
    if number < answer:
        print('大一点')
    elif number > answer:
        print('小一点')
    else:
        print('恭喜你猜对了!')
        break #猜对即停止while循环
print('你总共猜了%d次' % counter)
if counter > 7:
    print('你的智商余额明显不足')

练习

练习1:英制单位英寸与公制单位厘米互换。

1 厘米 = 0.39英寸; 1 英寸 = 2.54厘米

练习2:百分制成绩转换为等级制成绩。

要求:如果输入的成绩在90分以上(含90分)输出A;80分-90分(不含90分)输出B;70分-80分(不含80分)输出C;60分-70分(不含70分)输出D;60分以下输出E。

练习3:输入一个正整数判断是不是素数

提示:素数指的是只能被1和自身整除的大于1的整数。

IN[1]

length = float(input("请输入长度:"))

unit = input("请输入单位:")

if unit =='in' or unit =='英寸':
    
    print ('%2.f英寸等于%2.f厘米'%(length,length*2.54))
    
elif unit =='cm' or unit == '厘米':

    print ('%2.f厘米等于%2.f英寸'%(length,length*0.39))
    
else :
    
    print ('超出程序能力!')

IN[2]

score = float(input("请输入成绩:"))

if score > 100 or score <0:
    print('成绩出错')
elif score >= 90:
    print('你的评级为:A')
elif score >= 80:
    print('你的评级为:B')
elif score >=70:
    print('你的评级为:C')
elif score >=60:
    print('你的评级为:D')
else :
    print('你的评级为:E')

IN[3]

number = int(input('请输入一个正整数:'))

for a in range(2,number):
    
    if number%a==0:
        print('%f不是素数'%(number))
        break
    else :
        print('%f是素数'%(number))
        break