迭代器
默认参数的一个考点
当你的默认参数是可变数据类型的时候,那么你要当心了
def func(a,lst = []): 可变数据类型使用的是同一个内存空间 lst.append(a) return lst print(func(1)) -----[1] print(func(2)) -----[1, 2] print(func(3,[])) -----[3]
函数名的应用
函数名是一个特殊变量,它具有变量的特点
函数名指向的是函数的内存地址,这个内存地址加上()就可以运行函数.
函数名是一个变量,可以赋值运算
def func(): print(666) print(func) a = func a() # 也可以运行函数funcdef func(): print(666) print(func) a = func a() # 也可以运行函数func
函数名可以作为容器类类型的元素
def func(): print(666) lst = [func,func,func] lst[1]() for el in lst: el()
函数名可以作为函数的实参传进去
def func1(): print('in func1') def func2(argv): argv() print('in func2') func2(func1)
函数名可以作为函数的返回值
def func1(): print('in func1') def func2(argv): print('in func2') return argv ret = func2(func1) ret()
f-strings格式化输出
python3.6后加入标准库的格式化输出新的写法
不区分大小写,f,F都可以
可以加入表达式
s1 = 'haha' s = f'python{s1.upper()}' l1 = ['小明',18,175] s2 = f'我的名字{l1[0]},我的年龄{l1[1]},我的身高{l1[2]}'
可以结合函数
def func(a,b): return a+b s1 = f'最终的结果{func(1,3)}'
注意:不能放一些特殊字符:冒号: 分号; 感叹号!逗号,
可迭代对象
字面意思分析:可以重复的迭代的实实在在的一个东西
专业角度: 内部含有'iter'方法的对象,就是可迭代对象
# 用内置函数dir()查看对象内部含有的所有方法,用in判断 print('__iter__' in dir(str))
优点
- 可以直观的查看里面的数据
- 操作方法多
缺点
- 占用内存
- 可以迭代对象不能迭代取值(除去索引,字典的key以外)
迭代器
字面意思:可以重复迭代的工具
专业角度:内部含有'iter'方法并且含有'next'方法的对象,就是迭代器
判断一个对象是否为迭代器 print('__iter__'and '__next__' in dir(map))
由于迭代器也含有'iter'方法,所以迭代器也是可迭代对象
可迭代对象可以转化为迭代器
l1 = [1,2,3,4,5] obj = iter(l1) #l1.__iter__() print(obj) #<list_iterator object at 0x00000114277BD390>
迭代器可以迭代取值,利用next()进行取值
l1 = [1,2,3,4,5] obj = iter(l1) #l1.__iter__() print(obj) #<list_iterator object at 0x00000114277BD390> print(next(obj)) # 一个next()对应一个值,多了就报错 print(next(obj)) # 接着上次的位置,会记录位置 print(next(obj)) print(next(obj)) print(next(obj)) print(next(obj)) # 超出值的个数,会报错:StopIteration
利用while循环,模拟for循环内部循环可迭代对象的机制
l1 = [1,2,3,4,5] obj = iter(l1) while True: try: print(next(obj)) except StopIteration: ----->异常处理 break
迭代器是一条路走到底,不走回头路,会记录位置
l1 = [22, 33, 44, 55, 66, 77] obj = iter(l1) for el in range(3): print(next(obj)) for el in range(2): print(next(obj))
迭代器的优点
- 非常节省内存
- 惰性机制,next()一次取值一次
迭代器的缺点:
- 不直观
- 操作不灵活
- 效率相对低
可迭代对象与迭代器的对比
- 可迭代对象:可迭代对象是一个私有的方法比较多,操作灵活,比较直观,但是占用内存,而且不能直接通过循环迭代取值的一个数据集
- 迭代器:是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据即
- 当你侧重于对数据可以灵活处理,并且内存足够,将数据集设置为可迭代对象是明智的选择
- 当你的数据量过大,将数据集设置为迭代器是一个不错的选择