python全栈--闭包、迭代器、生成器

一、什么是闭包?

闭包就是内层函数对外层函数(非全局)的变量的引用,叫闭包。
可以让一个局部变量常驻内存
在这里插入图片描述

二、迭代器

  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
  • 迭代器只能往前不会后退。
  • 迭代器有两个基本的方法: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循环
生成器具有惰性机制

发布了26 篇原创文章 · 获赞 5 · 访问量 777

猜你喜欢

转载自blog.csdn.net/weixin_44730235/article/details/105131407