python基础15下_迭代器_生成器
print(dir([])) #告诉我列表拥有的所有方法
# 双下方法
# print([1].__add__([2]))
print([1]+[2]) ret = set(dir([]))&set(dir({}))&set(dir(''))&set(dir(range(10)))
print(ret) #iterable print('***'.center(50,'-'))
# 只要是能被for循环的数据类型 就一定拥有__iter__方法
print('__iter__' in dir(int))
print('__iter__' in dir(bool))
print('__iter__' in dir(list))
print('__iter__' in dir(dict))
print('__iter__' in dir(set))
print('__iter__' in dir(tuple))
print('__iter__' in dir(enumerate([])))
print('__iter__' in dir(range(1))) # Iterable 可迭代的 -- > __iter__ # 只要含有__iter__方法的都是可迭代的
# [].__iter__() 迭代器 -- > __next__ # 通过next就可以从迭代器中一个一个的取值 # 只要含有__iter__方法的都是可迭代的 —— 可迭代协议 # 迭代器的概念
# 迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器 # 迭代器协议和可迭代协议
# 可以被for循环的都是可迭代的
# 可迭代的内部都有__iter__方法
# 只要是迭代器 一定可迭代
# 可迭代的.__iter__()方法就可以得到一个迭代器
# 迭代器中的__next__()方法可以一个一个的获取值 from collections import Iterable
from collections import Iterator
print('****'.center(50,'_'))
print(isinstance([],Iterator)) # False 不是迭代器
print(isinstance([],Iterable)) # True 是可迭代的 #迭代器的好处:
# 从容器类型中一个一个的取值,会把所有的值都取到。
# 节省内存空间
#迭代器并不会在内存中再占用一大块内存,
# 而是随着循环 每次生成一个
# 每次next每次给我一个
# 生成器 —— 迭代器
# 生成器函数 —— 本质上就是我们自己写得函数
# 生成器表达式 #只要含有yield关键字的函数都是生成器函数
# yield不能和return共用且需要写在函数内
def generator():
print(1)
yield 'a' # #生成器函数 : 执行之后会得到一个生成器作为返回值
ret = generator() # 拿到生成器
print(ret) # 打印内存地址
print(ret.__next__()) # 执行函数体,直到遇到 yield def generator2():
print(111)
yield 'aaa'
print(222)
yield 'bbb'
yield 'ccc'
g = generator2()
# for i in g:
# print(i)
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret)
ret = g.__next__()
print(ret) #娃哈哈%i
def wahaha():
for i in range(2000000):
yield '娃哈哈%s'%i
g = wahaha()
g1 = wahaha() # 两个独立的生成器
print(g.__next__())
print(g.__next__())
print(g1.__next__())
print(g1.__next__()) gg = wahaha()
count = 0
for i in gg:
count +=1
print(i)
if count > 50:
break print('*******',gg.__next__()) # 生成器继续前面的往下走 for i in gg: # 生成器继续前面的往下走
count +=1
print(i)
if count > 100:
break
生成器与send方法
# 从生成器中取值的几个方法
# next
# for
# 数据类型的强制转换 : 缺点:占用内存 def generator():
print(123)
content = yield 1
print('=======',content)
print(456)
arg = yield 2
''''''
yield
g1 = generator()
g2 = generator()
g1.__next__()
g2.__next__()
print('>>>>>',generator().__next__())
print('***',generator().__next__()) g = generator()
ret = g.__next__()
print('***',ret)
ret = g.send('hello') # send的效果和next一样, 但是多了传递数据的功能
print('***',ret) # send 获取下一个值的效果和next基本一致
# 只是在获取下一个值的时候,给上一yield的位置传递一个数据
# 使用send的注意事项
# 第一次使用生成器的时候 是用next获取下一个值
# 最后一个yield不能接受外部的值
def generator():
print(123)
content = yield 1
print('=======', content)
print(456)
yield 2
''''''
yield g = generator()
ret = g.__next__()
print('+++', ret)
res = g.send('hello') # send的效果和next一样
print('--->', res) # send 获取下一个值的效果和next基本一致
# 只是在获取下一个值的时候,给上一yield的位置传递一个数据
# 使用send的注意事项
# 第一次使用生成器的时候 是用next获取下一个值
# 最后一个yield不能接受外部的值 # 案例应用: 获取移动平均值
# 10 20 30 10
# 10 15 20 17.5
# avg = sum/count def avgs():
sum = 0
cnt = 0
avg = 0
while True:
num = yield avg
sum += num
cnt += 1
avg = sum / cnt g = avgs()
g.__next__()
avg1 = g.send(10)
avg1 = g.send(8)
print(avg1)
avg2 = g.send(6)
print(avg2)
利用生成器来监视文件内容:
# 文件内容监视
def tail(filename):
with open(filename,encoding='utf8') as f:
while 1:
line = f.readline()
if line.strip():
# print(line)
yield line.strip() g = tail('file')
for i in g:
if 'python' in i:
print('***',i)
给生成器函数加上装饰器,省掉一步 __next__()
# 预激生成器的装饰器
def init(func): # 装饰器
def inner(*args, **kwargs):
g = func(*args, **kwargs) # g = average()
g.__next__()
return g return inner @init
def average():
sum = 0
count = 0
avg = 0
while True:
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)
直接 yield from
def gen():
a = 'abcdef'
b = ''
yield from a # 直接对容器类型生成器
yield from b g = gen()
# for i in g:
# print(i) print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
两个生成器的小例子:
# 3.处理文件,用户指定要查找的文件和内容,将文件中包含要查找内容的每一行都输出到屏幕
def check_file(filename, txt):
with open(filename, encoding='utf8') as f:
for i in f:
if txt in i:
yield i g = check_file('a.txt', '正当防卫')
for i in g:
print(i.strip()) # 4.写生成器,从文件中读取内容,在每一次读取到的内容之前加上‘***’之后再返回给用户。
def read_file(filename):
with open(filename, encoding='utf-8') as f: # 句柄 : handler,文件操作符,文件句柄
for i in f:
yield '***' + i for i in read_file('a.txt'):
print(i.strip())
生成器表达式遇到循环
def demo():
for i in range(4):
yield i g = demo() g1 =(i for i in g)
g2 =(i for i in g1)
# 以上所有都没干活 # print(list(g)) # 如果这里list了,则下面两个都取不到值,因为已经空了。
print(list(g1)) # list 取走了所有 g1 的值
print(list(g2)) # g2 已经空了,没有值 #### 生成器表达式 循环
def add(n,i):
return n+i def test():
for i in range(4):
yield i g=test()
for n in [1,10,5]:
g=(add(n,i) for i in g) # 遇到上面的for循环生成器表达式,就把它拆开如下:
# n = 1
# g=(add(n,i) for i in test())
# n = 10
# g=(add(n,i) for i in (add(n,i) for i in test()))
# n = 5
# g=(add(n,i) for i in (add(n,i) for i in (add(n,i) for i in test())))
# 上面一句的结果 g=(15,16,17,18) print(list(g)) # [15,16,17,18]
python基础15下_迭代器_生成器的更多相关文章
- Py修行路 python基础 (十一)迭代器 与 生成器
一.什么是迭代? 迭代通俗的讲就是一个遍历重复的过程. 维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代.具体对应到Python编程中就是 ...
- Python 基础 内置函数 迭代器与生成器
今天就来介绍一下内置函数和迭代器 .生成器相关的知识 一.内置函数:就是Python为我们提供的直接可以使用的函数. 简单介绍几个自己认为比较重要的 1.#1.eval函数:(可以把文件中每行中的数据 ...
- python基础(8)--迭代器、生成器、装饰器
1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...
- python基础(八)-迭代器与生成器
一.迭代器 li=[1,2,3] f=li.__iter__() print(f) print(f.__next__()) print(f.__next__()) print(f.__next__() ...
- 2015/9/19 Python基础(15):变量作用域及生成器
变量作用域标识符的作用域是定义为其声明的可应用范围,或者即是我们所说的变量可见性.也就是,我们可以在程序的那个部分去访问一个制定的标识符.全局变量与局部变量定义在函数内的变量有局部作用域,在一个模块中 ...
- Python基础(8)迭代器、生成器
一 什么是迭代 1 重复 2 下一次重复是基于上一次的结果 # while True: # cmd=input('>>: ') # print(cmd) # l=['a','b','c', ...
- day18_文件处理_迭代器_生成器
#!/usr/bin/env python # -*- coding:utf-8 -*- # ********************day18_文件处理_迭代器_生成器 ************** ...
- 十五. Python基础(15)--内置函数-1
十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...
- Python可迭代对象、迭代器和生成器
Python可迭代对象.迭代器和生成器 python 函数 表达式 序列 count utf-8 云栖征文 python可迭代对象 python迭代器 python生成器 摘要: 8.1 可迭代对象( ...
随机推荐
- 关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面
Ocelot 路由 请求聚合 服务发现 认证 鉴权 限流熔断 内置负载均衡器 Consul 自动服务发现 健康检查 通过Ocelot搭建API网关 服务注册 负载均衡 1. ...
- linux命令 xxd
xxd,能够查看linux下文件的二进制表示.man一下xxd.能够得到下面信息 NAME xxd - make a hexdump or do the reverse. SYNOPSIS ...
- Spring Boot 配置加载顺序详解
使用 Spring Boot 会涉及到各种各样的配置,如开发.测试.线上就至少 3 套配置信息了.Spring Boot 可以轻松的帮助我们使用相同的代码就能使开发.测试.线上环境使用不同的配置. 在 ...
- opencv使用总结
在resize矩阵时出现报错 (-215) func != 0 in function cv::resize" 很可能是矩阵未设置为float,应该在读入后转换类型 item = item. ...
- cron定时任务
1.确认系统安装了cron rpm -aq | grep crontabs 2.认识cron时间格式 3.生成定时任务 crontab -e #进入任务命令编辑模式 30 7,12,20 * * * ...
- nodeJs安装Vue-cli
1,安装nodejs安装包,注意安装的路径 2,安装完成node,node有自带的npm,可以直接在cmd中,找到nodeJs安装的路径下,进行命令行全局安装vue-cli.(npm install ...
- python----数据驱动ddt的使用
一.安装ddtpip install ddt 二.数据驱动和代码驱动数据驱动:根据你提供的数据来进行测试,比如接口自动化测试框架ATP代码驱动:必须得写代码才能测试,比如unittest 三.使用数据 ...
- ORACLE相关函数使用总结
1. 2018年12月12日 12时12分 这种时间格式怎么转成2018-12-12 12:12 解决: select regexp_replace(regexp_replace('2009年6月 ...
- IPFS扫盲
第二届深圳区块链技术与应用大会暨展览会,深圳区块链存储与IPFS技术应用大会暨展览会于2019年4月9日在深圳会展中心6号馆举行.那么这个IPFS是什么?和区块链有什么关系?有什么用?又怎么用呢?接下 ...
- padding属性很有用
html代码中的text-align有时失效,特别是用bootstrap时,用padding-left:xx%,能够很好定位,而且只能够电脑和手机浏览器显示的统一.