生成器与列表推导式

生成器

本质就是迭代器,他是python自己用代码写的迭代器

用以下两种方式构建一个生成器
  1.通过生成器表达式
  2.声称器表达式
生成器函数
# def func(x):
#     x+=1
#     print(111)
#     print(111)
#     yield x
#     x+=2
#     print(222)
#     yield 'alex'
#     x+=3
# g_obj=func(5)
# print(g_obj)
# print(g_obj.__next__())
# print(g_obj.__next__())
# 一个next对应一个yield
# yield将值返回给 生成器对象.__next__()


return 结束函数,给函数的执行者一个返回值yield
不会结束函数,一个next 对应一个yield,
给生成器对象.__next__()返回值

生成器迭代器的区别
  生成器函数,vs迭代器
  区别1:自定制的区别

# l1=[1,2,3,4,5]
# print(l1.__iter__())

# def func1(x):
#     x+=1
#     yield x
#     x+=3
#     yield x
#     x+=5
#     yield x
# g1 =func1(5)
# print(g1.__next__())
# print(g1.__next__())
# print(g1.__next__())
内存级别的区别
  迭代器需要可迭代对象进行转化,可迭代对象非常占内存
  生成器直接创建,不需要转化,从本质上就节省内存


 send 与next

# def func1():
#     print(1)
#     count=yield 6
#     print(count)
#     print(2)
#     count1=yield 7
#     print(count1)
#     print(3)
#     yield 8
# g=func1()
# # print(func1())
# next(g)
# g.send('alex')
# g.send('alex')
# print()
# g.send('太白')
# g.send('太白')
·send 与next一样,也是对生成器取值,(执行一个yield,取一次值)的方法
send可以给上一个yield 传值
第一次取值永远都是next
最后一个yield 永远也得不到send传的值


# def cloth1(n):
# #     for i in range(n+1):
# #         print('衣服%s号' %i)
# # cloth1(10000)

# def cloth2(n):
#     for i in range(1,n+1):
#         yield '衣服的%s号' % i
# g=cloth2(10000)
# for i in range(50):
#     print(g.__next__())
# for i in range(50):
#     print(g.__next__())

列表推导式

列表推导式:一行代码几乎搞定你需要的任何列表
循环模式,[变量 (加工后的变量) for 变量 in iterable]
# li=[i for i in range(1,101)]
# print(li)
 筛选模式,[变量 (加工后的变量) for 变量 in iterable if 条件]

# l1=[i for i in range(1,31) if i%3==0]
# # print(l1)
 列表推导式
优点:一行解决,方便
缺点:不易排错,不能超过3次循环

 生成器表达式:将列表推导式的[]换成()即可
 
# g=(i for i in range(100))
# print(g)
# print(g.__next__())
# print(g.__next__())
 字典推导式
字典的键和值对调

# mcase={'a':10,'b':34}
# # mcase_frequency={mcase[k]:k for k in mcase}
# # print(mcase)

# squared={x**2 for x in [1,-1,2]}
# print(squared)



猜你喜欢

转载自www.cnblogs.com/ning-123/p/9508612.html
今日推荐