Python从入门到放弃_发生器


# 1. 生成器

# def func(): # 定义函数
# print(1) # 函数体
# # 没有返回的时候默认返回None 把返回值返回给调用者
# print(func()) # 调用函数

# def foo():
# for i in range(5):
# print(i)
# return i
#
# print(foo()) # 0,1,2,3,4 4

# 只要函数中不存在yield就是正常函数,存在了yield就不正常了
# 生成器一个能自己定义一些逻辑的,
# 迭代器一个是拿自己写好的数据结构元素

# def foo(): # yield 关键字
# print(1)
# yield 4 # yield 返回值 记录执行到哪里 停止
# print(2)
# yield 5
#
# g = foo() # <generator object foo at 0x021246C0> #产生一个生成器
# print(g.__next__()) # g.__next__ 触发启动这个生成器
# print(g.__next__()) # g.__next__ 触发启动这个生成器

# def foo(): # yield 关键字
# print(1)
# return 4 # yield 返回值 记录执行到哪里 停止
# print(2)
# return 5
# foo()


# 生成器定义: 函数体中存在yield就是生成器,函数+()就产生 生成器
# 生成器 只能向下执行
# 正常函数中,函数+()调用在个函数

# def foo(): # yield 关键字
# print(1)
# yield 4 # yield 返回值 记录执行到哪里 停止
# print(2)
# yield 5

# # 函数体里有yield就是辨别是生成器还是函数
# g = foo() # 创建一个生成器
# g.__next__() # 生成器是基于函数创建的

# 生成器的好处
# 节省空间

# li = []
# def gen():
# for i in range(20000):
# print(i)
# li.append(i)
# gen()
# print(li)
#
# def gen():
# for i in range(20000):
# yield i
#
# g = gen()
# for i in range(10):
# print(g.__next__())

# def gen():
# print(1)
# yield 1
# print(2)
# yield 3
# yield 4
# yield 5
#
# g = gen()
# print(next(g)) # 作废了
# print(next(g)) # 作废了
# print(next(g)) # 作废了
# print(next(g)) # 作废了

# _next__ 和 yield 要一一对应, 最后的一个yield下边能写就是不运行


# def foo():
# def func():
# print(1)
# yield 4
# return func
# f = foo()
# g = f()
# print(g.__next__())


#下一半  send() 发送

# def func():
# print(44) # 44
# l = yield 5 # 走到这里了 到此一游
# yield 77
# print(l) #'你下来我给你钱'
# yield 66
#
# g = func() # 生成一生成器
# # print(g.__next__()) # 5 # 作废了
# # print(g.send('黄瓜味脉动')) #send() == __next__ + 传值 # 66
#
# print(g.__next__()) # 5 #第一次启动这个生成器的时候 生成器.__next__ 或 生成器.send(None)
# print(g.send('你下来我给你钱')) # 77
# print(g.__next__()) # 66


# def func():
# def foo():
# pass
# yield foo
# g = func()
# g.__next__()

# yield from lst


# for 循环拆解版
# def foo():
# lst = [1,2,3,54]
# f = yield lst[0]
# print(f) # '该大不大'
# f = yield lst[1]
# print(f) # None
# f = yield lst[2]
# print(f) # None
# f = yield lst[3]
# print(f)
# g = foo()
# print(g.__next__()) # 1
# print(g.send('该大不大')) #2
# print(g.__next__()) # 3
# print(g.__next__()) # 54


# for循环
# def foo():
# lst = [1,2,3,54]
# for i in lst:
# f = yield i
# print(f)
#
# g = foo()
# print(g.__next__()) # 1
# print(g.send('该大不大')) #2
# print(g.__next__()) # 3
# print(g.__next__()) # 54

# yield from 调用的时候只能使用__next__()啊

# 推导式:

# li = []
# def func():
# for i in range(10):
# li.append(i)
# func()
# print(li)
#
# li = [i for i in range(10)] #[结果,语句] [0,1,2,3,4,5,6,7,8,9] 列表推导式
# print(li)

# 筛选
# li = []
# def func():
# for i in range(10):
# if i >3:
# if i%2==0:
# li.append(i)
# func()
# print(li)

# 列表推导式
# print([i for i in range(10) if i>3 if i%2==0 if i%4== 0])

# 字典推导式

# dic = {'1':2,'2':3}
# lst1 = []
# lst2 = []
# for k,v in dic.items():
# lst1.append(k)
# lst2.append(v)
#
# print(lst1,lst2)


# 集合推导式

dic = {'1':2,'2':3}
d = {i for i in dic.items()}
print(type(d))


# 字典推导式
# lst1 = ['1','2']
# lst2 = [2,3]
# d = {lst1[i]:lst2[i] for i in range(2)}
# print(d)
# print(type(d))


# 生成器推导式: #长得像元祖的推导式 其实是生成器推导式

# l = (i for i in range(1000) if i%3 ==0)
# for i in range(10):
# print(l.__next__())
#
# def l():
# for i in range(1000):
# if i > 3:
# yield i
# g = l()
#
# for i in range(10):
# print(g.__next__())


# 推导式:
# 列表推导式
# 集合推导式
# 字典推导式
# 生成器推导式

x = 10
x%=5
print(x)

 

posted on 2019-01-15 19:54  FP233  阅读(312)  评论(0编辑  收藏  举报

导航