默认参数
- 默认参数要放在参数列表的最后
- 函数的默认参数也是一个变量,如果对它修改,它的改变是会累加的
def add_end(L=[]):
L.append('end')
return Ladd_end()
print(add_end())
# ['end','end']
- 也就是说,l=[]的初始化操作只会做一次,而l会一直存在
- 可以改成
def add_end(L=None):
if L is None:
L = []
L.append('end')
return L
# ['end']
- 这里利用了None作为不变对象的道理
- 大致理解了,实际上L的对象只会被创建一次(内存空间的分配,初始化只会做一次),当在形参中定义了L=[]时,就会在内存中创建一个对象[],赋予L
- 然后L加上一个end,之后再次调用函数,默认参数的赋值就不会被执行,然后后面的append操作还是会在该对象上进行,因此就是[end,end]
- 而第二个函数,L=None, 首先第一次形参中,解释器在内存中创建一个None对象赋予L,该对象不可变
- 而后序函数体的L是一个新的对象,所以和这里的None无关
- 实际上,这里不用None,用其他的也行,比如L=1,只要是不变对象就行
- 也就是说,这里函数再次进入,L指向的还是第一次创建的对象,那块内存空间, 我将L与None进行比较,看要不要新创建一个[]
- 总结,默认参数,指的是,参数变量在函数开头始终默认指向同一块内存空间,该空间是否会被修改代表该参数会不会改变. 而在函数体中,可任意改变参数变量的指向
- 其次就是在于比较,None可以进行比较,[]不行
- 参数个数可变 [0,n]
- 传参前加一个*,则函数内部收到一个tuple
- 函数定义 def func(*nums):
- 使用1: func(num1,num2,num3)
- 使用2: func(*list)
- 在list或tuple前面加上*,将其当做可变参数传入
- 参数个数可变
- 含参数名
- 内部当做字典,其实就是传入一个dict
- 函数定义: def func(**kw):
- 使用1: func(‘a’=a,‘b’=b…)
- 使用2: func(**dict)
- 对参数名进行限制
- 函数定义1: def func(a,b,*,c,d)
- 使用: func(xx,xx,c=xx,d=xx)
- 函数定义2: def func(a,b,*num,c)
- 使用: func(xx,xx,xx,xx,c=xx)一定要把c作为key体现出来
- 要把key表示出来,且要符合才行
- 但是明显发现,关键字参数的数量被控制了
这里的args和kw是习惯写法
推荐阅读
- spring|阿里内部进阶学习SpringBoot+Vue全栈开发实战文档
- Python 可以满足你任何 API 使用需求
- 学习使用调用shell函数
- jade(pug)学习笔记(待填充.......)
- C++|如何系统地学习 C++ 语言()
- C++|十款真正的编程游戏软件
- c语言|C/C++新手入门教程(傻瓜都会的VS2013使用教程,成为程序员的第一步)
- 机器学习|【机器学习】python实现吴恩达机器学习作业合集(含数据集)
- python|为什么自学Python学着学着就放弃了()