笔记-3:程序基本控制结构

夙愿已清 提交于 2020-03-17 18:14:39

1.程序的流程图

  程序流程图用一系列图形,流程线和文字说明描述程序的基本操作和控制流程,它是程序分析和过程描述的最基本方式。

  流程图的基本元素包括:

  • 起止框:表示程序逻辑的开始或结束。
  • 判断框:表示一个判断条件,并根据判断结果选择不同的执行路径。
  • 处理框:表示一组处理过程,对应于顺序执行的程序逻辑。
  • 输入输出框:表示程序中的数据输入或结果输出。
  • 注释框:表示程序的注释。
  • 流向线:表示程序的控制流,以带箭头直线或曲线表达程序的执行路径。
  • 连接点:表示多个流程图的连接方式,常用于将多个较小流程图组织成较大流程图。

  • 程序由三种基本结构组成:顺序结构,分支结构和循环结构。
  • 任何程序都由这三种基本结构组合而成。
  • 基本结构都有一个入口和一个出口。

   

循环结构是程序根据条件判断结果向后反复执行的一种运行方式, 根据循环体触发条件不同,包括条件循环和遍历循环结构 。

2.顺序结构

 顺序结构是程序按照线性顺序依次执行的一种运行方式, 其中语句块1S1和语句块S2表示一个或一组顺序执行的语句 。

 

3.程序的分支结构

 (1).单分支结构:if语句

if <条件>:
    语句块

# 示例:判断用户输入数字的奇偶性
s = eval(input('请输入一个整数:'))
if s % 2 == 0:
    print('这是一个偶数')
print('输入数字是:{}'.format(s))

# 条件可以是一个或多个条件,多个条件采用and或or进行逻辑组合,
# and表示多个条件‘与’的关系,
# or表示多个条件'或'的关系,

 (2).二分支结构:if-else语句

if 条件:
    语句块1                  # 语句块1在if中满足条件时,执行
else:
    语句块2                  # 语句块2在if中不满足条件时,执行

# 更简洁的表达方式:语句块1 if 条件 else 语句块2

# 示例:
username = input('请输入登录账号:')
password = int(input('请输入登录密码:'))
if username == 'admin' and password == 123456:
    print('登录成功!')
else:
    print('账号或密码错误!')

 (3).多分支结构:if-elif-else语句

# 多分支结构通常用于判断同一个条件或一类条件的多个执行路径。
# 多分支结构从上到下依从评估判断条件,寻找并执行第一个结果为True条件对应的语句。

# 示例:将百分制创建转换为五分制成绩
score = eval(input('请输出一个百分制成绩:'))
if score >= 90.0:
    grade = 'A'
elif score >= 80.0:
    grade = 'B'
elif score >= 70.0:
    grade = 'C'
elif score >= 60.0:
    grade = 'D'
else:
    grade = 'E'
print('成绩等级为:{}'.format(grade))

4.程序的循环结构

 (1)遍历循环: for 

# 遍历循环可以理解为从遍历结构中逐一提取元素, 放在循环变量中, 对于每个所提取的元素执行一次语句块。 
for <循环变量> in <遍历结构>:    
    语句块

# <遍历结构>可以为字符串,文件,range()函数以及组合数据类型等

# 遍历字符串:
for <循环变量> in <字符串变量>:    
    语句块

# 遍历range():
for <循环变量> in range(循环次数):    
    语句块

# 示例:
for s in 'py':
    print('循环执行中:' + s)
else:
    s = '循环正常结束'
print(s)

 (2).无限循环:while

while <条件>:
    <语句块>

# 判断条件是否为True,是,则执行语句。语句结束后返回再次判断while语句的条件。
# 当条件为False时,循环终止。

# while语句扩展模式:
while <条件>:
    <语句块1>
else:
    <语句块2>            # 循环正常执行之后,才执行else下的语句

# 示例:求1-10以内的整数
i = 1
while i <= 10:
    print(i)
    i += 1
else:
    print('执行结束')

 (3)循环控制:break和continue  

  • break用来跳出最内层for或while循环, 脱离该循环后程序从循环后代码继续执行。 如果有2层或多层循环, break退出最内层循环。
  • continue用来结束当前当次循环, 即跳出循环体中下面尚未执行的语句, 但不跳出当前循环。
  • 区别是: continue语句只结束本次循环, 不终止整个循环的执行, 而break具备结束循环的能力。
while True:
    s = input("请输入一个名字(按Q退出): ")
    if s == "Q":
        break
    print("输入的名字是:", s)
print("程序退出")
for s in "PYTHON":
    if s == "Y" or s == "y":
        continue
    print(s, end="")

5.异常处理

  • 异常:指程序中的例外,违规情况。

  • 异常机制:指当程序出现错误后,程序的处理方法。

  •  python中异常的类都是基于继承来实现的,BaseException是所有异常类的基类,所有的内置异常都是它的派生类。
  • 主要异常分为四大类:

    SystemExit:Python退出异常

    KeyboardInterrupt: 键盘打断(Ctrl+C)

    GeneratorExit: 生成器退出

    Exception: 普通异常(只会使用这部分的异常)

Exception是除了SystemExit,GeneratorExit和KeyboardInterrupt之外的所有内置异常的基类,包括自定义异常。

Exception包括的异常:

  • StopItertion:当迭代器中没有数据项时触发,由内置函数next()和迭代器的next方法触发。

  • ArithmeticError:算法异常的基类。

  • AssertionError:assert语句失败时触发。

  • AttributeError:属性引用和属性赋值异常。

  • BufferError:缓存异常,当一个缓存相关的操作不能进行时触发。

  • EOFError:文件末尾,当内置函数input()时生成,表示到达文件末尾。

  • ImportError:导入异常。

  • LookupError:当使用映射或者序列时,如果键值或者索引无法找到的时候触发,它是KeyError和IndexError的基类。

  • MemoryError:内存错误,当操作超出内存范围时触发。

  • NameError:名称异常,在局部或者全局中无法找到文件名称时触发。

  • OSError:当一个系统函数返回一个系统相关的错误时触发。

  • ReferenceError:引用异常,当底层的对象被销毁后访问时触发。

  • RuntimeError:包含其他分类中没有被包括进去的一般错误。

  • SyntaxError:编译器的内部错误。

  • TypeError:类型异常,当操作或者函数应用到不合适的类型时触发。

  • ValueError:值异常,当操作或者函数的类型正确,但是值不正确时触发。

  • Warning:警告。

 5.1 try...except.....

try:
    <语句块1>
except:
    <语句块2>
    
# 语句块1是正常执行的程序内容, 当执行这个语句块发生异常时, 则执行except保留字后面的语句块2。    
# 如果在except子句后将异常类型设置为exception,异常处理程序将捕获除了程序中断外的所有异常。因为excetion类是其他异常类的基类。
try:
    open('hello.text','r')
except:      # 异常时,给出的提示
    print('hello.text文件不存在')

5.2 捕获具体的异常

# 捕获具体的异常:
try:
    open('hello.text','r')
except FileNotFoundErrorr:      # 只要FileNotFoundErrorr类的异常时,才会给出来的提示
    print('hello.text文件不存在')
except:                         # 除了FileNotFoundErrorr类的异常时,报出来的错误
    print('程序错误')    

5.3 try...except...else....

try:
    result = 10/0
except ZeroDivisionError:       # 只要FileNotFoundErrorr类的异常时,才会给出来的提示
    print('0不能被整除')
except:                         # 除了FileNotFoundErrorr类的异常时,报出来的错误
    print('程序错误')   
else:                           # 若没有触发异常则执行以下代码
    print(result)

5.4 嵌套异常

try:
    s = 'hello'
    b = 'world'
    try:                       # 嵌套异常
        print(s - b)
    except:
        print('字符串不支持减法运算')
except:                       # 如果外层语句执行错误,则内层语句将不执行
    print('异常')

5.5 try...findally.....

# finally子句的作用:无论异常是否发生,finally子句都会被执行。finally子句通常用于关闭因异常而不能释放的系统资源。每一个try语句都必须有一个except子句和finally子句与之对应。

try:
    s = 'hello'
    b = 'world'
    try:
        print(s - b)
    except:
        print('字符串不支持减法运算')
except:
    print('异常')
finally:                         # 无论是否异常,都执行
    print(s + b)

5.6 使用raise抛出自定义异常

# 当程序中出现错误时,python会自动引发异常,也可以通过raise语句显示的引发异常。但是执行了raise语句,raise语句后的代码将不能被执行。

try:
    s = None
    if s is None:
        print('s是空对象')
        raise NameError
except TypeError:
    print('异常')

5.7 自定义异常

# 自定义异常必须继承Exception类,自定义异常按照命名规范以Error结尾。自定义异常使用raise语句引发,而且只能通过手工发生触发。

from __future__ import division

class DivisionException(Exception):             # 自定义异常
    def __init__(self, x, y):
        Exception.__init__(self, x, y)
        self.x = x
        self.y = y

if __name__ == '__main__':
    try:
        x = 3
        y = 4
        if x % y > 0:
            print(x / y)
            raise DivisionException(x, y)
    except DivisionException as div:            # 抛出异常
        print('异常DivisionException:x / y = %.2f' % (div.x / div.y))

5.8 assert(断言)

t = 'hello'
assert len(t) >= 2                            # 条件为True,不抛出异常
assert len(t) == 1                            # 条件为False,断言失败,抛出异常。

6.案例

import random
target = random.randint(1,1000)
count = 0
while True:
    try:
        guess = eval(input('请输入一个猜测的整数(1至1000): '))
    except:
        print('输入有误, 请重试, 不计入猜测次数哦! ')
        continue
    count = count + 1
    if guess > target:
        print('猜大了')
    elif guess < target:
        print('猜小了')
    else:
        print('猜对了')
        break
print("此轮的猜测次数是:", count)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!