Python学习笔记
流程控制
Python同样提供了现代编程语言都支持的三种流程,即顺序结构、分支结构、循环结构
if分支初步
- if分支使用布尔表达式或者布尔值来作为分支条件进行分支控制
- Python的if分支既可以作为语句使用、也可作为表达式使用
- 归纳if的三种语法形式
if的三种语法格式:
if 条件:
执行体
if 条件:
执行体1
else:
执行体2
if 条件:
执行体1
elif 条件:
执行体2
elif 条件:
执行体3
...
else:
执行体4
- Python的语句块是通过缩进来标记的(而大部分语言都是用花括号或end作为语句块的标记),相同所进的多行代码属于同一个语句块(代码块)
- 同一个代码块可以缩进1个空格、2个空格、3个空格…或者一个Tab位,这都是符合语法要求的。但是同一个代码块的缩进要统一。
- 注意:不要忘记冒号,从Python语法解析器的角度来看,Python的冒号精确表示代码块的开始点——这个功能不仅在条件执行体中如此,后面的循环体、方法体、类体全部都应该遵守该规则,例如if,冒号代表条件的结束和执行体的开始。
- 如果程序在执行的时候出现了这样的错误:
invalid suntax
,很可能是因为没加冒号导致的
- 如果程序在执行的时候出现了这样的错误:
- 条件执行体、循环体、方法体、类体,都是从冒号开始,后面同意所进的部分算一个整体的代码块。
深入if分支
-
if条件的类型:
- if条件可以是任意类型,但其实会被转化成布尔类型。除了False本身之外,各种代表“空”的例如
None
,空字符串,空元组,空列表,空字典,都会被当成False来处理,以下各支都会被当成False: False,None,0,"",'',(),[],{}
- if条件可以是任意类型,但其实会被转化成布尔类型。除了False本身之外,各种代表“空”的例如
-
if条件的逻辑错误
- 表面上来看,else后面没有任何条件,或者elif后只有一个条件——但这不是真相:因为else的含义是“否则”——else本身就是一个条件
- 这也是吧if、else后面的代码块统称为条件执行体的原因,else的隐含条件是对前面条件取反。
-
if表达式
- if分支语句还可以作为表达式,也就是前面学过的三目运算符,例如如下程序:
age = int(input("请输入年龄:"))
print("年龄大于25") if age > 25 else (print("年龄小于25") if age < 25 else print("年龄等于25"))
- pass语句
- pass语句其实就是空语句
- 有时候程序需要占一个位、放一条语句,但是又不希望这条语句做任何事情(程序员在编程时遇到的程序暂时不想处理或者不知道如何处理,就需要一个pass语句来占一个位),此时就可以通过pass语句来实现了。
- 通过使用pass语句,可以让程序更完整。
断言
- 断言语句和if分支有点类似,他作用于对一个bool表达式进行断言,如果该bool表达式为true,该程序可以继续向下执行;否则程序会引发
AssertionError
错误 - 例如以下程序:
s_age = input("请输入年龄")
age = int(s_age)
assert 20 < age < 80
print("您输入的年龄在20和80之间")
- 上面程序中第三行代码断言age必须位于20到80之间。运行上面程序,如果输入的age处于执行范围之内,则可看到如下运行过程。
请输入年龄23
您输入的年龄在20和80之间
- 如果age不在20到80之间,将会看到如下运行过程。
请输入年龄1
Traceback (most recent call last):
File "assert_test.py", line 3, in <module>
assert 20 < age < 80
AssertionError
- 从上面的运行过程可以看出,断言也是对逻辑表达式进行判断,因此实际上断言也相当于一种特殊的分支。
- assert断言的执行逻辑是:
if 条件为False :
程序引发AssertionError错误
循环初步
-
循环的意义:
- 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体。
- 当反复执行这个循环体时,需要再合适的时候把循环条件改为假,从而结束循环;否则循环将一直执行下去,形成死循环。
- 死循环,其实应该是无限循环。
-
while循环
- while循环的语法格式如下:
[init_statements]
while test_expression:
body_statements
[iteration_statements]
- 初始语句可写可不写。由于列表和元组的元素都是由索引的,因此程序可以通过while循环、列表或元组的索引来遍历列表和元组中所有元素。
# while循环遍历字典
my_data = {"java":11, "swift":22, "python":33, "kotlin":44}
i = 0
# 将字典的所有的key转化成list
keylist = list(my_data.keys())
while i < len(keylist):
print(keylist[i],my_data[ keylist[i] ])
i += 1
- for-in循环。
- for-in循环专门用于遍历范围、列表、元组和字典等可迭代对象包含的元素。for-in循环的语法格式如下:
for 变量 in 字符串|范围|集合等:
statements
- 使用for-in循环遍历序列:
# for-in循环遍历字符串
s = "fkjava"
# s(序列)有几个元素,for-in循环就重复几次,循环计数器会自动、依次等于每个元素
for c in s:
print(c)
a = (20, 33, 40, 455, 566)
for c in a:
print(c)
# for-in循环遍历字典
my_data = {"java":11, "swift":22, "python":33, "kotlin":44}
for c in my_data.keys():
print(c)
# 使用序列的解包
for _key,_value in my_data.items():
print(_key,_value)
-
for-in循环遍历序列的实际意义:
- 使用for-in循环遍历列表和元组是,列表或元组有几个元素,for-in循环的循环体就执行几次,针对每个元素执行一次,循环计数器会依次被赋值为元素的值。
- for-in循环也可根据索引来遍历列表或元组:只要让循环计数器遍历0到列表长度的区间。
-
for-in循环遍历字典:
- 使用for-in循环遍历字典其实也是通过遍历普通列表来实现的,前面介绍字典是已经提到,字典包含了如下的3种方法:
items()
:返回该字典中所有key-value对的列表keys()
:返回字典中所有的key列表values()
:返回字典中所有的value列表
- 先调用字典的上面三个方法之一先获取字典的所有key-value对、所有key、所有value,然后再进行遍历。
- 使用for-in循环遍历字典其实也是通过遍历普通列表来实现的,前面介绍字典是已经提到,字典包含了如下的3种方法:
-
关于for-in循环的两点说明:
- for-in循环中的变量的值受for-in循环控制,该常量将会在每次循环开始时被自动赋值,程序对for-in循环的循环计数器赋值在语法是允许的,但是没有什么意义,而且非常容易导致错误
- for-in循环可用于遍历任何可迭代对象。所谓可迭代对象就是说该对象包含一个
_iter_
方法,且该对象的返回值对象具有next()
方法即可(后面都会学到)
-
循环中使用else
- Python的循环都可以定义else语句块,当循环条件为False时,程序会执行else语句块。
- 循环的else块,是Python的一个很特殊的语法(其他编程语言通常不支持),else语句块的主要作用是以便生成更优雅的Python代码
- 直接在后面放和加上else作用有一点差异,后面会讲到。
嵌套循环
- 把一个循环放在另一个循环体内,就可以形成嵌套循环。
- 这一点和其他语言很相似,就不再作过多赘述。
列表推导式
- 列表推导式其实是一种for表达式,用于利用其他元组、区间、列表等可迭代对象创建新的列表,for表达式语法格式如下
[表达式 for 循环计数器 in 可迭代对象]
- 列表推导式的说明
- for表达式与普通for循环的区别在于两点
- for关键字之前定义一个表达式,这个表达式通常会包含循环计数器(当然不包含也是没有问题的)
- for表达式没有循环体,因此不需要冒号
- 列表推导式的
- 但是注意一定要封装在中括号里,因为他叫列表推导式
- 表达式的多次执行结果将作为列表的元素
- 列表推导式的循环控制的不是循环,而是前面的表达式
- for表达式与普通for循环的区别在于两点
使用break跳出循环
- 使用break可以提前跳出循环,而不是等到循环条件为False时才跳出循环。
- 带else块的for循环,如果使用break强行中止循环,程序就不会再执行else块,这也是他的区别
使用continue忽略本次循环
- continue只是忽略本次循环的剩下语句,接着开始下一次循环,并不能中止循环
- 把continue语句放在循环的最后一行,呢么这条continue语句是没有任何意义的。
使用return结束函数
- return的作用是结束函数
- 无论return处于多深的嵌套循环中,return总可以结束函数