装饰器是函数的应用
函数名的本质-----就是一个变量 里面存储了函数的内存地址 函数名可以作为函数的参数、返回值、可以被赋值,可以作为可变数据类型的元素
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
迭代器:
iterable 形容词 可迭代的
from collections import Iterable 查看在哪里
iterable 是检测一个对象是否可迭代的
isinstance() 括号内接受两个东西,第一个是内容,第二个是数据类型,如果是输入的是对的数据类型话就是True,不是的话就是False
可以用来检测是否是可迭代对象
iterable 和 STR等有些像,不过是用来检测是否是可迭代对象,并不是数据类型那样可以用type检查
dir(),展示的是括号内数据类型所有的可用方法
print(dir('aaa')) print(dir(123)) print(set(dir('aaa)))-set(dir(123)))
可以求方法的差集
'__iter__' 这个方法导致了一个数据类型的可迭代
#iter
只要包含了'双下iter'方法的数据类型就是可迭代的-----可迭代协议
数据类型和python解释器定下来的协议
dict.__iter__() tuple.__iter__() print([1,2,3].__iter__()) list iterator
iterator 名词迭代器
迭代器就是实现了能从其中一个一个的取出值来(按顺序依次取值)
>>>list=[1,2,3,4] >>> it = iter(list) # 创建迭代器对象 >>> print (next(it)) # 输出迭代器的下一个元素 1 >>> print (next(it)) 2
可以从列表中依次取值
迭代器中有__next__和__iter__方法,----迭代器协议
可迭代对象中没有__next__
可迭代对象和迭代器都有iter方法
在python中 学过的所有的可以被for循环的基本数据类型都是可迭代的,而不是迭代器
用双下iter()方法可以将可迭代对象变成迭代器
迭代器=可迭代对象.__iter__()
迭代器取到没有元素的时候,会报错,,StopIteration
for 循环可以是一个可迭代对象,也可以是一个迭代器
except StopIteration 直到遇见这个错误 怎么怎么样
为什么要有迭代器
迭代器存在的本质是什么:
1.能够对python中的基本数据类型进行统一的遍历,遍历的过程中不需要关心每一个值分别是什么
2.它可以节省内存
f = open('file','w') 文件句柄就是一个迭代器
range(100).__iter__() 是一个可迭代对象 也是为了节省内存存在的
惰性运算,不要一下生成太多数据占用内存
迭代器的用处:
两种迭代器,一种本身就是迭代器,比如文件句柄
一种是加__iter__()方法将可迭代对象改变成迭代器
迭代器是Iterator Iterator都是python返回的,自己不能写
自己想写的话就是Gerator ↓
生成器:
生成器就是迭代器,生成器是我们自己写出来的
生成器函数,另外一种是生成器表达式
加yield关键字的函数就是生成器函数
def generator(): print(123) yield'aaa' g=generator() print(g)
结果就是生成器的地址↑
ret = g.__next__() 可以用ret=nex(g) print(ret) #结果是123,aaa
生成器函数在执行的时候返回一个生成器
生成器的本质就是迭代器
yield 有点像return
只有用next启动生成器的时候里面程序才会执行
生成器里面的数只能取一次
从生成器中取值
1.__next__ 有几个yield就可以取几次
2.for循环取值 正常取for i in g
3.其他数据类型进行强制转换 list(g) 返回一个列表,里面装着生成器中的所有内容
注意:调用生成器函数的时候,要先获取生成器,再进行next取值
生成器中的内容智能去一次,且按顺序取值没有回头路,取完为止
def clohtes(): for cloth in range(1,20000): yield ('第%s件衣服'%cloth) c = clohtes() for i in range(100): print(next(c))
多次循环第多少件衣服示例↑
文件监控示例↓
import time def tail(filename): f=open(filename,encoding='utf-8') f.seek(0,2) while True: line = f.readline() if not line: time.sleep(0.01) continue yield line tailg = tail('demo') for line in tailg: print(line,end='')
python3中对yield的一种简化
def func(): yield from [1,2,3] yield from 'ABC' g = func() for i in g: print(i)