流程控制

流程控制理论

流程控制:
	控制事物的执行流程
    
事物的控制流程可以分为三种:
	顺序结构
    分支结构
    循环结构
    
ps:我们用到的最多的时分支结构和循环结构 很重要
	在代码世界里 很多时候会出现三者结合

image

流程控制必备知识

1.python中使用代码的缩进来表示从属关系 (一般是4个空格 也可以用tab键)
	从属关系:所进的代码(子代码)是否执行 取决于上面没有所进的代码(父代码)
2.并不是所有的关键字都能拥有缩进的子代码
	if 关键字
3.如果多个子代码属于同一个父代码 那么这些子代码的缩进需要一样
4.当某一行代码需要编写子代码的时候 这一行的末尾一定要写冒号
5.相同缩进量的代码没有主次之分 按照顺序 自上而下执行

分支结构

1.单if分支结构

if 条件:
	条件成立之后才会执行的代码
    
eg:
	name = input('请输入您的姓名:')
	if name == 'joyce':
    	print('姐姐好')
    '''
    判断获取用户输入的name是不是等于joyce 
    如果等于joyce就打印’姐姐好‘
    '''

2.if...else分支

if 条件:
	条件成立才会执行的代码
else:
	条件不成立执行的代码
    
eg:
	name = input('请输入您的姓名:')
    if name == 'joyce':
        print('姐姐好')
    else:
        print('你是谁')
    '''
    判断获取用户输入的name是不是joyce 
    如果是joyce就打印’姐姐好‘
    如果不是joyce就打印’你是谁‘
    '''

image

3.if..elif..else

if 条件1:
	条件1成立执行的代码
elif 条件2:
	条件1不成立 条件2成立执行的代码
else:
	条件1 条件2都不成立执行的代码
    
eg:
	name = input('请输入您的姓名:')
    if name == 'joyce':
        print('姐姐好')
    elif name == 'jason':
        print('哥哥好')
    else:
        print('你是谁')
    '''
    判断获取用户输入的name是不是joyce 
    如果是joyce就打印’姐姐好‘
    如果是Jason就打印’哥哥好‘
    如果两个都不是就打印’你是谁‘
    '''

三个一起的使用的时候永远只会走一个分支

elif可以写多个

elif和else不能单独使用 必须结合if

image

4.if的嵌套

if 条件1:
	条件1成立后执行的代码
	if 条件2:
    	条件2成立后执行的代码
    	if 条件3:
        	条件3成立后执行的代码
        else:
        	条件3不成立执行的代码
     else:
    	条件2不成立执行的代码
else:
	条件1不成立执行的代码
    
''' if 后面可以继续跟if 最后补elif 但是要注意 缩进是否与父代码一样'''
        	

image

循环结构

1.while循环

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

image

结束循环体代码的两种方式

1.利用技术其固定循环次数

#循环打印5次“你好”

count = 1
while count < 6:
    print('你好')
    count += 1
    
'''
设置循环条件 count小于6的时候 执行打印‘你好’
每打印一次‘你好’ count+1 回到条件判断处
第二次循环开始时 count = 2 继续判断你条件是否成立
直到 count = 6是 结束循环
'''

2.在循环体内添加关键字强制结束

break

#循环打印1-10,打印到5结束打印

count = 1  #定义计数器
while count < 11:  #循环打印次数为10
    print(count)  #打印计数器
    count += 1  #计数器自增1
    if count == 6:  #当计数器等于6时
        break  #强制结束循环
#结果为:1 2 3 4 5

'''
定义计数器
循环打印次数为10
打印计数器
计数器自增1
计数器小于6不执行if判断 返回开始的条件判断处继续执行代码
count = 6时 执行if判断里的代码 break 强制结束
'''

continue

#循环打印1-5,到3跳过并继续打印

count = 1  #定义计数器
while count < 6:  #循环打印次数为5
    print(count)  #打印计数器
    count += 1  #计数器自增1
    if count == 3:  #当计数器=3时
        count += 1  #计数器自增1
        continue  #结束本次循环开始下一次循环
#结果为:1 2 4 5
'''
定义计数器
循环打印次数为5
打印计数器
计数器自增1
计数器不等于3不执行if判断 返回开始的条件判断处继续执行代码
count = 3时 执行if判断里的代码 continue 跳过本次循环 直接开始下一次循环
'''

else

循环体代码没有被break强制结束的话 循环体代码全都执行完毕就会执行else子代码

count = 1
while count < 6:
    print(count)
    count += 1
else:
    print('循环体代码全部执行完且没有被break!则执行else')
#结果为: 1 2 3 4 5 循环体代码全部执行完且没有被break!则执行else

死循环

死循环就是让程序无限执行某个代码文件 此时cpu使用率会持续上升 直到满负荷重启代码中不允许出现死循环

count = 10
while True:
    count *= 100 # 计算机会循环执行*=100的结果值

循环的嵌套及全局标志位

1.一个break只能结束当前所在的那一层的循环

2.想一次性结束所有的循环就要有几个while 写几个break 注意break的位置一般是和while对应的

当while循环内嵌套了多个while循环时可以使用全局标志位

while True:
    print(111)
    while True:
        print(222)
        while True:
            print(333)
#以上循环嵌套当我想结束所有while循环时需要给各个while循环内加break结束所有循环,这样做效率太低且当循环体代码较多时加break时易分不清加在哪里!

is_flag = True
while is_flag:
    print(111)
    while is_flag:
        print(222)
        while is_flag:
            print(333)
            is_flag = False
'''
只需要添加一个全局标志位,且在最内层把该标志位的True
当所有代码执行完毕时 最下面的全局标志位改位false
即可实现结束内外所有循环。
'''

2.for循环

一般for循环可以实现的代码while都可以实现 区别在于for循环在做遍历取值的时候比while要方便

for 变量名 in 待遍历的数据:
	循环体代码
'''
从待遍历的数据中取出一个值给变量名 从上到下执行循环体代码 然后回到for开头在取第二次 直到把代编里的数据都取完
'''

1.while与for循环对比

​ 循环打印列表中的数据值

l1 = [1,2,3,4]

#while
count = 0
while count < 4:
    print(l1[count])
    count += 1
'while需数出来列表中有几个数据值 然后定义计数器 循环条件小于数据值的数量 用列表索引取值每循环一次索引值自增1'
'当列表中数据值较多时while使用会非常不方便!'

#for
for i in l1:
    print(i)
'for循环的变量名i会从给到他的数据值中从左到右依次赋值循环,直到没有数据值可给时自动结束(不需要给结束条件)。'

2.for循环的另一种用法

for i in 1,2,3:
    print('z')
#结果为:打印了三行‘z’

'''
由此可以看出 待遍历的数据可以有多个 相当于循环的次数
如果是列表 则是列表中有多少数据值就会循环几次
如果打印的是变量名 结果就是待遍历的数据值
如果打印的是其他数据值 结果就是循环打印几次该数据值
'''

3.for循环支持遍历[取值]的数据类型

常见的有字符串、列表、字典、元组、集合

遍历字符串时打印出来的是单个的字符 且空字符也算一个字符

遍历字典的时候只有k参与 

4.for结束循环体的方式

for+break

强制结束当前所在的循环体代码

#循环打印1-10,打印到5结束打印

for i in range(1, 11):
    print(i)
    if i == 5:
        break
#结果为:1 2 3 4 5 各一行
'在想要强制结束之前也要设置结束条件  需注意打印位置的不同 产生的结果也不同 需了解执行流程才好判断'

for +continue

当执行到continue时结束本次循环 并回到循环体条件判断出开始下一次循环

#循环打印1-5,到3跳过并继续打印

for i in range(1,6):
    if i==3:
        continue
    print(i)
#结果为:1 2 4 5 各一行
'需注意打印位置的不同 产生的结果也不同 需了解执行流程才好判断'

for+else

循环体代码没有被break强制结束 循环体代码全部执行完就会执行else子代码

count = 1
for i in range(3):
    print(i)
else:
    print('循环体代码全部执行完且没有被break!则执行else')
#结果为:0 1 2 循环体代码全部执行完且没有被break!则执行else 各一行

5.range方法

range可以理解为快速产生一个包含多个整数的列表 (产生整数的大工厂)

1)括号内只有一个数字,那就是从0到4结束(顾头不顾尾)
  for i in range(5): 
    print(i)
    #结果为:0 1 2 3 4 各一行
2)括号内有两个数字,第一个就是起始位置,第二个就是终止位置(顾头不顾尾)
  for i in range(1,5): 
    print(i)
    #结果为:1 2 3 4 各一行
3)括号内有三个数字,第一个是起始位置,第二个是终止位置,第三个是等差值(间隔)。同样顾头不顾尾
  for i in range(1,10,3):
    print(i)
    #结果为:1 4 7 各一行

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.在网址里面有规律
	2.内部js文件动态加载
'''
尝试编写代码产生博客园文章前两百页的网址:
a='https://www.cnblogs.com/#p%s'
for i in range(1,201):
    print(a % i)