1)默认参数power(x, n=2):,这样,当我们调用power(5)时,相当于调用power(5, 2)。只有与默认参数不符的才需要提供额外的信息power(5,3)
2)Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了,用none实现不变
if L is None:
L = []
3)定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号
4)*nums表示把nums这个list的所有元素作为可变参数传进去
5)**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数
6)命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数
6.1)如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
6.2)*args是可变参数,args接收的是一个tuple;**kw是关键字参数,kw接收的是一个dict。
7)使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
7.1)针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的,没有循环语句的编程语言只能通过尾递归实现循环。