函数--生成器、生成器函数、各类推导式、生成器表达式

一、生成器。

二、生成器函数

三、各种推导式。

四、生成器表达式。

一、生成器.

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

二、生成器函数.

什么是生成器函数: 函数中包含了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)
结果:
<generator object func at 0x10567ff68>

函数生成器的好处

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

如何使用函数生成器:

生成器本质还是迭代器,所以我们可以直接执行__next__()来执行函数生成器.
def func():
    print("111")
    yield 222
    print("333")
    yield 444

gener = func()  #因为函数里是yield 所以这个时候不是执行函数内容,而是获取到生成器权限
ret = gener.__next__() #执行函数内容,yield也可返回数据.但不会终止函数,而是分段来执行一个函数
print(ret)
ret2 = gener.__next__()
print(ret2)
ret3 = gener.__next__()  #只有两个yield,再来,就会报错  StopIteration
print(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 666
gen = 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) 

结果: <generator object <genexpr> 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

时间: 2024-10-09 00:17:52

函数--生成器、生成器函数、各类推导式、生成器表达式的相关文章

(列表推导式,生成器表达式,内置函数)

一,列表生成式 示例一: 生成1~100的列表 生成1-100的列表 1 2 3 4 5 li = [] for i in range(1,101):     li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期~11期li = []for i in range(1,12): li.append('python{}期'.format(i))print(li) 执行输出: ['python1期', 'python2期', 'python3期'...]

列表推导式----生成器表达式

列表推导式: 基本形式: [表达式  for  参数  in  可迭代对象]   或者 [表达式  for  参数  in  可迭代对象  if   条件] 实例: 1 l = [] 2 for i in range(100): 3 l.append('egg%s' %i) 4 print i 5 6 #不带if条件 7 l = ['agg%s' %i for i in range(100) ] 8 9 #带if条件 10 l = ['agg%s' %i for i in range(100)

(一)Python入门-4控制语句:10推导式创建序列-列表推导式-字典推导式-集合推导式-生成器推导式

推导式创建序列: 推导式是从一个或者多个迭代器快速创建序列的一种方法.它可以将循环和条件判断结合, 从而避免冗长的代码.推导式是典型的Python 风格,会使用它代表你已经超过Python初 学者的水平. 一:列表推导式 列表推导式生成列表对象,语法如下: [表达式 for item in 可迭代对象 ] 或者:{表达式 for item in 可迭代对象 if 条件判断} 1 #列表推导式 2 x = [x for x in range(1,5)] 3 print(x) 4 5 x = [x*

三元表达式 列表推导式 生成器表达式

# 三元表达式# def my_max(x,y):# if x >= y:# return x# else:# return y## res=my_max(1,2)# print(res) # 2 # x=10# y=20# res=x if x >= y else y## print(res) # 20 # name=input('>>:name').strip()# res='Yes' if name == 'OBOS' else 'No'## print(res) # 列表推

python基础-三元表达式/列表推导式/生成器表达式

1.三元表达式:如果成立返回if前的内容,如果不成立返回else的内容 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res) 2.列表推导式:l=['egg'+str(i) for i in range(1,11)] print(l) 3.生成器表达式: l=('egg'+str(i) for i in range(1,11) if i >6) for i in l: print(i) 原文地址:http

python生成器和推导式

一.生成器 什么是生成器.生成器实质就是迭代器. 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的装换也可以获取生成器 def func(): print("111") return 222 ret = func() print(ret) 结果:111 222 将函数中的return换成yield就是生成器 def func() print("111") yield 222 ret = func() pri

Python——生成器&amp;推导式

生成器 生成器的本质就是迭代器,那么还为什么有生成器呢,两者唯一的不同就是迭代器都是Python给你提供能够的已经写好的工具或者通过数据转化得来的.而生成器是需要我们自己用Python代码构建的工具. 生成器的构建方式: 在python中有两种方式来创建生成器: 通过生成器函数 通过生成器推导式 生成器函数: 首先我们来一个简单的函数结构: def func(): print('111') return 222 result = func() print(result) 没得问题,那么在看看生成

Python -- 函数之推导式

5.12 推导式 l = [] for i in range(1,11): l.append(i) print(l) # 用列表推导式 (一行搞定) l = [i for i in range(1,11)] print(l) 列表推导式可分为两种模式: 循环模式: [变量(加工的变量) for 变量 in iterable(可迭代对象)] 筛选模式: [变量(加工的变量) for 变量 in iterable(可迭代对象) if 条件] # 循环模式 1. 将10以内所有整数的平方写入列表. l

【菜鸟学Python】列表推导式

列表推导式 推导式格式 [表达式 for 变量 in 列表][表达式 for 变量 in 列表 if 条件] 第一种语法: 首先迭代列表中所有内容,每一次迭代,都把列表中相应内容放到变量中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表 举例: 打印1到10之间的数字 常规操作: # 使用for打印 for i in range(1, 10): print(i) # 输出如下: for i in range(1, 11): print(i) 1 2 3 4 5 6 7