一、迭代器

      让不同数据类型具有相同的遍历方式:list、dict、str、tuple、set

1、特点:

①省内存

②只能向前,不能反复

③惰性机制

2、可迭代对象

###dir() 查看我们数据类型可以执行的操作###

print(dir(str))  # 如果有'__iter__'方法,说明就是可迭代对象
print(dir(list)) # '__iter__'

①查看set集合可执行的操作里有没有  __iter__ 方法

print("__iter__" in dir(set))
True

②列表变成一个迭代器

lst = ["张三", "李四", "王五", "赵六"]   #列表
it = lst.__iter__() # iterator 迭代器
print(it) #迭代器操作方法里有 '__iter__'和'__next__'

③遍历迭代器

lst = ["张三", "李四", "王五", "赵六"]
it = lst.__iter__() # iterator 迭代器 for name in it:
print(name)

④从迭代器取数据

###从迭代器获取到数据: __next__()###
print(it.__next__()) #一次取一个数据
print(it.__next__())
print(it.__next__())

数据取完时报错: StopIteration 停止迭代. 没有数据了

3、判断一个变量是否是迭代器,可迭代对象

from collections import Iterable, Iterator
lst = [,,]
print(isinstance(lst, Iterable)) # 判断列表是否是可迭代的
print(isinstance(lst, Iterator)) # 判断列表是否是是迭代器
from collections import Iterable, Iterator
lst = ["张三", "李四", "王五", "赵六"]
it = lst.__iter__()
print(isinstance(it, Iterable)) # 判断列表是否是可迭代的
print(isinstance(it, Iterator)) # 判断列表是否是是迭代器

4、函数传参判断是否可迭代对象

from collections import Iterable,Iterator
def func(n):
if isinstance(n, Iterable): # 判断是否是可迭代对象
for item in n:
print(item)
else:
print(n) func("哈哈哈")

二、生成器

    本质上就是一个迭代器,同样节省内存

1、生成器函数

def func():
yield
###生成器函数 -> 执行的时候,不会立即把函数全部执行完,创建一个生成器返回
def func():
print("哈哈哈")
yield #有yield 就是一个生成器函数. 会创建一个生成器对象给你
print("吼吼吼")
yield #可以把一个函数分段执行
print("我是最后执行……")
gen = func() # generator 生成器
print("__iter__" and "__next__" in dir(gen))
需要执行__next__ 才会让生成器执行一次
def func():
print("哈哈哈")
yield # 有yield 就是一个生成器函数. 会创建一个生成器对象给你
print("吼吼吼")
yield # 可以把一个函数分段执行
print("我是最后执行……")
gen = func() # generator 生成器
ret = gen.__next__() # 执行到下一个yield
print(ret)

2、应用

def order():
for i in range():
yield "衣服"+str(i) gen = order() # 定义, 创建一个生成器对象 print( order().__next__()) #执行一次取一件衣服
print( order().__next__()) #执行一次取一件衣服

3、推导式

①列表推导式:[结果 for循环 if语句]

②字典推导式:{key:value for if}

③集合推导式:{key for if}

④生成器表达式:(结果 for if)

三、装饰器

回到顶部

最新文章

  1. Less配置环境
  2. Linux学习笔记(17) Shell编程之基础
  3. UI控件(UIImageView)
  4. Dynamic CRM 2013学习笔记(九)CrmFetchKit.js介绍:Fetchxml、多表联合查询, 批量更新
  5. jQuery EasyUI DataGrid API 中文文档
  6. poj1651 区间dp
  7. android编程常见问题-No Launcher activity found!
  8. CPU/ABI显示No system images installed for this target的解决方案
  9. 承诺c指针 (1)指针是地址
  10. asp.net core mvc剖析:KestrelServer
  11. Erlang/OTP设计原则(文档翻译)
  12. Python----多项式回归
  13. java学习笔记06-条件语句
  14. PYQT窗口可视化编程
  15. 本地搭建json-server
  16. C#动态设置webServer路径
  17. Java中的break,continue关于标签的用法(转载)
  18. linux 搭建testlink的问题总结
  19. C# 动态生成类 枚举等
  20. python 全栈开发,Day113(方法和函数的区别,yield,反射)

热门文章

  1. 微软永恒之蓝ms17010补丁下载-wannacry
  2. 基于vant实现一个问卷调查
  3. 深入理解java:2.3.5. 并发编程concurrent包 之容器BlockingQueue(阻塞队列)
  4. OpenTSDB查询和写入毫秒级数据
  5. 初步学习jquery学习笔记(一)
  6. centos7下安装composer和git
  7. python 序列 转换 各种操作
  8. Elasticsearch入门教程(三):Elasticsearch索引&映射
  9. ArcGIS 在VS2010中 ESRI.ArcGIS.SOESupport.dll 无法正常加载的处理
  10. python 元类 MetaClass