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下_迭代器_生成器的更多相关文章

  1. Py修行路 python基础 (十一)迭代器 与 生成器

    一.什么是迭代? 迭代通俗的讲就是一个遍历重复的过程. 维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代.具体对应到Python编程中就是 ...

  2. Python 基础 内置函数 迭代器与生成器

    今天就来介绍一下内置函数和迭代器 .生成器相关的知识 一.内置函数:就是Python为我们提供的直接可以使用的函数. 简单介绍几个自己认为比较重要的 1.#1.eval函数:(可以把文件中每行中的数据 ...

  3. python基础(8)--迭代器、生成器、装饰器

    1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优 ...

  4. python基础(八)-迭代器与生成器

    一.迭代器 li=[1,2,3] f=li.__iter__() print(f) print(f.__next__()) print(f.__next__()) print(f.__next__() ...

  5. 2015/9/19 Python基础(15):变量作用域及生成器

    变量作用域标识符的作用域是定义为其声明的可应用范围,或者即是我们所说的变量可见性.也就是,我们可以在程序的那个部分去访问一个制定的标识符.全局变量与局部变量定义在函数内的变量有局部作用域,在一个模块中 ...

  6. Python基础(8)迭代器、生成器

    一 什么是迭代 1 重复 2 下一次重复是基于上一次的结果 # while True: # cmd=input('>>: ') # print(cmd) # l=['a','b','c', ...

  7. day18_文件处理_迭代器_生成器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ********************day18_文件处理_迭代器_生成器 ************** ...

  8. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  9. Python可迭代对象、迭代器和生成器

    Python可迭代对象.迭代器和生成器 python 函数 表达式 序列 count utf-8 云栖征文 python可迭代对象 python迭代器 python生成器 摘要: 8.1 可迭代对象( ...

随机推荐

  1. 学习笔记70—Photoshop画齿轮

    具体步骤如下: 1)选择多边形工具: 2)设置齿轮个数及颜色相应参数: 3)画出模型: 4)找到上图模型的中心 (借助:ctrl + T),选择椭圆工具,并 长按Shift+Alt, 画出圆: 5) ...

  2. NRF52832与W25Q80通信

    1 NRF52832SPI主机的功能描述 nRF52832SPIM的主要特征 3个SPI实例 支持SPI的模式0到模式3 支持DMA Individual selection of IO pin fo ...

  3. Python入门(二)列表、字典、字符串、元组、集合

    列表list什么是列表:Python内置的一种数据类型是列表,list是一种有序的集合,可以随时添加和删除其中的元素 创建List列表的方法 L = ['杨俊辰',‘啦啦啦’,'Tom'] empty ...

  4. js判断输入的input内容是否为数字

    有时候我们输入的input的内容需要判断一下是否是数字,所以为了更好的客户体验,在前端先处理一下: <input type="text" name="val&quo ...

  5. go安装和开发工具安装

    go适合做什么 l 服务端开发 l 分布式系统 l 网络编程 l 区块链开发 l 内存KV数据库,例如boltDB.levelDB l 云平台 一 go安装 官网:https://golang.goo ...

  6. 『计算机视觉』物体检测之RefineDet系列

    Two Stage 的精度优势 二阶段的分类:二步法的第一步在分类时,正负样本是极不平衡的,导致分类器训练比较困难,这也是一步法效果不如二步法的原因之一,也是focal loss的motivation ...

  7. 《SSO CAS单点系列》之 APP原生应用如何访问CAS认证中心

    4.开发支持APP登录的移动服务端接口.接收APP登录请求,采用HttpClient转发至CAS认证中心登录,返回json数据解析并最终返回给客户端.本地会话采用redis维护,登录成功,返回acce ...

  8. Matlab:双曲方程

    tic; clear clc M=[, ];%空间步数 N=*M;%时间步数 :length(M) h=/M(k);%空间步长 tau=/N(k);%时间步长 s=tau/h;%步长比 x=:h:; ...

  9. 微信小程序1rpx border ios真机显示不全问题

    无意间测试发现,把border的颜色的透明度颜色改成0.99就可以了.1就不行. 边框显示不全的写法: border:1rpx solid rgba(244,84,80,1); 将边框代码的透明度改成 ...

  10. C语言博客作业02——循环结构

    1.本章学习总结 1.1思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 本周学习了循环结构,在之前学习分支结构的时候就涉及到了循环结构中的for循环,这周的又新学了while和do- ...