函数的迭代 函数生成器 常用的内置方法
函数的迭代器:
什么是迭代?
迭代就是更新换代 每次迭代都基于上一次的结果
什么是迭代器?
迭代器就是迭代的工具 且迭代取值不依赖索引取值
可迭代对象:
内置方法中有__iter__()方法的都是可迭代对象 可迭代对象有 字符串str 列表 list 字典dict 集合set __iter__()可以读做双下iter 使用该方法得到的是一个迭代器对象 是一个地址.
什么是迭代器对象?
内置方法中不止有__iter__ ()还有 __next__ ()的都是迭代器对象 迭代器一定是可迭代对象 可迭代对象不一定是迭代器对象
如何生成一个迭代器对象?
使用__iter__方法就可以生成一个迭代器对象
q=[1,2,3,4,5,6] res=q.__iter__()
如何取迭代器对象的值?
可以使用__nexi__() 方法 来取迭代器对象里的值
q=[1,2,3,4,5,6] res=q.__iter__() print(res.__next__())
但是一次最能取一个值 取下一个值的时候是接着上一个值来取的 如果方法用的个数超出迭代器里的值 会直接报错 StopIteration
报错的话就可以用到一个 异常处理方法 try except
q=[1,2] res=q.__iter__() try: print(res.__next()) print(res.__next()) print(res.__next()) excetp StopIteration: 报错的返回语句 print('超出范围了')
文件类型本身就是一个迭代器对象 自带__iter__() __next__()
且在可迭代对象后无限加__iter__() 无论执行多少次 得到的永远是迭代器对象 ps:问:__iter__方法就是用来帮我们生成迭代器对象而文件对象本身就是迭代器对象,为什么还内置有__iter__方法??? 因为 没有的话就默认他不是一个可迭代对象
迭代器只能依次取 不能后退
for循环的本质
for i in后面跟得是一个可迭代对象 把in后面的可迭代对象通过__iter__()的方法 转换成迭代器对象 然后通过__next__() 方法来取值 最后通过异常处理来结束循环
q=[1,2,3,4,5,6,7]
def for1(iterator): res3=iterator.__iter__() while True: try: print(res3.__next__()) except StopIteration:break for1(q)
迭代取值的优点: 不依赖索引取值 不会内存溢出 缺点 不能获取指定元素 取完报错
map也是迭代器对象 可以通过赋值来调用__next__()来取里面的值
生成器: 用户自定义的迭代器 本身就是一个迭代器
yield关键字 如果函数中有yield关键字的话 那么函数名加括号不会执行函数体代码 yield后跟得就是调用迭代器__next__()方法后 你得到的值 且他可以返回多个值 但是多个值的时候 返回的是元组
g=gunc() 生成器初始化完成 把函数转成迭代器 def func1(): print('到底有没有执行呢?') yield 123,123,12312 g=func1() print(g.__next__())
seed 方法是给yield 传一个值 可以用__next__()调用
yield 和return的区别 相同 都可以返回值 并且是多个值 不同点 yield 一颗多次返回 而return只能返回一次 就退出了 yield还可以外部传值
生成器不会主动执行任何一条代码 必须通过__next__( ) 触发来运行
生成器表达式 res=(i for i in range(10000) if i != 4) print(i.__next__()) 来调用
内置函数
abs(-111) >>>111 求绝对值
l=[1,0,2,3,0]
all(l) 只要有一个为false 就返回 false
any(l) 只要有一个为True 就返回True
print(bin(12))
print(oct(12))
print(hex(12))
globals() 查看全局名称空间
locals() 查看所在的局部名称空间
bool(1) 布尔值 1为true 0为false
字符字节的转换 转字节 encode('utf-8') 转字符 decode('utf-8')
还可以使用 bytes(转换的东西 ,encoding=utf-8]) 转字节
可调用的 (可以加括号执行相应的功能) callable() 判断是否是可以调用的
car(数字 ) 将数字转换成对应的ascii码表 A-Z 65-90 a-z 95-122
ord(数字 ) 将字符转化成对应的ascii码表
dir() 获取当前对象名称空间的名字
import test print(dir(test)) print(test.name)
divmod 分页器
print(divmod(100,10))
a,b=divmod(100,10)
if b:
a+=1
print('总页数 ' a)
enumerate() 枚举 把他的索引和值取出来
eval 字符串的代码执行 不支持逻辑代码 只支持一些简单的代码
exec 支持逻辑代码
format 占位符 三种方式 第一种 占位 第二 索引 第三 关键字
isinstance 后面统一改方法判断对象是否属于某个数据类型 返回True False
pow(2,3)求幂 次方 >>>8
round(3.49) >>>3 四舍五入