Day12.今日总结

函数的调用过程

函数的调用过程又叫压栈的过程:每次调用函数,系统都会在内存栈区间自动开辟一个临时的内存就,用来保存在函数中声明的局部变量(其中形参也是保存在这个区域中的)当函数调用结束,这个内存区域会自动销毁

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中的代码发生了什么,都会执行

作业:不断输入年龄并且将年龄值转化成整数,如果输入错误,程序不崩溃,让其重新输入,知道输入无误位置

你可能感兴趣的:(Day12.今日总结)