一、复习
1、函数
- 函数的定义和调用
- 函数定义:def 函数名(形参): + 函数体 + 返回值
- 函数调用:函数名(实参)
- 站在形参的角度上,有两种参数:位置参数*args,关键之参数**kargs
- 站在实参的角度上,按照位置传参,按照关键字传参,必须先按照位置传参,按照关键字传参
- 返回值个数:没有返回值,1个返回值,多个返回值
- 返回值的接收:没有返回值不接收,1个返回值用一个参数接收,多个返回值用1个或多个参数接收
2、闭包函数
- 闭包函数的定义:在内部函数引用外部函数的变量
3、装饰器
- 作用:在不改变原函数的调用方式的情况下,在函数的前后添加新的功能
- 装饰器完美的符合了一个开发原则:开放封闭原则(对扩展是开放的,对修改是封闭的)
- 装饰器是闭包函数的一种应用
- 基础的装饰器
- 完美的装饰器
- 带参数的装饰器----三层嵌套函数
- 多个装饰器装饰一个函数
二、迭代器的一些概念
1、已知的可循环的对象类型:list、dic、str、set、tuple、f.open()、range()、enumerate(枚举)
2、迭代器的标志性特点:可索引、可循环
3、可迭代的几个重要概念
- 可迭代协议:只要含有__iter__方法的都是可迭代的
- 能使用for循环的数据类型,就一定拥有__iter__方法,就是可迭代的对象
- 只有是可迭代对象的时候,才可以用for循环
4、迭代器的几个重要概念
- 迭代器协议:内部还有__next__和__iter__方法的就是迭代器
- 只要是迭代器,就一定是可迭代的,但是可迭代的不一定是迭代器
- 可迭代对象 调用一个__iter__()方法,就得到一个迭代器
- 迭代器中的__next__()方法,可以从迭代器中一个个取值,for循环其实就是在使用迭代器的__next__()方法
5、迭代器的好处:
- 从容器中一个个的取值,会把所有的值都取到
- 节省内存空间(迭代器不会在内存中占用一大块内存,而是随着循环每次生成一个元素)
6、如何确定某个对象是否可迭代??(当我们遇到一个新的变量,不确定能否使用for循环的时候,就判断它是否可迭代)
- 1、打印对象,结果中告诉你是一个iterator
- 2、可迭代对象 可以迭代
- 3、打印对象,结果中返回了一个内存地址,也有可能是可迭代的对象,只要确认对象可使用__iter__方法即可
三、理解迭代器需要知道的一些知识点
1、#双下方法:带双下划线的方法,指的是已经写好的可以用多种方法调用的方法,如 列表的加法其实就是__add__方法的其他调用形式:
print([1].__add__([2]))print([1]+[2])
2、使用dir()方法获得 参数可调用的全部方法的列表,如:
print(dir([])) #获取列表所拥有的全部方法print(dir({}))print(dir(''))print(dir(range(10)))
3、求列表的交集
求交集的方法 只有集合有,所以先要用 set()方法将列表强制转换为 集合,再用 & 符号取交集,结果是一个集合
e = set(dir([])) & set(dir({})) & set(dir('')) & set(dir(range(10)))
4、可迭代类型的对象 可使用__iter__方法
# 以下几种数据类型是 可迭代的print('__iter__' in dir(list))print('__iter__' in dir(dict))print('__iter__' in dir(set))print('__iter__' in dir(tuple))print('__iter__' in dir(enumerate([]))) #枚举print('__iter__' in dir(range(1)))# 一下数据类型是 不可迭代的print('__iter__' in dir(int))print('__iter__' in dir(bool))