Learn_Python_流程控制10

一.流程控制的概述

1996年,计算机科学家证明了这样的事实:任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成

顺序结构:程序从上到下顺序地执行代码,中间没有任何判断和跳转,直到程序结束。

选择结构:程序根据判断条件的布尔值选择性执行部分代码。

循环结构:程序根据循环条件反复执行某段代码,直到不满足循环条件为止。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi.jpg', width=300, height=150)

二.顺序结构

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi1.jpg', width=100, height=50)

三.选择结构的概述

Python语言提供的实现选择结构的语句是if语句

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi2.jpg', width=200, height=100)

四.代码块的缩进

代码块是一种相关语句的集合

在有的编程语言中,代码块开始和结束语某个特殊字符,比如:以{开始,}结束。

在Python中,代码块开始于冒号,代码块中的所有行(不包括自代码块)都要缩进相同数量的空格,通常缩进4个空格。

不要忘记缩进,也不要添加不必要的缩进。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi3.jpg', width=200, height=100)
#   下图中有3个代码块

五.if 语句

if语句的语法格式:

if 判断条件:

    条件执行体

其中条件执行体对应的代码块必须缩进。



if语句执行流程:

如果判断条件的布尔值为TTrue,执行条件执行体对应的代码块,执行完之后继续执行if语句后面的代码;

否则,不会执行条件执行体对应的代码块,而是直接执行if语句后面的代码。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi4.jpg', width=200, height=100)

score = 88
if score >= 60:
    print('及格了')
及格了

    可以在if语句的后面添加else从句,其语法格式为:

if 判断条件:

    条件执行体1

else:

    条件执行体2



添加else从句后的执行流程:

如果判断条件的布尔值为True,执行条件执行体1对应的代码块,执行完之后继续执行if语句后面的代码;否则,执行条件执行体2对应的代码块,执行完之后继续执行if语句后面的代码。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi5.jpg', width=200, height=100)
score = 88
if score >= 60:
    print('及格了')
else:
    print('没及格')
及格了

如果if语句存在两个以上的分支,可以在if语句中添加若干个elif从句(elif是else if的简写),

其语法格式为:

if 判断条件1:

    条件执行体1

elif 判断条件2:

    条件执行体2

elif 判断条件3:

    条件执行体3

……

elif 判断条件n-1:

    条件执行体n-1

【else:

    条件执行体n】

其中,else从句是可选的。



添加elif从句后的执行流程:

如果判断条件1的布尔值为True,执行条件执行体1对应的代码块,执行完之后继续执行if语句后面的代码;

否则,执行条件执行体2对应的代码块,执行完之后继续执行if语句后面的代码;

否则,执行条件执行体3对应的代码块,执行完之后继续执行if语句后面的代码;

……

否则,执行条件执行体n-1对应的代码块,执行完之后继续执行if语句后面的代码;

【否则,执行条件执行体n对应的代码块,执行完之后继续执行if语句后面的代码.】

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi6.jpg', width=300, height=150)
score = 88
if score < 60:
    print('没及格')
elif score < 70:
    print('及格')
elif score < 80:
    print('良好')
else:
    print('优秀')
优秀

上面的代码等价于:

score = 88
if score < 60:
    print('没及格')
else:
    if score < 70:
        print('及格')
    else:
        if score < 80:
            print('良好')
        else:
            print('优秀')  #但这种嵌套if else可读性比较差,建议用前面的。
优秀

六.对象的布尔值

所有的对象都有一个布尔值,可以调用内置函数bool(类bool的构造方法)得到对象的布尔值。

以下对象的布尔值为False:False、数值零、None、空字符串、空列表、空元组、空字典、空集合。

所有对象都可被直接用作布尔值,解释器会自动调用内置函数bool进行转换。

if 18:
    print(18,True)
18 True
if 'Python':
    print('Python',True)
Python True

七.条件表达式

条件表达式是包含if-else语句的表达式,它类似于C语言中的三目条件运算符。



条件表达式的语法格式:

x if 判断条件 else y

对应的运算规则:

如果判断条件的布尔值为True,条件表达式的返回值为x;否则,条件表达式的返回值为y。

score = 88
result = '及格了' if score >= 60 else '没及格'
print(result)
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi7.jpg', width=300, height=150)
及格了

以上代码相当于:

if score >= 60:
    result = '及格了'
else:
    result = '没及格'
print(result)
及格了

在一个条件表达式内可以嵌套另一个条件表达式。

a = 6
b = 8
print('a大于b' if a > b else('a小于b' if a < b else 'a等于b'))
a小于b

八.循环结构的概述

1.为什么需要循环结构

如果要打印1到10之间的所有自然数,你可能会这样实现:

print(1)……print(1000)

如果要打印1到1000之间的所有自然数,你就要写1000行代码,而且这1000行代码都是重复的print语句,唯一的区别在于要打印的自然数不同。

2.什么是循环结构

使用循环结构,上面的需求可以这样实现:

i = 1

while i < 11:

    print(i)

    i += 1

或者这样实现:

for i in range(1,11):

    print(i)

代码量小了很多,而且没有重复的代码。

循环结构指的是:程序根据循环条件反复执行某段代码,直到不满足循环条件为止。

Python提供了两种实现循环结构的语句:while语句和for-in语句。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi8.jpg', width=300, height=150)

九.while语句

while语句的语法格式:

初始化部分

while 循环条件:

    循环体

其中,循环体对应的代码块必须缩进。

初始化部分:用于设置循环的初始条件,比如循环控制变量的初始值。

循环条件:每次循环都要判断循环条件的布尔值,以决定继续循环还是终止循环。循环条件中通常包含循环控制变量。

循环体:这是循环操作的主体内容,可以是一条语句,也可以是多条语句。循环体中的某些语句用于改变循环控制变量的值,从而改变循环条件的布尔值。

while语句的执行流程:

执行完一次初始化部分之后,反复判断循环条件的布尔值:

如果循环条件的布尔值为False,则终止循环;

如果循环条件的布尔值为True,则执行循环体,执行完循环体后再次判断循环条件的布尔值。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi9.jpg', width=300, height=150)
i = 1
while i < 11:
    print(i)
    i += 1
1
2
3
4
5
6
7
8
9
10

应该确保让循环条件的布尔值在某一时刻为False,以避免while语句陷入死循环(无限循环)

有时候循环条件可能不太容易确定,需要在循环体中才能决定是否要退出循环,在这种情况下,可以使用while-True-break结构,也就是说,通过while True构造一个无限循环,在循环体中满足某个条件时通过break退出循环。

while True:
    word = input('请输入一个单词:')
    if not word: break
    print('输入的单词是:', word)  # ctrl + enter 结束输入
请输入一个单词:Python
输入的单词是: Python
请输入一个单词:GG
输入的单词是: GG
请输入一个单词:

十.for-in语句

1.什么是for-in语句

for-in语句专门用于遍历序列、字典和集合等类型的对象。

其中,遍历指的是:把对象的所有元素依次访问一遍。每访问一个元素,称之为一次迭代。因此,可以使用for-in语句遍历的对象又被称为可迭代对象。



for-in语句的语法格式:

for自定义的变量in要遍历的可迭代对象:
    循环体

其中,循环体对应的代码块必须要缩进。

如果循环体内不需要访问自定义的变量,可以将自定义的变量替代为下划线_ 。

for-in语句的执行流程:

反复判断是否遍历完可迭代对象中的所有元素:

如果已遍历完可迭代对象中的所有元素,则终止循环;

如果没有遍历完可迭代对象中的所有元素,则自定义的变量自动赋予当前被赋予当前迭代的元素值,然后执行循环体,执行完循环体后再次判断是否遍历完可迭代对象的所有元素。



当迭代次数已知时,推荐使用for-in语句;当迭代次数未知时,推荐使用while语句。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi10.jpg', width=300, height=150)
2.使用for-in语句遍历range、列表、元组和字符串等序列
for number in range(1,4):
    print(number)
1
2
3
for _ in range(1,4):
    print('Hello')
Hello
Hello
Hello
for number in [1,2,3]:
    print(number)
1
2
3
for number in (1,2,3):
    print(number)
1
2
3
for char in '123':
    print(char)
1
2
3

在遍历序列的过程中,如果需要对序列进行修改,最好先通过切片操作生成一份序列的拷贝。

words = ['Java','Python','Kotlin','Swift','Go']
for word in words[:]:      #先拷贝words进行备份
    if len(word) < 5:
        words.remove(word)
print(words)
['Python', 'Kotlin', 'Swift']
3.使用for-in语句遍历集合和字典
s = {2,3,1}
for number in s:
    print(number)
for number in sorted(s):
    print(number)
1
2
3
1
2
3
d = {'Fruits': 86,'Books': 88,'Videos': 83}
# "自定义的变量自动赋予当前被赋予当前迭代的元素值"中的"元素值"指的是字典的key
for elem in d: 
    print(elem)
for key in d.keys():  #只访问key
    print(key)
for value in d.values():  #只访问value
    print(value)
for key,valude in d.items():   #访问整个字典(key 和 value)
    print(key,'->',value)
Fruits
Books
Videos
Fruits
Books
Videos
86
88
83
Fruits -> 83
Books -> 83
Videos -> 83

十一.带索引的序列遍历

如果在遍历序列的过程中需要访问元素的索引,有以下几种实现方式:

1.第1种实现方式
L = ['Java','Python','Kotlin','Swift','Go']
index = 0
for item in L:
    print('L[{}] = {}'.format(index,item))
    index += 1
L[0] = Java
L[1] = Python
L[2] = Kotlin
L[3] = Swift
L[4] = Go
2.第2种实现方式
for index in range(len(L)):
    print('L[{}] = {}'.format(index,L[index]))
L[0] = Java
L[1] = Python
L[2] = Kotlin
L[3] = Swift
L[4] = Go
第3种实现方式
index = 0
while index < len(L):
    print('L[{}] = {}'.format(index,L[index]))
    index += 1
L[0] = Java
L[1] = Python
L[2] = Kotlin
L[3] = Swift
L[4] = Go
第4种实现方式

可以调用内置函数enumerate(类enumerate的构造方法)将要遍历的序列转换为enumerate对象。

print(enumerate(L))
<enumerate object at 0x000001F14600BBD0>
# 为了清楚地表示返回enumerate对象所表示地内容,可以将enumerate对象转换成列表
print(list(enumerate(L)))
[(0, 'Java'), (1, 'Python'), (2, 'Kotlin'), (3, 'Swift'), (4, 'Go')]
#  调用内置函数enumerate时,可以通过第二个参数指定索引地起始值
print(list(enumerate(L,1)))
[(1, 'Java'), (2, 'Python'), (3, 'Kotlin'), (4, 'Swift'), (5, 'Go')]

既可以遍历enumerate对象转换后的列表,也可以直接遍历enumerate对象。

for index,item in list(enumerate(L)):
    print('L[{}] = {}'.format(index,item))
L[0] = Java
L[1] = Python
L[2] = Kotlin
L[3] = Swift
L[4] = Go
for index,item in enumerate(L):
    print('L[{}] = {}'.format(index,item))
L[0] = Java
L[1] = Python
L[2] = Kotlin
L[3] = Swift
L[4] = Go

十二.循环语句中的break-else语句

在执行while语句或for-in语句时,如果循环正常结束,也就是说,如果没有执行循环体中的break语句从而提前退出循环,有时可能想在循环正常结束后执行某些操作。

为了判断循环是否正常结束,可以使用一个布尔变量,在循环开始前将布尔变量的值设置为False,如果执行了循环体中的break语句从而提前退出循环,那就将布尔变量的值设置为True.

最后,在while语句或for-in语句的后面使用if语句判断布尔变量的值,以判断循环是否是正常结束的。

isBreak = False
n = 0
while n < 5:
    if n == 6:
        isBreak = True
        break
    n += 1
if not isBreak:
    print('循环正常结束,没有执行循环体中的break语句')
循环正常结束,没有执行循环体中的break语句
isBreak = False
for n in range(5):
    if n == 6:
        isBreak = True
        break
if not isBreak:
    print('循环正常结束,没有执行循环体中的break语句')
循环正常结束,没有执行循环体中的break语句

上述的解决方案还有更好的替代。Python为循环语句提供了break-else结构,也就是说,可以在while语句或for-in语句的后面添加else从句,这样,如果没有执行循环体中的break语句从而提前退出循环,就会执行else从句。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi11.jpg', width=200, height=100)
n = 0
while n < 5:
    if n == 6:
        break
    n += 1
else:
    print('循环正常结束,没有执行循环体中的break语句')
循环正常结束,没有执行循环体中的break语句
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi12.jpg', width=300, height=150)
for n in range(5):
    if n == 6:
        break
else:
    print('循环正常结束,没有执行循环体中的break语句')
循环正常结束,没有执行循环体中的break语句

十三.循环语句中的break和continue

在while语句或for-in语句的循环体中,除了可以使用break语句之外,还可以使用contune语句,两者的区别在于:

break表示“断路”,用于结束整个循环;

continue表示“短路”,用于结束整个循环中的当前迭代,继续下一个迭代。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi13.jpg', width=300, height=150)
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi14.jpg', width=300, height=150)
for i in range(1,5):
    if i == 3:
        break
    print('i = ',i)
i =  1
i =  2
for i in range(1,5):
    if i == 3:
        continue
    print('i = ',i)
i =  1
i =  2
i =  4

在嵌套的循环语句中,break和continue默认作用域当前循环。

from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi15.jpg', width=300, height=150)
for i in range(1,4):
    for j in range(1,4):
        if i == j:
            break
        print('i = ',i,'j = ',j)
i =  2 j =  1
i =  3 j =  1
i =  3 j =  2
for i in range(1,4):
    for j in range(1,4):
        if i == j:
            continue
        print('i = ',i,'j = ',j)
i =  1 j =  2
i =  1 j =  3
i =  2 j =  1
i =  2 j =  3
i =  3 j =  1
i =  3 j =  2

十四.并行遍历

有时可能需要同时遍历多个迭代对象,也就是并行遍历。例如:列表names中存放姓名,列表ages中存放对应的年龄。如果想同时遍历这两个列表,打印出所有的姓名及对应的年龄,可以这样实现:

names = ['Jack','Mike','Tom']
ages = [16,32,43]
for i in range(len(names)):
    print(names[i],'的年龄是:',ages[i])
Jack 的年龄是: 16
Mike 的年龄是: 32
Tom 的年龄是: 43

上述的解决方案有更好的替代。如果需要同时遍历多个迭代对象,可以调用内置函数zip(类zip的构造方法)将多个可迭代的对象打包压缩成zip对象。

print(zip(names,ages))
<zip object at 0x00000156BE471508>
# 列表中的元素都是元组,元组中的第i个元素来自调用zip时的第i个参数。
print(list(zip(names,ages)))
[('Jack', 16), ('Mike', 32), ('Tom', 43)]

既可以遍历zip对象转换后的列表,也可以直接遍历zip对象。

for name,age in list(zip(names,ages)):
    print(name,'的年龄是:',age)
for name,age in zip(names,ages):
    print(name,'的年龄是:',age)
Jack 的年龄是: 16
Mike 的年龄是: 32
Tom 的年龄是: 43
Jack 的年龄是: 16
Mike 的年龄是: 32
Tom 的年龄是: 43

调用内置函数zip将多个可迭代对象进行打包压缩时,如果两个可迭代对象的长度不同,那么较长的可迭代对象会被截断。

print(list(zip(range(3),range(5))))
[(0, 0), (1, 1), (2, 2)]

可以使用 * 对zip进行解压缩。

x = [1,2,3]
y = [4,5,6]
print(list(zip(x,y)))
print(list(zip(*zip(x,y))))
[(1, 4), (2, 5), (3, 6)]
[(1, 2, 3), (4, 5, 6)]
x2,y2 = zip(*zip(x,y))
print(list(x2))
print(list(y2))
[1, 2, 3]
[4, 5, 6]

十五.遍历可迭代对象的内置函数map和filter

1.遍历可迭代对象的内置函数map

第一个参数指定函数名,第二个参数指定可迭代对象。

调用内置函数map后,会使用指定的函数名作用于指定的可迭代对象的每个元素,然后生成新的可迭代对象。

result = map(ord,'abcd')
print(result)
print(list(result))
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi16.jpg', width=300, height=150)
<map object at 0x00000156BE4A16A0>
[97, 98, 99, 100]
result = map(str.upper,'abcd')
print(result)
print(list(result))
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi17.jpg', width=300, height=150)
<map object at 0x00000156BE511128>
['A', 'B', 'C', 'D']
2.用于遍历可迭代对象的内置函数filter

第一个参数指定函数名,第二个参数指定可迭代对象。

调用内置函数filter后,会使用指定的函数名作用于指定的可迭代对象的每个元素,过滤掉函数返回为False的相关元素,然后生成新的可迭代对象。

result = filter(str.isalpha,'123abc')
print(result)
print(list(result))
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi18.jpg', width=300, height=150)
<filter object at 0x00000156BE5111D0>
['a', 'b', 'c']

学习参考:

  1. 图解Python: http://e-learning.51cto.com/course/12803
  2. Python菜鸟教程:https://www.runoob.com/python/python-tutorial.html
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZPILOTE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值