python之流程控制

python之流程控制

控制流程(也称为流程控制)是计算机运算领域的用语,意指在程序运行时,个别的指令(或是陈述、子程序)运行或求值的顺序。不论是在声明式编程语言或是函数编程语言中,都有类似的概念

流程控制理论

流程控制即控制事务执行的流程,在编程中,意味着控制程序运行的流程,大致可以分为顺序结构、分支结构以及循环结构三种

  1. 顺序结构

顺序结构即按自上而下的顺序执行,在此之前,我们编写的代码几乎都是顺序结构

graph TD A(输入)-->B(命令一) B-->C(命令二) C-->D(命令三) D-->E(输出)
  1. 分支结构

在分支结构中,执行流程会在不同的条件下给出不同的执行策略

graph TD A(输入)-->B(命令一) B-->C(条件一) B-->D(条件二) D-->E(命令三) C-->F(命令二) E-->|输出|G(结果一) F-->|输出|H(结果二)
  1. 循环结构

在循环结构中,执行时会根据某一条件不断重复其中一个环节

graph TD A(输入)-->B(命令一) B-->C(条件一) C-->|重复执行|B

流程控制必备知识

  1. python中使用代码的缩进来表示代码的从属关系
    从属关系:缩进的代码被称为子代码,是否执行子代码取决于上面的父代码(没有进行缩进的代码)
  2. 并不是所有的代码都可以拥有缩进的子代码,只有特定的一些关键字才有子代码,例如if、while、elif等
  3. 当出现多行子代码从属于同一个父代码, 那么这些子代码需要保证相同的缩进量
  4. 在python中对缩进量没有具体要求,但是一般情况下推荐使用四个空格(键盘上的tab键刚好是四个空格)
  5. 当某一行代码需要编写子代码的时候,那么这一行代码的结尾肯定需要冒号
  6. 相同缩进量的代码彼此之间平起平坐 按照顺序结构依次执行

分支结构

1.单if分支结构

if +执行条件+:
    条件成立后才会执行的代码块
示例:
     username = input('username>>>:')
	 if username == '李帆':
	     print('你好')

流程图

graph TD A(输入'username')-->B(条件username=='李帆') B-->|符合条件|C(输出'你好') B-->|不符合条件|D(不执行任何操作)

2.if...else...分支结构

if 条件:
	条件成立之后执行的子代码
else:
	条件不成立执行的子代码
示例:
 	 username = input('username>>>:')
    if username == '李帆':
        print('你好')
    else:
        print('认错人了')

流程图

graph TD A(输入'username')-->B(条件username=='李帆') B-->|符合条件|C(输出'你好') B-->|不符合条件|D(输出'认错人了')

3.if...elif...else...分支结构

if 条件1:
	条件1成立之后执行的子代码
elif 条件2:
	条件1不成立 条件2成立执行的子代码
elif 条件3:
	条件1和2都不成立 条件3成立执行的子代码
else:
    上述条件都不成立 执行的子代码
PS:中间的elif可以写多个,但上述子代码永远只会执行一个
示例:
    score = input('请输入学生成绩>>>:')
    score = int(score)  # 将字符串的整数转换成整型的整数
    if score >= 90:
        print('优秀')
    elif score >= 80:
        print('良好')
    elif score >= 70:
        print('一般')
    elif score >= 60:
        print('及格')
    else:
        print('挂科')

流程图

graph TD A(输入学生成绩)-->B(命令1:将字符串转化为整型) B-->C(条件1:成绩>=90) C-->|符合条件1|1(输出'优秀') C-->|不符合条件1|D(条件2:成绩>=80) D-->|符合条件2|2(输出'良好') D-->|不符合条件1.2|E(条件3:成绩>=70) E-->|符合条件3|3(输出'一般') E-->|不符合条件1.2.3|F(条件4:成绩>=60) F-->|符合条件4|4(输出'及格') F-->|不符合条件1.2.3.4|G(输出'挂科')

4.⭐if的嵌套使用

    age = 28
    height = 170
    weight = 110
    is_beautiful = True
    is_success = False
    username = 'tony'
    if username == 'tony':
        print('tony发现目标')
        if age < 30 and height > 160 and weight < 150 and is_beautiful:
            print('大妹纸 手机掏出来 让我加微信')
            if is_success:
                print('吃饭 看电影 天黑了...')
            else:
                print('去你妹的 流氓!!!')
        else:
            print('不好意思 认错人了')
    else:
        print('不是tony做不出来这件事')

当if语句嵌套使用时,执行的流程与一般的执行流程一样,但是代码的写法与普通的if语句不同,每一段if语句与下一段if语句要以从属关系写出,当符合条件时输出结果,但是当不符合条件时,else语句需要以相逆的顺序进行编写

流程图

第一段

graph TD A(if username == 'tony':) A1(输出'tony发现目标') A-->|符合条件|A1 A2('去你妹的 流氓!!!') A-->|else:不符合条件|A2

第二段

graph TD B(if age < 30 and height > 160 and weight < 150 and is_beautiful) B1(大妹纸 手机掏出来 让我加微信) B2(输出'不好意思 认错人了) B-->|符合条件|B1 B-->|else:不符合条件|B2

第三段

graph TD C(if is_success) C1(输出'吃饭 看电影 天黑了...'') C2(输出'不是tony做不出来这件事') C-->|符合条件|C1 C-->|else:不符合条件|C2

循环结构

while循环

循环结构是为了在我们需要的时候让一些代码反复执行

while 条件:	
	条件成立之后执行的子代码(循环体代码)
1.先判断条件是否成立
2.如果成立则执行循环体代码
3.循环体代码执行完毕后再次回到条件判断处 判断条件是否成立
4.如果成立 则继续执行循环体代码
5.按照上述规律依次执行 直到条件不成立才会结束循环体代码的执行

# count = 1
# while count < 5:
#     print('hello world')
#     count += 1  # count = count + 1
# print('想不想干饭?')

break  # 强行结束循环体
	while循环体代码一旦执行到break会直接结束循环
continue  # 直接跳到条件判断处
	while循环体代码一旦执行到continue会结束本次循环 开始下一次循环
    
 
while 条件:
    循环体代码
else:
    循环体代码没有被强制结束的情况下 执行完毕就会执行else子代码

while循环结构流程图

graph TD 输入数据-->判断条件 判断条件--->|达成判断条件|反复输出数据

while循环结构流程图(加入执行命令)

graph TD A(输入数据)-->B(判断条件) B--->|符合判断条件|C(执行操作命令) C-->|重复执行|B B-->|不符合判断条件|D(执行输出命令)

while循环结构流程图(加入break命令)

graph TD A(输入数据)-->B(判断条件) B--->|符合判断条件|C(执行操作命令) C-->|重复执行|B C-.->D(break命令) D-.->|停止所有操作|B

while循环结构流程图(加入continue命令)

graph TD A(输入数据)-->B(判断条件) B--->|符合判断条件|C(执行操作命令) C-->|重复执行|B D(continue命令) C-.->D D-.->|跳过此次循环并进入下一次循环|B

while循环结构流程图(与else一同使用)

graph TD A(输入数据)-->B(判断条件) B--->|符合判断条件|C(执行操作命令) C-->|重复执行|B B-.->|不符合判断条件|D(执行else子代码) D-.->E(输出结果)

关于while循环的补充说明

  1. 关于死循环

当我们在程序编写过程中,使用while语句执行的命令是一个带有较为复杂的计算的代码,当while语句无限循环执行该代码时,就会造成内存消耗的急剧增加,会逐渐超出计算机的极限,计算机就会采取紧急措施,例如重启、关机等,这样的循环我们称之为死循环,而在编程过程中,我们应当尽量避免死循环的出现,即使死循环出现,我们也应当尽量避免死循环的长时间运行

  1. 关于嵌套以及全局标志位

当while语句嵌套使用时,我们需要输入多个break指令来停止相应的循环

   while Ture:
        username = input('username>>>:')
        password = input('password>>>:')
        if username == 'jason' and password == '123':
            while Ture:
                cmd = input('请输入您的指令>>>:')
                if cmd == 'q':
                    break
                print('正在执行您的指令:%s' % cmd)
            break
        else:
            print('用户名或密码错误')
graph TD A(while Ture)-->|符合条件开始循环|B(输入用户名与密码) B-->|用户名输入正确|C(进入二级循环) B-->|用户名输入不正确|D(输出用户名或密码错误) D-->|重复循环|B C-->|符合条件开始循环|E(输入指令) E-->|输入指令为q|F(break命令) F-.->|中止循环|E E-->|输入指令不为q|G(输出正在执行指令) G-.->H(break命令) H-.->|中止循环|B

当while循环嵌套使用时,每一层的循环都需要一个break指令来中止

is_flag = True
   while is_flag:
        username = input('username>>>:')
        password = input('password>>>:')
        if username == 'jason' and password == '123':
            while is_flag:
                cmd = input('请输入您的指令>>>:')
                if cmd == 'q':
                    is_flag = False
                print('正在执行您的指令:%s' % cmd)
        else:
            print('用户名或密码错误')
graph TD I(定义全局标志位is_flag = True) I-->A A(while is_flag)-->|符合条件开始循环|B(输入用户名与密码) B-->|用户名输入正确|C(二级循环while is_flag) B-->|用户名输入不正确|D(输出用户名或密码错误) D-->|重复循环|B C-->|符合条件开始循环|E(输入指令) E-->|输入指令为q|F(改变Ture为False) F-.->|中止循环|A F-.->|终止循环|C

当我们将Ture用变量名绑定后,在进入第二层嵌套循环时,使用变量名将Ture的值改变为False,那么将循环进行到这里之后,所有的循环都会被中止,这种方式就是全局标志位

for循环

for循环主要使用场景为遍历,可以通俗地理解为将一个可以存储多个数据的数据类型中的数据值分别取出,for循环的功能while循环也可以做得到,但是在这种情况下,for循环显得更为简便

for循环语法结构
for 变量名 in 待遍历的数据:
 		  for循环体代码
示例:
name_list = ['jason', 'kevin', 'tony', 'oscar']
while循环
     count = 0
     while count < 4:
         print(name_list[count])
         count += 1
# while循环的操作比较繁琐,且需要提前确认好数据值的个数,不然索引的个数超出实际数目后会报错
for循环
    for i in name_list:
        print(i)
# 而for循环的操作会更加简便,这是因为for循环更加擅长数据的遍历,小到字符串,大到字典都可以使用,但是在对字典使用时,遍历的只有字典中的K
# for循环最大的特点在于遍历到所有的数据后就会自动停止,不需要输入break指令来终止

PS: for循环中变量名的使用也要尽量做到见名知意,一眼就能看出遍历出的数据的用途或含义,如果这些数据确实没有什么实际意义的话,可以采用i、j、v、k、item来进行命名

for循环在遇到break指令、continue指令时以及与else语句一同使用时,与其他循环结构相同

range方法

range可以简单的理解为是帮我们产生一个内部含有多个数字的数据

for i in range(101): 
    print(i)  
    # range的默认起始位置为0
for i in range(10, 20): 
    print(i)
    # range可以自定义起始位置和结束位置
for i in range(1, 20, 2):
    print(i)
    # 当range后的括号内有三个数字时,第一个数字为起始位置,第二个数字为结束位置,第三个数字是等差值,这样的情况下输出结果为一个等差数列,当这个差值在不输入的情况下默认为1

在不同的python版本中,range的表示方法不同,作用也不同

  • python2中
  1. python2中的range:会将得到的结果逐一列出,类似于工厂中将所有的货物一起生产出来,集中存放在庞大的仓库中
  2. python中的xrange:与python3中的range效果相同
  • python3中

python3中的range会将结果输出为(起始位置,结束位置)的形式,就像在内存中建立了一座工厂,当我们需要其中某个数据时,收到请求后临时制作并输出

range实训演练

网络爬虫
	使用代码爬取网络上我们需要的数据
项目需求
	爬取所有页面的数据(博客园)
找寻规律
	https://www.cnblogs.com/
 	https://www.cnblogs.com/#p2
 	https://www.cnblogs.com/#p3
 	https://www.cnblogs.com/#p4
	
 	大胆猜测:第一页是 https://www.cnblogs.com/#p1
编写代码产生博客园文章前两百页的网址
 
    1.先定义网址的模板
base_url = 'https://www.cnblogs.com/#p%s'
for i in range(1, 201):
    print(base_url % i)
    2.通过代码朝上述的网址发送请求获取页面数据
posted @ 2022-09-27 19:46  逐风若梦  阅读(190)  评论(0编辑  收藏  举报