notes for lxf(二)

时间:2023-05-04 18:05:13

函数

abs()绝对值 max()返回最大值

raise 后接异常类 引发异常

函数返回多个值其实就是返回一个tuple

函数默认返回None

如果有必要检查参数类型用isinstance() type()查看数据类型

定义函数——确定函数名和参数个数——检查参数数据类型——return返回

定义默认参数必须指向不变对象

可变参数*args表示args接收的是一个tuple 关键字参数**kw表示kw接收的是一个dict 命名关键字参数需要一个特殊分隔符*必须传入参数名 如果有可变参数就不用加*

函数参数组合顺序 位置参数 默认参数 可变参数 命名关键字参数 关键字参数

对于任意函数都可以用func(*args, **kw)形式调用它 无论参数是如何定义的

在函数内部可以调用其它函数 如果一个函数调用的是自身本身 这个函数就是递归函数

函数调用通过栈实现 每当进入一个函数调用 栈就会增加一层栈帧 每当函数返回 栈就会减一层栈帧 递归调用次数过多会导致栈溢出

解决递归栈溢出的方法是通过尾递归优化 在函数返回时调用自身本身 使用递归本身无论调用多少次 都只占用一个栈帧

递归可以用逆向思维想想看(汉诺塔)

切片

L[-1]取最后一个元素 L[start:last:step]前闭后开 L[:]复制一个list

不要试图在循环中修改列表

迭代dict 默认情况下迭代的是key for i in d.values()迭代value for k, v in d.items()迭代key和value

isinstance(object, collections.Iterable/Iterator)判读是否为可迭代对象/迭代器

enumerate()用于一个将可遍历的数据对象返回索引-数据

列表生成式[i for i in range(10) if i > 3]  [m + n for m in 'abc' for n in 'xyz']

generator生成器 一边循环一边计算的机制

定义一 只需要把列表生成式的[]改成()就创建了一个generator 和list的区别仅在于最外层的[]和()

定义二 如果一个函数中包含yield关键字那么这个函数就不是简单的函数而是一个generator

next(generator)获得生成器的下一个返回值 或for i in generator:

函数是顺序执行 遇到return语句或最后一行(最后是return None) 函数就返回 generator的函数 遇到yield就返回 下次执行从yield开始

迭代器 可以被next()函数调用并不断返回下一个值的对象成为迭代器 Iterator 可以直接用于for循环的对象称为可迭代对象Iterable

生成器都是迭代器 但是list dict str是Iterable不是Iterator 可以使用iter()函数变成Iterator

像list str dict都是有限的序列 而Iterator表示的是一个不知道序列长度的数据流 只能通过next()实现按需计算下一个数据 Iterator是惰性的

for循环本质上是不断通过next()函数实现的(先把可迭代对象用iter()变成迭代器 再用next()不断调用)