# 迭代器和生成器

# 迭代器

# 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的

# 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir(数据) )

# 可迭代的一定可以被for循环

# 迭代器协议:含有__iter__、__next__的方法

# 迭代器一定可迭代,可迭代的通过调用iter()方法就能得到一个迭代器

# 迭代器的特点:

# 很方便使用,且只能取所有的数据取一次

# 节省内存空间

# 生成器

# 生成器的本质就是迭代器

# 生成器的表现形式

# 生成函数

# 生成器表达式

# 生成器函数:

# 含有yield关键字的函数就是生成器函数

# 特点:

# 调用函数之后函数不执行,返回一个生成器

# 调用next方法的时候会取到一个值

# 直到取完最后一个,再执行next会报错

# def generator():

# for i in range(2000000):

# yield '娃哈哈%s'%i

# g = generator() # 调用生成器函数得到一个生成器

# ret = g.__next__() # 每一次执行g.__next__就是从生成器中取值,预示着生成器函数中的代码继续执行

# print(ret)

# num = 0

# for j in g:

# num += 1

# if num > 50:

# break

# print(j)

# 从生成器中取值的几个方法

# next

# for

# 数据类型的强制转换:占用内存

def generator():

for i in range(20):

yield '娃哈哈%s' % i

g = generator() # 调用生成器函数得到一个生成器

print(list(g)) # 强制转换需要在全部运行完之后才打印

def generator():

print(123)

content = yield 1

print('=====',content)

print(456)

yield 2

print(789)

g = generator()

print('*',g.__next__())

print('**',g.send('hello'))

# print('**',g.send(None)) # send的效果和next一样

# print('***',g.__next__())

# print('*****',g.__next__())

# send 获取下一个值的效果和next基本一致

# 只是在获取下一个值的时候,给上一个值的位置传递一个数据

'''

其实next()和send()在一定意义上作用是相似的

区别是send()可以传递yield表达式的值进去,而next()不能传递特定的值,只能传递None进去

因此,我们可以看做c.next() 和 c.send(None) 作用是一样的

需要提醒的是,第一次调用时,请使用next()语句或是send(None),不能使用send发送一个非None的值,否则会出错

最后一个yield不能接受外部的值

'''

# 获取移动平均值

# 比如:计算最近7天的平均值

# def average():

# sum = 0

# count = 0

# avg = 0

# while 1:

# # num = yield

# num = yield avg

# sum += num

# count += 1

# avg = sum/count

#

# avg_g = average()

# avg_g.send(None) # avg_g.__next__()

# print(avg_g.send(10))

# print(avg_g.send(20))

def init(func): # 装饰器 func ==average

def inner(*args,**kwargs):

g = func(*args,**kwargs) # g = average()

g.__next__()

return g

return inner

@init # average == init(average) == inner

def average():

sum = 0

count = 0

avg = 0

while 1:

# num = yield

num = yield avg

sum += num

count += 1

avg = sum/count

avg_g = average() # --> inner

ret = avg_g.send(10)

print(ret)

ret = avg_g.send(20)

print(ret)

# python 3

# def generator():

# a = 'abcde'

# b = '12345'

# for i in a:

# yield i

# for i in b:

# yield i

# g = generator()

# for i in g:

# print(i)

def generator():

a = 'abcde'

b = '12345'

yield from a

yield from b

g = generator()

for i in g:

print(i)

# 回顾

# send

# send的作用范围和next一样

# 第一次不能用send

# 函数中的最后一个yield不能接收新的值

# 计算移动平均值的例子

# 预激生成器的装饰器的例子

# yield from

# 列表推导式

# egg_list = ['鸡蛋%s'%i for i in range(10)] # 列表推导式

# print(egg_list)

# egg_list = []

# for i in range(10):

# egg_list.append('鸡蛋%s'%i)

# print(egg_list)

print([i for i in range(10)]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print([i*2 for i in range(10)]) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# 生成器表达式

g = (i for i in range(10)) # g是一个生成器

print(g)

for i in g:

print(i)

# 两者不同点:

# 括号不一样

# 返回值不一样 --> 生成器表达式几乎不占用内存

老母鸡 = ('鸡蛋%s'%i for i in range(10)) # 老母鸡是一个生成器

print(老母鸡)

for 蛋 in 老母鸡:

print(蛋)

g = (i*i for i in range(10))

for i in g:

print(i)

# 列表推导式

# [每一个元素或是和元素相关的操作 for 元素 in 可迭代数据类型] # 遍历之后挨个处理

# [满足条件才进行操作的元素 for 元素 in 可迭代数据类型 if 元素相关的条件 ] # 筛选功能

# 1. 30以内所有能被3整除的数

s_list = [i for i in range(30) if i % 3 ==0] # 完整的列表推导式

print(s_list)

#2. 30以内所有能被3整除的数的平方

ret = [i*i for i in range(30) if i % 3 == 0]

print(ret)

# 3. 找到嵌套列表中名字含有两个‘e’的所有名字

names = [

['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],

['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']

]

find_name = [i for list1 in names for i in list1 if i.count('e') == 2]

print(find_name)

# 字典推导式

# 1. 将一个字典的key和value对调

mcase = {'a': 10, 'b': 34}

dic = {mcase[k]:k for k in mcase}

print(dic)

# 2. 合并大小写对应的value值,将k统一成小写

mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}

# mcase = {'a': 10 + 7, 'b': 34, 'z': 3}

mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}

mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase}

print(mcase_frequency)

# 集合的推导式

# 1. 计算列表中每个值的平方,自带去重功能

squared = {x*x for x in [1, -1, 2]}

print(squared)

# 没有元组推导式

# 各种推倒时:生成器 列表 字典 集合

# 遍历操作

# 筛选操作

老男孩python第14期_python学习之老男孩python全栈第九期_day014知识点总结相关推荐

  1. python学习之老男孩python全栈第九期_day002作业

    1. 判断下列逻辑语句的True,False. (1) 1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6 T ...

  2. python复制列表元素_Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解...

    Python学习教程:Python列表赋值,复制,深拷贝及5种浅拷贝详解 概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅 ...

  3. 老男孩python第九期_python学习之老男孩python全栈第九期_day009作业

    1. 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. 答: 1 l1 =[]2 defodd(li):3 for i in range(1,len(li) ...

  4. 老男孩python第九期_python学习之老男孩python全栈第九期_day004知识点总结

    1. 列表list: 列表转换成字符串: s = 'kidd' s1 = '_'.join(s) # 用_连接 字符串转换成列表: split() range(头,尾,步长):[0,1,2,3,4,5 ...

  5. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块...

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  6. python学习之老男孩python全栈第九期_数据库day004 -- 作业

    https://www.cnblogs.com/YD2018/p/9451809.html 11. 查询学过"001"并且也学过编号"002"课程的同学的学号. ...

  7. python学习之老男孩python全栈第九期_day024知识点总结——单继承、多继承

    一. 单继承 class A:pass # 父类,也叫基类,也叫超类 class B:pass # 父类,也叫基类,也叫超类 class AB_son(A,B):pass # 子类,也叫派生类 cla ...

  8. python学习之老男孩python全栈第九期_day004知识点总结

    1. 列表list: 列表转换成字符串: s = 'kidd' s1 = '_'.join(s) # 用_连接 字符串转换成列表: split() range(头,尾,步长): [0,1,2,3,4, ...

  9. python学习之老男孩python全栈第九期_day017作业

    1. 三级菜单的代码看一遍 2. 斐波那契数列用递归实现:问第n个斐波那契数是多少 1 def fbnq(n): 2 if n == 0 or n == 1: 3 return 1 4 else: 5 ...

最新文章

  1. cropper.js 图像旋转问题_JavaScript开源良心插件,纯前端网页图片剪裁插件——cropperjs...
  2. 嵌入式linux如何下载程序,Linux平台的下载程序-嵌入式系统-与非网
  3. linux 无响应_系统加固之Linux安全加固
  4. countanddown java_Java多线程之CountDownLatch
  5. PAT-甲级之树遍历问题的总结
  6. POJ 1064 Cable master (二分答案)
  7. 区块链:Ethereum Casper 101
  8. Linux命令之MD5校验md5sum
  9. cad的文字嵌入线条_CAD字体如何转变为线条
  10. ViewPager翻页动画失效详解
  11. Android使用AIUI快速搭建智能助手
  12. android 各类demo链接
  13. 如何在vmlogin中设置易路代理yiluproxy?
  14. SSM网上书店管理系统毕业设计源码082255
  15. 【前端知识之webpack】Loader和Plugin都是什么,有什么区别
  16. kill -9 进程 杀掉僵死进程
  17. Qt常用轮子合集(带使用Demo)
  18. awatch gps 离线使用喜马拉雅
  19. 计算机与农业机械化,计算机与农业机械化的相关性研究.pdf
  20. python ppt 图片_Python PPT 转化为图片 支持拼接成一张图片

热门文章

  1. Unity中实现放大镜的功能
  2. 计算机组成原理包健百度云,计算机组成原理包健版答案及解析.doc
  3. 游戏特效贴图的制作与应用
  4. XFINIUM.PDF CROSS-PLATFORM BUNDLE 11.1.2
  5. 根据经纬度求遥感影像行列号 IDL 编程
  6. 解决asp.net FileUpload控件无法获取完整路径的问题 - 无序修改浏览器参数
  7. HDOJ 4466 Triangle 递推
  8. 微软enchange服务器安装,安装 Exchange Server 2010
  9. Satpy基础系列教程(1)-FY4A AGRI L1数据处理
  10. Java开发之ServLet详解