总结:
1. 闭包: 闭包的好处就是让一个变量常驻内存, 供后续的程序使用
2. 查看一个对象是可迭代对象的方法
(1) 使用dir()函数. 如果结果中有 __iter__ 就是可迭代对象
print(dir(obj))
(2) 通过isinstance()函数, 返回True就是可迭代对象
from collections import Iterator, Iterable
print(isinstance(obj, Iterator))
print(isinstance(obj, Iterable))
3. 如果一个对象有 __iter__函数, 则这个对象遵守了可迭代协议, 就可以获得相应的迭代器
通过iter()或__iter__()来获取迭代器
通过next()或__next__()来获取到迭代器中的元素
Iterabke: 可迭代对象, 内部包含 __iter__()
Iterator: 迭代器, 内部包含 __iter__() 同时包含 __next__()
迭代器特点: 1. 节省内存 2. 惰性机制 3. 不能反复, 只能向下执行
4. for循环的机制
使用while循环+_迭代器来模拟for循环
def my_for(iterable_obj):
iterator_obj = iter(iterable_obj)
wnhile 1:
try:
i = next(iterator_obj)
print(i)
except StopIteration:
break
my_for(iterable_obj)
5. 生成器 generator
生成器实质就是迭代器, 在python中有3中方法获得生成器:
(1). 通过生成器函数
(2). 通过各种推导式来实现生成器
(3). 通过数据的转换来获取生成器
def func():
print("111")
yield 222
ret = func()
print(ret)
# <generator object func at 0x0293FDB0>
将函数中的return换成yield就是生成器, 这个时候执行函数, 就不再是函数的执行了, 而是获得这个生成器, 执行生成器通过next()
yield和return的区别: yield是分段执行一个函数, return是直接停止执行函数
当程序执行完最后一个yield, 在继续执行next()会报错 # StopIteration
send() 和 next()的区别:
(1). send()和next()都是让生成器向下走一次
(2). send()可以给上一个yield传值, 不嫩给最后一个yield发送值, 在第一次执行生成器的时候不能使用send()
6. 列表推导式, 生成器表达式
列表推导式是通过一行代码来构建想要的列表, 看似简单, 但出错后很难排查
常用写法: lst = [结果 for 变量 in 可迭代对象]
还可以对列表中的数据进行筛选
筛选模式: [结果 for 变脸 in 可迭代对象 if 条件]
生成器表达式的语法和列表推导式的语法基本一致, 只是把[]替换成了()
生成器表达式和列表推导式的区别:
(1). 列表推导式比较耗内存, 一次性加载, 生成器表达式几乎不占内存, 使用的时候才分配和使用内存
(2). 得到的值不一样, 列表推导式得到的是一个列表, 生成器表达式获取的是一个生成器
生成器的惰性机制: 生成器只有在访问的时候才取值
总结: 推导式有: 列表推导式, 字典推导式, 集合推导式, 没有元祖推导式
生成器表达式: gen = (结果 for 变量 in 可迭代对象 if 条件筛选)
生成器表达式可以直接获取到生成器对象, 生成器对象可以直接进行for循环, 生成器具有惰性机制
7. 内置函数
locals() 返回当前作用域中的名字
globals() 返回全局作用域中的名字
eval() 执行字符串类型的代码, 并最终返回结果
exec() 执行字符串类型的代码
compile() 把字符串类型的代码变异, 代码对象能够通过exec语句来执行或者eval()进行求值
compile()参数说明: resoures: 要执行的代码, 动态代码片段; 文件名: 存放文件的文件名, 当传入了第一个参数的时候, 这个参数给空就可以了; 模式: 取值有三个 (1)"exec" 一般放一些流程语句的时候, (2)"eval" resourse只存放一个求值表达式 (3)"single" resourse存放的代码有交互的时候
有返回值的字符串形式的代码用eval(), 没有返回值的字符串形式的代码用exec(), 一般很少用compile()
hash() 获取到对象的哈希值(int, str, bool, tuple)
id() 获取到对象的内存地址
__import__() 用于动态加载类和函数
help() 用于查看函数或模块用途的详细说明
dir() 查看对象的内置属性, 方法, 访问的是对象的 __dir__() 方法
complex() 创建一个复数, 第一个参数是实部, 第二个参数是虚部, 或者第一个参数直接用字符串来描述复数
pow(a, b) 求a的b次幂, 如果有三个参数, 则求完次幂后对第三个数取余
reversed() 将一个序列翻转, 返回翻转序列的迭代器
slice() 列表的切片
fomeat() 与具体的数据有关, 用于计算各种小数, 精算
bytes() 将字符串转换成bytes类型
byteattay() 返回一个新字节数组, 这个数字里的元素时可变的, 并且每个元素的值的范围是[0, 256)
memoryview() 查看bytes在内存中的情况
ord() 输入字符找带字符编码的位置
chr() 输入位置数字找出对应的字符
ascii() 是ascii码中的返回该值, 不是就返回u
repr() 返回一个对象的string形式
frozenset() 创建一个冻结的集合, 冻结的集合不能进行添加和删除操作
enumerate() 获取结合的枚举对象
all() 可迭代对象中全部是True, 结果才是True
any() 可迭代对象中有一个是True, 结果就是True
zip() 用于将可迭代对象作为参数, 将对象中对应的元素打包成一个个元祖, 然后返回由这些元祖组成的迭代器, 如果各个迭代器的元素个数不一致, 则返回列表长度与最短的对象相同
8. lambda匿名函数
为了解决一些简单的需求而设计的一句话函数, lambda表示的是匿名函数, 不需要用def声明, 一句话就能声明出一个函数
语法: 函数名 = lambda 参数: 返回值
(1). 函数的参数可以有多个, 多个参数之间用逗号隔开
(2). 匿名函数不管多复杂, 只能写一行, 且逻辑结束后直接返回数据
(3). 返回值和正常的函数一样, 可以是任意数据类型
9. sorted() 排序函数
语法: sorted(Iterable, key=None, reverse=False)
Iterable: 可迭代对象
key: 排序规则(排序函数), 在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数, 根据函数运算的结果进行排序
reverse: 是否是倒序, True倒序, False正序
10. filter() 筛选函数
语法: filter(function, Iterable)
function: 用来筛选的函数, 在filter中会自动的把Iterable中的元素传递给function, 然后根据function返回的是True还是False来判断是否保留此项数据
Iterable: 可迭代对象
返回的是迭代器
11. map() 映射函数
可以对可迭代对象中的每一个元素进行映射, 分别去执行function
语法: map(function, Iterable)
返回的是迭代器
12. 递归
在函数中调用函数本身就是递归
python中的最大递归深度是998