python学习|python学习-2-函数的默认参数,可变参数,关键字参数

默认参数

  • 默认参数要放在参数列表的最后
  • 函数的默认参数也是一个变量,如果对它修改,它的改变是会累加的
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表示出来,且要符合才行
  • 但是明显发现,关键字参数的数量被控制了
【python学习|python学习-2-函数的默认参数,可变参数,关键字参数】任意函数都可用func(*args,**kw)调用
这里的args和kw是习惯写法

    推荐阅读