博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数--生成器、生成器函数、各类推导式、生成器表达式
阅读量:5346 次
发布时间:2019-06-15

本文共 2310 字,大约阅读时间需要 7 分钟。

 

 

一、生成器.

 

查看一个对象是否可迭代:

1)dir(obj) 查看对象的属性,如果有__iter__方法,那么就是可迭代的.

2)iter(name) 生成个对象的迭代器,参数为对象,此返回值是个存储地址

3)定义好了迭代器,就可以用__next__()来拿取内容了,一次一个.

生成器本质就是个迭代器,一个一个的创建对象,创建生成器的方式:1.生成器函数2.通过生成器表达式来获取生成器3.类型转换

 创建生成器后如何获取数据:

1.__next__(), 下一个2.send(), 给上一个yield传值3.for , __next__()4.list(),5.for

 

 

二、生成器函数.

什么是生成器函数: 函数中包含了yield,此函数就是生成器函数,我们执行函数的时候,就是获取这个生成器.而不再是执行函数内容.

举例说明

 

def func():    print("111")    return 222 ret = func() print(ret) 结果: 111 222再将函数中的return换成yield就是生成器def func():    print("111")    yield 222 ret = func() print(ret) 结果: 

 

函数生成器的好处

 

return 方法的函数只能一次性拿取,有时函数很大,但只需求一部分时,这种会很占内存; 但是 yield 方法的函数,一次就拿一个,用多少生成多少,生成器是一次取一段,节省内存,但它不会回头.

 

如何使用函数生成器:

 

生成器本质还是迭代器,所以我们可以直接执行__next__()来执行函数生成器.def func():    print("111")    yield 222    print("333")    yield 444gener = func()  #因为函数里是yield 所以这个时候不是执行函数内容,而是获取到生成器权限ret = gener.__next__() #执行函数内容,yield也可返回数据.但不会终止函数,而是分段来执行一个函数print(ret)ret2 = gener.__next__()print(ret2)ret3 = gener.__next__()  #只有两个yield,再来,就会报错  StopIterationprint(ret3)

 

send()方法: 

 

send和__next__()一样都可以让生成器执行到下一个yield.但send()和__next__还是又区别的:1.send和next()都是让生成器向下走一次2.send可以给上一个yield的位置传递值,但不能给最后一个yield发送值,在第一次执行生成器代码的时候不能使用send()生成器可以使用for 循环来循环获取内部的元素:def func():    print(111)    yield 222    print(333)    yield 444    print(555)    yield 666gen = func()for i in gen:    print(i)结果: 111 222 333 444 555 666

 

三、各种推导式.

列表推导式:通过一行来构建你要的列表,列表推导式代码简单,但是出现错误后很难排查.

集合推导式:可以帮我们直接生成一个集合,并且可以去重

字典推导式:可以帮我们生成一个字典,例如需要将一个字典的key和value互换时用这个就很方便

但是就没有元组推导式.(估计是因为元组不可变的缘故)

 

列表推导式格式: [ 结果 for i in 可迭代对象  if 条件]获取1-100内所有的偶数 lst = [i for i in range(1, 100) if i % 2 == 0] print(lst)

四、生成器表达式.

生成器表达式格式:   (结果 for 变量 in 可迭代对象  if 条件筛选),可以直接获取到生成器对象,生成器对象可以直接进行for 循环

 

gen = (i for i in range(10)) print(gen) 结果: 
at 0x106768f10>打印的结果就是⼀个生成器. 我们可以使用for循环来循环这个生成器:gen = ("麻花藤我第%s次爱你" % i for i in range(10)) for i in gen: print(i)

 

生成器表达式也可以进行筛选:

 

寻找名字中带有两个e的⼈的名字 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
gen = (name for first in names for name in first if name.count("e") >= 2) for name in gen:     print(name)

 

 生成器表达式和列表推导式的区别:

1. 列表推导式比较耗内存. 一次性加载. 生成器表达式要下指令去拿值,不下指令不会取值,很节省内存 2. 列表推导式得到的是⼀个列表. 生成器表达式获取的是⼀个生成器.得到的值不一样

 

转载于:https://www.cnblogs.com/lgw1171435560/p/10104513.html

你可能感兴趣的文章
web前端经典小题
查看>>
AutoCAD如何倒角 倒圆角 倒直角
查看>>
Office PPT中如何插入flash
查看>>
C# Fade Form Effect With the AnimateWindow API Function
查看>>
golang多维数组的切片
查看>>
IP 网际协议
查看>>
C语言_第五章__实践(密码转换)
查看>>
docker 容器后台运行命令
查看>>
jquery 获取css position的值
查看>>
面向对象的程序设计
查看>>
a标签添加点击事件
查看>>
Context.startActivity出现AndroidRuntimeException
查看>>
Intellij idea创建javaWeb以及Servlet简单实现
查看>>
代理网站
查看>>
Open multiple excel files in WebBrowser, only the last one gets activated
查看>>
FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时
查看>>
最近邻与K近邻算法思想
查看>>
【VS开发】ATL辅助COM组件开发
查看>>
FlatBuffers In Android
查看>>
《演说之禅》I & II 读书笔记
查看>>