Python基础(四)
一、迭代器
让不同数据类型具有相同的遍历方式: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 = [1,2,3] 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 1 #有yield 就是一个生成器函数. 会创建一个生成器对象给你 print("吼吼吼") yield 2 #可以把一个函数分段执行 print("我是最后执行……") gen = func() # generator 生成器 print("__iter__" and "__next__" in dir(gen))
需要执行__next__ 才会让生成器执行一次
def func(): print("哈哈哈") yield 1 # 有yield 就是一个生成器函数. 会创建一个生成器对象给你 print("吼吼吼") yield 2 # 可以把一个函数分段执行 print("我是最后执行……") gen = func() # generator 生成器 ret = gen.__next__() # 执行到下一个yield print(ret)
2、应用
def order(): for i in range(10000): yield "衣服"+str(i) gen = order() # 定义, 创建一个生成器对象 print( order().__next__()) #执行一次取一件衣服 print( order().__next__()) #执行一次取一件衣服
3、推导式
①列表推导式:[结果 for循环 if语句]
②字典推导式:{key:value for if}
③集合推导式:{key for if}
④生成器表达式:(结果 for if)
三、装饰器
成功最有效的方法就是向有经验的人学习!