python开发函数进阶:可迭代的&迭代器&生成器
一,可迭代的&可迭代对象
1.一个一个的取值就是可迭代的 iterable
#str list tuple set dict
#可迭代的 ——对应的标志 __iter__
2.判断一个变量是不是一个可迭代的
# print('__iter__' in dir(list))
# print('__iter__' in dir([1,2,3]))
3.可迭代协议——凡是可迭代的内部都有一个__iter__方法
二,迭代器
1.将可迭代的转化成迭代器
#!/usr/bin/env python
#_*_coding:utf-8_*_ # iterator #迭代器
# iterator iterable#可迭代对象
l = [1,2,3,4,5]
for i in l:
print(i)
print(iter(l)) #内置函数 iter == l._iter_()
l.__iter__()
l_iterator = iter(l)
print(set(dir(l_iterator))-set(dir(l)))
print(next(l_iterator)) #迭代器就要通过next方法取值
2.迭代器小结
#迭代器里既有iter方法,又有next方法 ——迭代器协议
#通过iter(o)得到的结果就是一个迭代器,
#o是一个可迭代的
#迭代器 大部分都是在python的内部去使用的,我们直接拿来用就行了
#迭代器:内置__iter__和__next__方法
#!/usr/bin/env python
#_*_coding:utf-8_*_ l = [1,2,3,4,5]
l_iterator = iter(l)
print(l_iterator.__next__())
print(l_iterator.__next__())
print(l_iterator.__next__())
print(l_iterator.__next__())
print(l_iterator.__next__())
next(l_iterator) #==l_iterator.__next__()
# while True: 自己写相当于for循环
# try:
# print(next(l_iterator))
# except StopIteration:
# break
3.判断是否是迭代器 和 可迭代对象的简便方法
#!/usr/bin/env python
#_*_coding:utf-8_*_ from collections import Iterable
from collections import Iterator
# s = 'abc'
# print(isinstance(s,Iterable)) s 是不是一个可迭代对象
# print(isinstance(s,Iterator)) s 是不是一个迭代对象
# print(isinstance(iter(s),Iterator))
4.可迭代的和迭代器
#不管是一个迭代器还是一个可迭代对象,都可以使用for循环遍历
#迭代器出现的原因 帮你节省内存
三,生成器
#生成器函数
#生成器的本质就是迭代器
#!/usr/bin/env python
#_*_coding:utf-8_*_ def func():
print('aaaa')
a = 1
yield a #返回第一个值
print('bbbb')
yield 12 #返回第二个值
#错误取值,相当于三个新的生成器
# print(next(func() )) #取第一个值
# print(next(func() )) #取第一个值
# print(next(func() )) #取第一个值
#正确取值,都是同一个生成器
# ret = func() #拿到一个生成器
# # print(ret)
# print(next(ret)) #取第一个值
# print(next(ret)) #取第二个值
# print(next(ret)) #取第三个值 会报错 因为没有第三个值
3,1 生成器做衣服实例
#/usr/bin/env python
#_*_coding:utf-8_*_ def make_cloth():
for i in range(2000000):
yield "第%s件衣服"%i
# szq = make_cloth()
# print(next(szq))
# print(next(szq))
#
# print(next(szq))
# for i in range(50):
# print(next(szq))
3.2 监听文件实例
#!/usr/bin/env python
#_*_codingLutf-8_*_ #监听文件 tail -f
import time
def tail(filename):
with open(filename) as f:
f.seek(0, 2) #从文件末尾算起
while True:
line = f.readline() # 读取文件中新的文本行
if not line:
time.sleep(0.1)
continue
yield line # for line in tail('tmp_file'):
# print(line,end = '')
3.3 计算移动平均值
#!/usr/bin/env python
#_*_coding:utf-8_*_ #7日平均年化收益
def averager():
total = 0
day = 0
avrage = 0
while True:
day_num = yield avrage #return avrage
total += day_num
day += 1
avrage = total/day # avg = averager()
# num = next(avg) #激活生成器 avg.send(),什么都不send和next效果一样
# print(avg.send(10)) #传值 next
# print(avg.send(20))
3.4 带装饰器的生成器
#!/usr/bin/env python
#_*_codingLutf-8_*_ def wrap(func):
def inner(*args,**kwargs):
g = func(*args,**kwargs)
next(g)
return g
return inner @wrap
def averager():
total = 0
day = 0
avrage = 0
while True:
day_num = yield avrage #return avrage
total += day_num
day += 1
avrage = total/day # g = averager()
# print(g.send(10))
# print(g.send(20))
python开发函数进阶:可迭代的&迭代器&生成器的更多相关文章
- 11.Python初窥门径(函数名,可迭代对象,迭代器)
Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
- python开发函数进阶:生成器表达式&各种推导式
一,生成器表达式 #生成器表达式比列表解析更省内存,因为惰性运算 #!/usr/bin/env python #_*_coding:utf-8_*_ new_2 = (i*i for i in ran ...
- python开发函数进阶:内置函数
一,内置函数 #内置的模块#拿过来直接就用的:内置的函数 #!/usr/bin/env python #_*_coding:utf-8_*_ #内置的模块 #拿过来直接就用的:内置的函数 #作用域相关 ...
- python开发函数进阶:装饰器
一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离. 解耦目的,提高代码的重用性 二,设计模式 开放封闭原则 ...
- python开发函数进阶:匿名函数
一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...
- python开发函数进阶:递归函数
一,什么叫递归 #递归#在一个函数里调用自己#python递归最大层数限制 997#最大层数限制是python默认的,可以做修改#但是我们不建议你修改 例子和尚讲故事 #!/usr/bin/env p ...
- python开发函数进阶:命名空间,作用域,函数的本质,闭包,作用域方法(globales)
一,命名空间 #局部命名空间#全局命名空间#内置命名空间 #三者的顺序#加载顺序 内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程 ...
- 【转】Python之函数进阶
[转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...
- 可迭代对象&迭代器&生成器
在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...
随机推荐
- DOCKER实战案例
操作系统:[root@yz6205 ~]# docker search busyboxNAME DESCRIPTION STARS OFFICIAL AUTOMATEDbusybox Busybox ...
- Huffman编码实现文件的压缩与解压缩。
以前没事的时候写的,c++写的,原理很简单,代码如下: #include <cstdio> #include <cstdlib> #include <iostream&g ...
- 《转》浅谈EJB
ejb一直是一个让我很纠结的技术,虽然ejb作为sun推荐的最佳实践,在sun的J2EE教程中,推荐jsp和servlet作为view层,ejb作为业务逻辑层. 上述就是J2EE教程讲J2EE体系中J ...
- react-redux: modal
1.actionTpye export const INCREMENT = 'INCREMENT'; export const DECREMENT = 'DECREMENT'; export cons ...
- 【dlbook】深度网络
前向网络:无反馈 feedback 连接 [输出单元] 线性 -- 高斯分布 . sigmoid单元 -- bernoulli输出. softmax单元 -- multinoulli [隐藏单元] 整 ...
- 背景色与WM_ERASEBKGND
1.背景模式 SetBkMode(TRANSPARENT/OPACITY) 用来反应文字,图形与窗口背景交互混合模式.透明则表示文字背景与窗口背景之间透明,互不干扰. 2.背景颜色 SetBkColo ...
- 看过自会理解, Photon Server 常见概念分析.
http://stackoverflow.com/questions/10823915/photon-server-newbie-questions/11653419#11653419 Channel ...
- 跟我学Delphi Xe4 开发 IOS 一 , 重读Delphi Xe4 自带文档.
安装了 Delphi Xe4 之后打开这个地址就是完整的官方的文档了. 虽然不是立刻能解决你的问题. 但也是必须要看一遍的. 最基础的都在这里了. ms-help://embarcadero.rs_x ...
- 旧书重温:0day2【10】第五章 堆溢出利用2
好久没有发帖子啦!最近一直很忙!但是还是抽空学习啦下! 前段时间匆匆忙忙的把0day2上的堆溢出实验做啦! 可能当时太浮躁啦,很多细节没注意!结果:实验结果很不满意!所以就有啦这一篇!! 上一篇是发布 ...
- iOS6和iOS7代码的适配(5)——popOver
popOver这个空间本身是iPad only的,所以iPhone上见不到,我记得微信上有个这样的弹出框,有扫一扫等几个菜单项,估计这是腾讯自己实现的,用于菜单的扩展. popOver从iOS6到iO ...