函数的调用过程
函数的调用过程又叫压栈的过程:每次调用函数,系统都会在内存栈区间自动开辟一个临时的内存就,用来保存在函数中声明的局部变量(其中形参也是保存在这个区域中的)当函数调用结束,这个内存区域会自动销毁
2.迭代器(iter)
迭代器是python提供的容器型数据类型 (可变,有序的) -- 不关注
迭代器和之前的列表、字典、集合、元祖等"容器不相同,它只能查看元素,并且容器内的元素调用一次少一个
迭代器的值:a.将其他的数据转换成迭代器 b.迭代器
迭代器的元素:可以是任何类型的数据,可以重复
2 查 - 获取元素的值
注意:不管以任何形式获取了迭代器中某个元素的值,这个元素都会消失
a.获取单个元素
next(迭代器) - 返回容器中最上面的元素
iter3 = iter('1234')
b. 变量取出迭代器中的每个元素
for item in iter3:
print(item)
3 什么时候使用迭代器:多个数据中,某个或某些数据使用过了就不需要再保存了,这种数据就可以使用迭代器来保存
1.什么是生成器
生成器就是迭代器,但是迭代器不一定是生成器
如果函数中有yield关键字,那么这个函数就不在是一个普通的函数,
调用函数不再是执行函数体获取返回值,而是创建这个函数对应的生成器对象
def nums():
print('==============')
print(100)
if False:
yield
return 100
gen1 = nums() # 函数调用表达式nums()才是生成器
2.生成器怎么产生数据
def nums():
print('+++++')
yield 100
print('-----------')
return nums()
创建一个生成器gen2
一个生成器能产生多少数据,就看执行完生成器对应的函数会遇到几次yield关键字
生成器实在获取数据的时候才会产生数据,执行生成器对应的函数的函数体,直到遇到yield位置
将yield后面的数据作为生成器的元素返回,并且会记录本次产生数据函数体结束的位置,下次再次产生时
会从上次中止处继续执行。。。如果执行开始到函数结束没有遇见yield,那么不会产生数据
gen2 = nums()
print(next(gen2))
练习:写一个生成器,功能是能够产生'stuXXXX'
def students_numbers():
n = 0
for x in range(10000):
str1 = str(n)
yield 'stu' + str1.rjust(4, '0')
n += 1
a = students_numbers()
b = students_numbers()
print(next(a))
print(next(a))
print(next(b))
print(next(b))
1.生成式
生成器的另一种写法(简写)
"""
a.语法1:
(表达式 for 变量 in 序列)
b.说明:表示 - 表达式可以是值、变量、运算表达式、函数调用表达式等,只要不是赋值语句都可以
c.展开
def 函数名():
for 变量 in 序列:
yield 表达式
"""
gen1 = (5*x for x in range(5))
print(next(gen1))
print(next(gen1))
"""
a.语法2:
生成器变量 = (表达式 for 变量 in 序列 if 条件语句)
列表变量 = [表达式 for 变量 in 序列 if 条件语句]
b.展开
def 函数名():
for 变量 in 序列:
if 条件语句:
yield 表达式
"""
a = 100
1.生成式
生成器的另一种写法(简写)
"""
a.语法1:
(表达式 for 变量 in 序列)
b.说明:表示 - 表达式可以是值、变量、运算表达式、函数调用表达式等,只要不是赋值语句都可以
c.展开
def 函数名():
for 变量 in 序列:
yield 表达式
"""
gen1 = (5*x for x in range(5))
print(next(gen1))
print(next(gen1))
"""
a.语法2:
生成器变量 = (表达式 for 变量 in 序列 if 条件语句)
列表变量 = [表达式 for 变量 in 序列 if 条件语句]
b.展开
def 函数名():
for 变量 in 序列:
if 条件语句:
yield 表达式
"""
a = 100
1.异常 :程序错误、程序崩溃,程序中某条代码出现异常,那么从这条代码开始,之后的代码不会再执行,程序结束
2.异常捕获:让程序出现异常的时候程序不崩溃
1)方式一: 捕获所有类型的异常
"""
a.语法:
try:
代码段1
except:
代码段2
finally:
代码段n
b.说明:
先执行代码段1,如果不出现异常,程序直接执行之后的其他语句,如果出现异常,直接执行代码段2,然后执行其他语句
"""
2)方式二:捕获指定的一个或者多个异常,做相同的处理
"""
try:
代码段1
except (异常类型1,异常类型2,。。。):
代码段2
finally:
代码段n
先执行代码段1,如果代码段1没有出现异常,直接执行之后的其他语句,
如果代码段1出现异常,如果异常类型与需要捕获的异常类型一致,那么执行代码段2,然后执行其他语句;
如果异常类型与需要捕获的异常类型不一致,程序崩溃
注意:异常类型要求必须是直接或者间接继承自Exception类的子类
"""
3)方式3:捕获不同类型的异常,并且可以对不同的异常做不同的处理
"""
try:
代码段1
except 异常类型1:
代码段2
except 异常类型2:
代码段3
finally:
代码段n
"""
3.finally后面的代码段,不管try中的代码发生了什么,都会执行
作业:不断输入年龄并且将年龄值转化成整数,如果输入错误,程序不崩溃,让其重新输入,知道输入无误位置