生成器与迭代器
# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 11:11
# @Author : Wans
# @File : generator01.py
# @Sofware : PyCharm
'''
通过列表生成式(列表推导式),我们可以直接创建一个列表
但是,受内存限制,列表容量肯定是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大的存储看见,
如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了
所以如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢!
这样就不必创建完整的list,从而节省大量的空间,在python中,这种一边循环一边计算的机制称为生成器
generator
得到生成器的方式:
1.通过列表推导式得到生成器
2.
'''
# [x for x in range(100000000)]
# [0,2,3,7,6,3,6,8,9,6,5]
# newlist = [x*3 for x in range(10)]
# print(newlist)
# 得到生成器
g = (x*3 for x in range(10))
print(type(g)) # <class 'generator'>
# 通过调用__next__()方式得到元素
print(g.__next__()) # 0
# 方式2:next(生成器对象) builtins 系统内置函数
# 每调用一次next则会产生一个元素
print(next(g)) # 3
# StopIteration 生成器本来就可以产生10个,得到10个,在调用next会抛出异常
# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 11:33
# @Author : Wans
# @File : generator02.py
# @Sofware : PyCharm
# g = (x * 3 for x in range(10))
#
# while True:
# try:
# e = next(g)
# print(e)
# except StopIteration:
# print('没有更多元素了!')
# break
# 定义生成器的方式二:借助函数完成
# 只要函数中出现yield关键字,说明函数就不是函数,变成生成器了
# 斐波那契数列
'''
步骤:
1.定义一个函数,函数中使用yield关键字
2.调用函数,接收调用的结果
3.得到的结果就是生成器
4.借助与next(),__next__得到元素
'''
# def func():
# n = 0
# while True:
# n += 1
# print(n)
# yield n # return n + 暂停
#
#
# a = func()
# next(a)
# next(a)
# next(a)
# a.__next__()
def fib(length):
a, b = 0, 1
n = 0
while n < length:
# print(b)
yield b
a, b = b, a + b
n += 1
return '没有更多元素了!!!' # return就是在得到StopIteration后的提示
g = fib(10)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print(next(g))
# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 13:46
# @Author : Wans
# @File : generator03.py
# @Sofware : PyCharm
'''
生成器方法:
__next__(): 获取下一个元素
send(value): 向每次生成器调用中传值 注意:第一次调用send(None)
'''
def gen():
i = 0
while i < 5:
temp = yield i
print('temp', temp)
for x in range(temp):
print('---------', x)
i += 1
return '没有更多的数据了'
g = gen()
# print(next(g))
# print(next(g))
g.send(None)
n1 = g.send(5)
n2 = g.send(5)
print(n1)
# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 16:48
# @Author : Wans
# @File : generator04.py
# @Software : PyCharm
# 进程>线程>协程
# 迅雷:
def task1(n):
for i in range(n):
print('正在搬第{}块砖'.format(i + 1))
yield None
def task2(i):
for i in range(i):
print('正在听第{}首歌'.format(i + 1))
yield None
g1 = task1(5)
g2 = task2(5)
while True:
# next(g1)
# next(g2)
try:
g1.__next__()
g2.__next__()
except:
break
'''
生成器:generator
定义生成器方式:
1.通过列表推导式的方式
g = (x+1 for x in rang(6))
2.复杂+yield
def func():
...
yield
g = func()
产生元素:
1.next(generator) ----》每次调用都会产生一个新的元素,如果元素产生完毕,再次调用的话就会产生异常
2.生成器自己的方法:
g.__next__()
g.send(value)
应用:协程
'''
# -*- codeing = utf-8 -*-
# @Time : 2021/10/31 0:28
# @Author : Wans
# @File : list01.py
# @Sofware : PyCharm
# 列表推导式
# 旧的列表-----》新的列表
# 1、列表推导式: 格式:[表达式 for 变量 in 旧列表] 或者 [表达式 for 变量 in 旧列表 if 条件]
# 过滤掉长度小于或者等于3的人名
names = ['tome', 'lily', 'abc', 'jack', 'steven', 'bob']
result = [name.capitalize() for name in names if len(name) > 3]
print(result)
# 将1-100之间能被3整除,组成一个新列表
nwelist = [i for i in range(1, 101) if i % 3 == 0 and i % 5 == 0]
print(nwelist)
# [(偶数,奇数),(),(),()] [(0,1),(0,3),(0,5)]
nwelist1 = [(i, j) for i in range(5) if i % 2 == 0 for j in range(10) if j % 2 != 0]
print(nwelist1)
# list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 3, 5]] ---->[3 ,6 , 9, 5]
list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 3, 5]]
nwelist2 = [i[-1] for i in list1]
print(nwelist2)
dict1 = {'name': 'tom', 'salart': 5000}
dict2 = {'name': 'lucy', 'salart': 8000}
dict3 = {'name': 'jack', 'salart': 4500}
dict4 = {'name': 'lily', 'salart': 3000}
list1 = [dict1, dict2, dict3, dict4]
# 如果薪资大于5000加200,低于等于5000加500
nwelist1 = [employee['salart'] + 300 if employee['salart'] > 5000 else employee['salart'] + 500 for employee in list1]
print(nwelist1)
'''
def func(names)
newlist=[]
for name in names:
if len(name)>3:
newlist.append(name)
return newlist
print(func())
def func()
newlist = []
for i in range(5): # 偶数
if i % 2 == 0:
for j in range(10):
if j % 2 != 0:
newlist.append((i,j))
print(func())
'''
# 集合推导式
list1 = [1, 2, 3, 4, 1, 4, 5, 2, 1, 8, 9, 9]
set1 = {x for x in list1 if x > 5}
print(set1)
# 字典推导式
dict1 = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}
newdict = {value: key for key, value in dict1.items()}
print(newdict)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Wans!
评论
TwikooGitalk