一.流程控制的概述
1996年,计算机科学家证明了这样的事实:任何简单或复杂的算法都可以由顺序结构、选择结构和循环结构这三种基本结构组合而成
顺序结构:程序从上到下顺序地执行代码,中间没有任何判断和跳转,直到程序结束。
选择结构:程序根据判断条件的布尔值选择性执行部分代码。
循环结构:程序根据循环条件反复执行某段代码,直到不满足循环条件为止。
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi.jpg', width=300, height=150)
![](https://img-blog.csdnimg.cn/20191016010907711.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
二.顺序结构
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi1.jpg', width=100, height=50)
![](https://img-blog.csdnimg.cn/20191016010944961.jpeg)
三.选择结构的概述
Python语言提供的实现选择结构的语句是if语句
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi2.jpg', width=200, height=100)
![](https://img-blog.csdnimg.cn/20191016011025570.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
四.代码块的缩进
代码块是一种相关语句的集合
在有的编程语言中,代码块开始和结束语某个特殊字符,比如:以{开始,}结束。
在Python中,代码块开始于冒号,代码块中的所有行(不包括自代码块)都要缩进相同数量的空格,通常缩进4个空格。
不要忘记缩进,也不要添加不必要的缩进。
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi3.jpg', width=200, height=100)
# 下图中有3个代码块
![](https://img-blog.csdnimg.cn/20191016011126891.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
五.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)
![](https://img-blog.csdnimg.cn/2019101601124425.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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)
![](https://img-blog.csdnimg.cn/2019101601132022.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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)
![](https://img-blog.csdnimg.cn/20191016011448870.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
九.while语句
while语句的语法格式:
初始化部分
while 循环条件:
循环体
其中,循环体对应的代码块必须缩进。
初始化部分:用于设置循环的初始条件,比如循环控制变量的初始值。
循环条件:每次循环都要判断循环条件的布尔值,以决定继续循环还是终止循环。循环条件中通常包含循环控制变量。
循环体:这是循环操作的主体内容,可以是一条语句,也可以是多条语句。循环体中的某些语句用于改变循环控制变量的值,从而改变循环条件的布尔值。
while语句的执行流程:
执行完一次初始化部分之后,反复判断循环条件的布尔值:
如果循环条件的布尔值为False,则终止循环;
如果循环条件的布尔值为True,则执行循环体,执行完循环体后再次判断循环条件的布尔值。
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi9.jpg', width=300, height=150)
![](https://img-blog.csdnimg.cn/20191016011515450.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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)
![](https://img-blog.csdnimg.cn/20191016011547609.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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)
![](https://img-blog.csdnimg.cn/20191016011643128.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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)
![](https://img-blog.csdnimg.cn/20191016011841104.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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)
![](https://img-blog.csdnimg.cn/20191016011915332.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
from IPython.display import Image
Image(filename = 'F:/Jupyter/Python/liuchengkongzhi14.jpg', width=300, height=150)
![](https://img-blog.csdnimg.cn/20191016011951572.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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)
![](https://img-blog.csdnimg.cn/2019101601202350.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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]
![](https://img-blog.csdnimg.cn/20191016012057939.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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']
![](https://img-blog.csdnimg.cn/20191016012135125.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
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']
![](https://img-blog.csdnimg.cn/20191016012208952.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01SWkhVR0g=,size_16,color_FFFFFF,t_70)
学习参考: