一、什么是闭包?
闭包就是内层函数对外层函数(非全局)的变量的引用,叫闭包。
可以让一个局部变量常驻内存
二、迭代器
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
- 迭代器只能往前不会后退。
- 迭代器有两个基本的方法:iter() 和 next()
- 可迭代对象:str,list,tuple,set,f(可迭代,也是迭代器),dict
- 以上的可迭代对象都有一个函数__iter__()
- iterable : 可迭代对象,内部包含__iter__()函数
- iterator : 迭代器,内部包含__iter__()同时包含__next__()
迭代器的特点:
1、节省内存
2、惰性机制
3、不能反复,只能向下执行
lst = [1,2,3]
print(dir(lst)
lst = ["皇阿玛","皇额娘","容嬷嬷","紫薇"]
#获取迭代器
it = lst.__iter__()
#迭代器往外拿元素,__next__()
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
Stopiteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况
lst = ["皇阿玛","皇额娘","容嬷嬷","紫薇"]
#获取迭代器
it = lst.__iter__()
#迭代器往外拿元素,__next__()
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
lst = ['皇阿玛','皇额娘','容嬷嬷','紫薇']
it = lst.__iter__()
while True:
try:
name = it.__next__()
print(name)
except StopIteration:
break
三、生成器
-
生成器的本质就是迭代器
-
生成器的三种生成方法:
1、通过生成器函数
2、通过生成器表达式创建生成器
3、通过数据转换 -
生成器函数:
函数中包含了yield的就是生成器函数
(注意:生成器函数被执行,获取到的是生成器,而不是生成器的执行)
def func():
print("我爱苹果")
yield "也爱菠萝"
print("想吃汉堡")
yield "想喝可乐"
g = func()
print(g.__next__())
print(g.__next__())
- 生成器表达式:
(结果 for 变量 in 可迭代对象 if 条件筛选) - 取值:
1、_next_()
2、send(值) 给上一个yield位置传一个值,第一个和最后一个yield不用传值
3、可以for循环
4、list(g) 生成器 - 各种推导式和生成器表达式:
列表推导式:[结果 for 变量 in 可迭代对象 if 筛选]
lst = [i for i in range(1,15)]
print(lst)
#找出名字里带有两个e的
names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven',
'Joe'],['Alice','Jill','Ana','Wendy','Jennifer',
'Sherry','Eva']]
lst4 = [name for first in names for name in first if name.count('e') == 2 ]
print(lst4)
字典推导式:{结果 for 变量 in 可迭代对象 if 筛选} 结果=>key:value
lst5 = ['alex','wusir','taibai','ritian']
lst6 = ['sb','active','white','niupi']
new_dict = {lst5[i]:lst6[i] for i in range(len(lst5))}
print(new_dict
集合推导式:{结果 for 变量 in 可迭代对象 if 筛选} 结果key
集合推导式:可以帮我们直接生成一个集合,集合的特点:无序,不重复。所以集合推导式自带去重功能。
生成器表达式和列表推导式的语法基本上是一样的,只是把[]替换成()
gen = (i for i in range(1,100) if i % 2 == 0)
print(gen)
总结:
推导式有,列表推导式,字典推导式,集合推导式,没有元组推导式
生成器表达式:(结果 for 变量 in 可迭代对象 if 条件筛选)
生成器表达式可以直接获取到生成器对象,生成器对象可以直接进行for循环
生成器具有惰性机制