函数-省内存的生成器

(一 ) 生成器 本质 就是迭代器,一个一个的创建 对象

1) 生成器 的创建方式:

# def func():
# print("我叫哈哈哥.")
# return "嘻嘻姐"
# ret = func()
# print(ret)
# print(func()) #这样都可以打印出 2句话


# ##  当 变化这个函数  一个词 就会变成 生成器
# ## 大坑 生成器 运行之后,产生了一个生成器,而不是 运行函数
# def func():
# print("我叫哈哈哥")
# yield "嘻嘻姐" # 表示返回 不会终止函数的 运行
#
#
# ret = func() # 执行 函数 此时没有 运行函数
#
# # 此时我们得到了 生成器
# print(ret.__next__())
# print(ret.__next__())

a.  生成器函数

# def buy():
# lst = []
# for i in range(100):
# lst.append("衣服%s" % i)
# return lst
# lst = buy()
# print(lst)
#
#

#
# def buy():
# for i in range(100):
# yield "衣服%s" % i

# gen = buy() ### 生成器 迭代器 好处 节省 内存
# print(gen.__next__())
# print(gen.__next__())
# print(gen.__next__())

# for yifu in gen: # 迭代器.__next__()
# print(yifu)


# lst = list(gen) # 内部使用的 是 for 循环 -> __next__
# print(lst)


# send() -> __next__()
# send 可以给上一个 yield 传值

## 生成器 函数在 执行的时候 返回生成器,而不是 执行 此函数

## 能 向下执行的 两个条件
# __next__(),执行到下 一个 yield
## send() 执行到下一个 yield ,给上一个 yield 位置 传值

## 生成器中记录的是代码而不是函数的运行

b. 通过生成器表达式来获取函数

## 生成器 表达式
# g = (i for i in range(1,10))
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())
# print(g.__next__())

def func():
lst = ["衣服%s" % i for i in range(1,5)]
yield from lst
lst1 = ["python%s期" % i for i in range(1,18)]
yield from lst
gen = func()
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())

c. 类型转换 

(二 )生成器函数:

  生成器函数中包含 yield , 返回数据和 return 差不多,

  return 会立即结束这个函数的执行

  yield 可以分段的执行一个函数

#  生成器函数在执行的时候返回生成器,而不是直接执行函数

#  能向下执行的两个条件:

    1)   __next__()      执行到下一个 yield

    2)   send() ,           执行到下一个 yield ,给上一个   yield  位置传值

#  所有的生成器都是迭代器都可以直接使用  for  循环

                           都可以使用 list()函数来获取到生成器 内 所有的 数据

###  生成器 中记录的是代码 而不是函数的运行

def func():

  print("我叫哈哈哥")

  yield     "哈哈笑"

gen = func()  #创建生成器,此时运行会把生成器函数中的代码记录在内存

          当执行到__next__(), 运行此空间中 的代码,运行到 yield 结束

##   优点: 节省内存,生成器本身就是代码,几乎不占内存

##    特点: 惰性机制,只能向前,不能反复

(三)   各种推导式 

1) 列表推导式:  [结果           for循环 if条件判断]

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


# lst= [11,22,33]
# dic = {i:lst[i] for i in range(len(lst))}
# print(dic) # 结果是 {0: 11, 1: 22, 2: 33}

2)字典推导式: {结果(k,v)      for循环  if }

# #     把字典的 key value  互换
# dic = {"主食": "炒面", "副食": "小拌菜", "汤":"疙瘩汤"}
#
# dic1 = {v:k for k,v in dic.items() }
# print(dic1)

3)集合推导式:{结果(k)           for循环   if)

######  没有元祖的推导式啊  

(四)生成器表达式

(结果       for循环        if)

(五)  这个有点意思哦

# def add(a,b ):              
# return a + b
# def test():
# for r_i in range(4):
# yield r_i
# g = test()
# for n in [2,10]:
# g = (add(n,i)for i in g)
# print(list(g))

结果是什么呢????????
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?








#
# # ### 结果是 两个字符串相加 list[20, 21, 22, 23]

这个 结果又是什么 ????

# def fib(max):
#         n,a,b = 0 ,0 ,1
# while n < max:
# print(b)
# a ,b = b , a + b
# n += 1
# return "done"
# fib(10)
原文地址:https://www.cnblogs.com/wenqi2121/p/10104918.html