可变函数:定义calc(numbers)后括号内必须要传入list或tuple。利用可变函数calc(*numbers)就直接可以输入元素。在这基础上,如果要传入list或tuple而非元素,可直接calc(*list)这样把其变为元素传入。
可变参数在函数调用时自动将元素组装成tuple
关键字参数:person(...,**kw)①关键字函数可以传入含参数名的函数,自动组装成一个dict,创建可选项。和可变参数类似可以先有一个dict,然后来传入person(....,**dict)②此时dict的所有key-value都会出现。①②相比,kw是已定义函数意义内,对调用的dict本身无影响。
关键字参数传入时,要以x=y的形式传入。
命名关键字参数:person(name,age,*,city,job)通过*来分隔前后,使后面的参数限制性接收的参数,此时就只接收city,job这些对应的key-value了。如果*这一项已经是一个可变参数,则后面的也是命名关键字参数。/命关字参数传入时,必须要带参数名,如city='Beijing ',不然就识别为位置函数而导致无法传入了。/命关字参数也可以设定默认值,设定默认参数。
参数组合:参数定义顺序必须是,必选参数-默认-可变-命关字-关字参数。
传入元素时,按照对应位置传入,可变、关字、命关字分别按相对应的形式传入。
其中
func(*args,**kw)调用函数时均可按照这个方式来,其也是按照不同的参数类型来传入元素的。f1(*args,...)可以连续传入,所以对于必选参数,也可以按照这种方式来进行,传入
调用语法:可变参数,直接传入或*tuple传入;关键字参数,直接传入(x=y)或**dict传入;命名关键字参数,同关键字参数,但限制传入的类别(定义时,前棉要有可变参数或*来做分隔)
递归函数:比如计算n!可以用循环来做,以这种逻辑为基础,定义函数内含有该定义函数,从而有清晰的循环。
栈、栈帧:调用函数有栈之说,栈是数据结构,由栈帧来填充,进入函数调用会加一层栈帧,调用函数返回值时,栈就会减去一层栈帧。而栈的大小是有限的,递归只调用不返回值就会有溢出。
尾递归优化:使函数调用返回值返回到函数本身内,调用-返回-调用-返回---,如此以只占用一层栈帧。
但还是有遗憾...!?尾递归也会导致栈溢出?!
任何递归函数都存在栈溢出问题。
汉诺塔代码:(需要逻辑理解,无return)
Python笔记5(函数可变、关键字参数及组合、递归函数)
网友评论