4 程序的控制结构

4.1 程序的分支结构

  • 单分支结构:

    1
    2
    3
    guess = eval(input())
    if guess == 99:
    print("You are right")
  • 二分支结构

    1
    2
    3
    4
    5
    guess = eval(input())
    if guess == 99:
    print("You are right")
    else:
    print("You are wrong")

    表达的紧凑形式:

    1
    2
    guess = eval(input())
    print("You are {}".format("right" if guess==99 else 'wrong'))
  • 多分支结构:成绩分级

    1
    2
    3
    4
    5
    6
    7
    score = eval(input())
    if score <= 60:
    grade = "D"
    elif score <= 70:
    grade = 'C'
    else:
    grade = 'A'
  • 条件判断操作符:

    wfjznI.png

    条件组合:

    wfjvjA.png

  • 异常处理:

    try:

    <语句块1>

    except <异常类型>:

    <语句块2>

    1
    2
    3
    4
    5
    try: 
    num = eval(input("Please input an int: "))
    print(num**2)
    except NameError:
    print('It\'s not an int.')

    高级异常处理方法:

    try:

    <语句块1>

    except:

    <语句块2>

    else:

    <语句块3>

    finally:

    <语句块4>

4.2 实例8:身体质量指数

  • 定义:BMI = 体重 / 身高^2

  • 输入:身高和体重

    输出:BMI分类

  • 版本1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #CalBMIv1.py
    height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
    bmi = weight / pow(height, 2)
    print("BMI 数值为:{:.2f}".format(bmi))
    who = ""
    if bmi < 18.5:
    who = "偏瘦"
    elif 18.5 <= bmi < 25:
    who = "正常"
    elif 25 <= bmi < 30:
    who = "偏胖"
    else:
    who = "肥胖"
    print("BMI 指标为:国际'{0}'".format(who))
  • 版本2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #CalBMIv2.py
    height, weight = eval(input("请输入身高(米)和体重\(公斤)[逗号隔开]: "))
    bmi = weight / pow(height, 2)
    print("BMI 数值为:{:.2f}".format(bmi))
    nat = ""
    if bmi < 18.5:
    nat = "偏瘦"
    elif 18.5 <= bmi < 24:
    nat = "正常"
    elif 24 <= bmi < 28:
    nat = "偏胖"
    else:
    nat = "肥胖"
    print("BMI 指标为:国内'{0}'".format(nat))
  • 版本3

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #CalBMIv3.py
    height, weight = eval(input("请输入身高(米)和体重(公斤)[逗号隔开]: "))
    bmi = weight / pow(height, 2)
    print("BMI 数值为:{:.2f}".format(bmi))
    who, nat = "", ""
    if bmi < 18.5:
    who, nat = "偏瘦", "偏瘦"
    elif 18.5 <= bmi < 24:
    who, nat = "正常", "正常"
    elif 24 <= bmi < 25:
    who, nat = "正常", "偏胖"
    elif 25 <= bmi < 28:
    who, nat = "偏胖", "偏胖"
    elif 28 <= bmi < 30:
    who, nat = "偏胖", "肥胖"
    else:
    who, nat = "肥胖", "肥胖"
    print("BMI 指标为:国际'{0}', 国内'{1}'".format(who, nat))

4.3 程序的循环结构

  • 遍历循环:

    for <循环变量> in <遍历结构>:

    <语句块>

    • 计数循环:for i in range(M, N, K):
    • 字符串遍历:for c in s:
    • 列表遍历:for item in ls:
    • 文件遍历:for line in fi:
  • 无限循环:

    while <条件>:

    <语句块>

  • 循环控制保留字:

    • break: 跳出并结束整个当前循环
    • continue: 跳出当前循环,执行下一次循环
  • 循环的扩展:for,while 后接 else。else作为正常循环的奖励(没有break退出)

4.4 模块3:random库

  • 伪随机数:采用梅森旋转算法生成的(伪)随机序列中的元素
  • import random
  • 基本随机函数:
    • random():生成一个0.0到1.0之间的随机小数
    • random.seed(a=None): 确定随机数种子,默认为当前系统时间
  • 扩展随机数函数:
    • randint(a,b): 生成[a,b] 之间的整数
    • randrange(m,n,[,k]): 生成一个[m,n)之间,k为步长的随机整数
    • getrandbits(k): 生成一个k比特长的随机整数
    • uniform(a,b): 生成[a,b]之间的随机小数
    • choice(seq): 从序列中随机选择一个元素
    • shuffle(seq): 将序列中的元素随机排序,返回打乱后的序列

4.5 实例6:圆周率的计算

  • 蒙特卡罗方法:随机撒点比较扇形和方形面积的比值
1
2
3
4
5
6
7
8
# solution 1
pi = 0
N = 100
for k in range(N):
pi += 1/pow(16,k)*(\
4/(8*k+1)-2/(8*k+4)-\
1/(8*k+5)-1/(8*k+6))
print(pi)
  • solution2
1
2
3
4
5
6
7
8
9
10
11
from random import random
from time import perf_counter
DARTS = 1000*1000
hits = 0.0
start = perf_counter()
for i in range(1,DARTS+1):
x,y = random(),random()
hits += 1 if (x**2+y**2<=1) else 0
pi = 4 * (hits/DARTS)
print(pi)
print("Runing time: {:.5f}s".format(perf_counter()-start))

4. Practice

  • 三位水仙花数:ABC是一个”3位水仙花数”,则:A的3次方+B的3次方+C的3次方 = ABC。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬请按照从小到大的顺序输出所有的3位水仙花数,请用”逗号”分隔输出结果。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    arr = []
    for i in range(100,1000):
    a = i//100
    b = (i%100)//10
    c = i-a*100-b*10
    if (a**3+b**3+c**3)==i:
    arr.append(i)
    print(','.join(str(i) for i in arr))

    # solution 2
    l = ''
    for i in range(100,1000,1):
    t = str(i)
    s = eval(t[0])**3 + eval(t[1])**3 + eval(t[2])**3
    if s == i:
    l = l + '{}'.format(i) + ','
    print(l[:-1])

    # solution 3
    a = list(map(lambda x: x[1], filter(lambda x: x[0], [(i*100+j*10+k == i**3+j**3+k**3, i**3+j**3+k**3) for i in range(1, 10) for j in range(0, 10) for k in range(0, 10)])))
  • 整数的加和减:1-2+3-4…966,奇数为正,偶数为负

    1
    2
    3
    4
    result = 0
    for i in range(1,967):
    result += i if (i%2==1) else -i
    print(result)
  • 用户登陆的三次机会:

    给用户三次输入用户名和密码的机会,要求如下:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

    1)如输入第一行输入用户名为‘Kate’,第二行输入密码为‘666666’,输出‘登录成功!’,退出程序;‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬

    2)当一共有3次输入用户名或密码不正确输出“3次用户名或者密码均有误!退出程序。”。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    i = 0
    while True:
    if i==3:
    print('3次用户名或者密码均有误!退出程序。')
    break
    username = input()
    password = input()
    if username == 'Kate' and password == '666666':
    print('登录成功!')
    break
    i += 1