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

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. 利用大数据技术处理海量GPS数据

    我秀中国物联网地图服务平台目前接入的监控车辆近百万辆,每天采集GPS数据7亿多条,产生日志文件70GB,使用传统的数据处理方式非常耗时. 比如,仅仅对GPS做一些简单的统计分析,程序就需要几个小时才能 ...

  2. python中配置文件的使用

    一. 什么是配置文件?为什么要做配置文件? 将所有的代码和配置都变成模块化可配置化,这样就提高了代码的重用性,不再每次都去修改代码内部,这个就是我们逐步要做的事情,可配置化 二. python中的Co ...

  3. 51nod 1279 单调栈

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279 1279 扔盘子 题目来源: Codility 基准时间限制:1 ...

  4. Node.js权威指南学习记录

    学习nodeJS权威指南的学习记录 导航: 1.console模块 2.全局变量 3.Buffer对象 4.事件对象 5.网络请求 6.文件操作对象 一. COMMON.js的学习.(commonJS ...

  5. OLED取模笔记

  6. zoj 3212 K-Nice(构造)

    K-Nice Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge This is a super simple pr ...

  7. LeetCode OJ:Remove Nth Node From End of List(倒序移除List中的元素)

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...

  8. Http权威指南(报文)

    1.报文的组成 报文由 起始行.首部.主体(可选)组成 请求报文: <method> <request-URL> <version> <headers> ...

  9. tf随笔-1

    生成新的计算图,并完成常量初始化,在新的计算 图中完成加法计算 import tensorflow as tf g1=tf.Graph() with g1.as_default(): value=[1 ...

  10. std::hash实现太简单分布不匀

    std::hash实现太简单分布不匀(金庆的专栏 2017.5)#include <iostream>#include <functional>using namespace ...