Python语言程序设计MOOC-04周 分支与循环

2020-06-21

在MOOC上,学习了北京理工大学嵩天老师的Python语言程序设计,此为学习笔记记录,备查,备翻阅复习。

程序流程图

是分析程序流程的基本方法

任何程序都是由以下三种结构组合而成

  • 顺序结构

  • 选择结构

  • 循环结构

简单分支结构

除数字以外,字符或字符串也可以按照字典顺序用于条件比较。

实例:求解一元二次方程的根

import math
def main():
    print("please input the real solution to a quadratic\n")
    a,b,c = eval(input("Please enter the coefficients (a,b,c):"))
    delta = b*b-4*a*c
    if delta <0:
        print("\nThe equation has no real roots!")
    else:
        discRoot = math.sqrt(delta)
        root1 = (-b + discRoot) / (2*a)
        root2 = (-b - discRoot) / (2*a)
        print("\nThe solutions are: ", root1, root2)
main()

多分支结构

结果复杂问题的手段。

if-elif-else结构,可以解决嵌套分支程序易读性差的问题。

实例:求解一元二次方程的根的优化

import math
def main():
    print("please input the real solution to a quadratic\n")
    a,b,c = eval(input("Please enter the coefficients (a,b,c):"))
    delta = b*b-4*a*c
    if a ==0:
        x = -b/c
        print("\nThere is a solution",x)
    elif delta <0:
        print("\nThe equation has no real roots!")
    elif delta ==0:
        x = -b/(2*a)
        print("\nThere is a double root at ",x)       
    else:
        discRoot = math.sqrt(delta)
        root1 = (-b + discRoot) / (2*a)
        root2 = (-b - discRoot) / (2*a)
        print("\nThe solutions are: ", root1, root2)
main()

异常处理

是为了捕获程序在执行时会发生的异常。

采用try–except语句,可以捕捉任何类型的错误。一个try语句可以接多个except语句,except语句执行时有点类似if语言,逐个测试是否有符合的error类型进行执行。

还可以可选地使用else finally语句,但是else语句必须在finally语句之前。而finally语句必须在整个语句的最后部分。

try体内如果无异常产生,则执行else语句,finally后面的子句表示无论是否发生异常都要执行。

def main():
    try:
        number1, number2 = eval(input("Enter two numbers, separated by a comma:"))
        result = number1 /number2
    except ZeroDivisionError:
        print("Division by zero!")
    except SyntaxError:
        print("A comma may be missing in the input!")
    except:
        print("Something wrong with the input!")
    else:
        print("No exceptions, the result is ",result)
    finally:
        print("executing the final clause.")

main()

进一步利用异常处理机制完善上述求解一元二次方程根的实例

import math
def main():
    print("This program finds the real solutions to a quadratic.\n")
    try:
        a,b,c = eval(input("Please enter the coefficients (a,b,c):"))
        discRoot = math.sqrt(b*b-4*a*c)
        root1 = (-b+discRoot)/(2*a)
        root2 = (-b-discRoot)/(2*a)
        print("\nThe solutions are: ", root1, root2)
    except ValueError as excObj:
        if str(excObj) == "math domain error":
            print("No Real Roots.")
        else:
            print("You didn't give me the right number of coefficients.")
    except NameError:
        print("\nYou didn't enter three numbers.")
    except TypeError:
        print("\nYour inputs were not at all numbers.")
    except SyntaxError:
        print("\nYour input was not in the correct form. Missing comma?")
    except:
        print("\nSomething went wrong, sorry!")


main()

实例分析:三者最大

  • 通盘比较策略
  • 决策树策略
  • 顺序处理:逐个扫描每个值,使用max变量保留最大值。是最简洁的方法。
  • Python自带的max()函数

基本循环结构

for循环:程序开始时,必须提供输入数字总数,就是需要提供固定循环次数。for循环不需要初始化i。

无限循环模式: while语句。 while循环首先要初始化i。

for/while中的break 和continue用法:

break语句 跳出整个循环。

continue语句 结束本次循环,而不终止整个循环的执行。

for/while中的else用法:else是和for处于同一缩进级别,与for搭配,只有当for循环中,没有break语句打断,并且循环遍历列表执行完毕的情况下,才执行else语句。

#else_for_while.py
for n in range(2,10):
    for x in range(2,n):
        if n % x == 0:
            print(n, "equals",x,"*",n//x)
            break
    else:
        # loop fell through without finding a factor
        print(n,"是一个质数。")
        
#output
"""
2 是一个质数。
3 是一个质数。
4 equals 2 * 2
5 是一个质数。
6 equals 2 * 3
7 是一个质数。
8 equals 2 * 4
9 equals 3 * 3
""""

通用循环构造方法

交互式循环:即时问输入值是否还要继续输入值进行求平均值。

哨兵循环:执行循环直到遇到特定的值时,循环语句才终止执行

文件循环

面向文件的循环方法。readlines()

### 嵌套循环

外层循环嵌套内层循环。

死循环

即终止循环的条件永远无法满足,产生死循环。

但死循环往往是单片机编程的普遍用法。

布尔表达式

布尔值只有两个取值。

python提供了三个布尔操作符, and , or, not.优先级是 not, or, and。 建议用括号明确顺序。

布尔代数。