一,可迭代的&可迭代对象

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开发函数进阶:可迭代的&迭代器&生成器的更多相关文章

  1. 11.Python初窥门径(函数名,可迭代对象,迭代器)

    Python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...

  2. python开发函数进阶:生成器表达式&各种推导式

    一,生成器表达式 #生成器表达式比列表解析更省内存,因为惰性运算 #!/usr/bin/env python #_*_coding:utf-8_*_ new_2 = (i*i for i in ran ...

  3. python开发函数进阶:内置函数

    一,内置函数 #内置的模块#拿过来直接就用的:内置的函数 #!/usr/bin/env python #_*_coding:utf-8_*_ #内置的模块 #拿过来直接就用的:内置的函数 #作用域相关 ...

  4. python开发函数进阶:装饰器

    一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离. 解耦目的,提高代码的重用性 二,设计模式 开放封闭原则 ...

  5. python开发函数进阶:匿名函数

    一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...

  6. python开发函数进阶:递归函数

    一,什么叫递归 #递归#在一个函数里调用自己#python递归最大层数限制 997#最大层数限制是python默认的,可以做修改#但是我们不建议你修改 例子和尚讲故事 #!/usr/bin/env p ...

  7. python开发函数进阶:命名空间,作用域,函数的本质,闭包,作用域方法(globales)

    一,命名空间 #局部命名空间#全局命名空间#内置命名空间 #三者的顺序#加载顺序       内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程 ...

  8. 【转】Python之函数进阶

    [转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...

  9. 可迭代对象&迭代器&生成器

    在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...

随机推荐

  1. shell read

    #!/bin/bash read -p "Enter your account:" acct #提示用户输入用户名read -s -p "Enter your passw ...

  2. python中zip()函数的用法

    一. 定义 zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少内存 如果各个迭代器的元素个数不一致,则返回列表长度与最 ...

  3. [转载]java操作word生成水印

    应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...

  4. asp.net获取URL和IP地址

    (转自:http://www.cnblogs.com/JuneZhang/archive/2010/11/26/1888863.html) HttpContext.Current.Request.Ur ...

  5. LeetCode OJ:Set Matrix Zeroes(设置矩阵0元素)

    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 这题要注意的 ...

  6. request对象和response对象,什么时候用,具体用哪一个,没有感觉

    request对象和response对象,什么时候用,具体用哪一个,没有感觉

  7. macOS Ruby版本需要升级到2.2.2以上

    在安装 Ruby on Rails 时遇到问题,提示依赖 ruby 2.2.2 或更高的版本. ERROR: Error installing rails: activesupport require ...

  8. 《深入理解java虚拟机》学习笔记之编译优化技术

    郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释 ...

  9. (一)Nginx正向代理与反向代理

    引言:身为前端开发人员来说对于Nginx的作用或许很少听到,这个东西是后端使用的,Nginx对前端而言意味着什么,有什么用呢?大白会整理出几篇文章给大家细细道来. 1.正向代理的概念 正向代理,也就是 ...

  10. BZOJ - 2460 :元素 (贪心&线性基)

    相传,在远古时期,位于西方大陆的 Magic Land 上,人们已经掌握了用魔法矿石炼制法杖的技术.那时人们就认识到,一个法杖的法力取决于使用的矿石.一般地,矿石越多则法力越强,但物极必反:有时,人们 ...