函数
一 参数的传递:
1 Python的函数参数传递的是实际对象的内存地址。
2 Python的数据类型分可变数据类型和不可变数据类型。
>>> a=1 >>> def func(a): ... print('在函数内部修改之前,变量a的内存地址为: %s' % id(a)) ... a=2 ... print('在函数内部修改之后,变量a的内存地址为: %s' % id(a)) ... print('函数内部的a为: %s' % a) ... >>> print('调用函数之前,变量a的内存地址为: %s' % id(a)) 调用函数之前,变量a的内存地址为: 1679419856 >>> func(a) 在函数内部修改之前,变量a的内存地址为: 1679419856 在函数内部修改之后,变量a的内存地址为: 1679419888 函数内部的a为: 2 >>> print('函数外部的a为: %s' %a) 函数外部的a为: 1
二 参数类型
1 位置参数,顺序参数,必传参数
2 默认参数,必须在位置参数之后,尽量指向不变的对象。
def power(x,n=2): return x**n ret1 = power(10) ret2 = power(10,4)
def func(a=None): #将a设置为一个类似None、数字或字符串的不可变对象。在函数内部,转变为可变类型,如空列表。如a=[],则结果为['A'],['A','A'],['A','A','A'] # 注意下面的if语句 if a is None: a = [] a.append("A") return a print(func()) print(func()) print(func())
3 动态参数;*args和**kwargs;必须放在所有位置参数和默认参数的后面。
*args:将实际参数打包成一个元组传入形式参数。如果是一个列表,则将列表当做一个参数传入。可将内部元素逐一作为参数传入,字典将key传入
>>> def func(*args): ... for arg in args: ... print (arg) ... >>> func('a','b','c') a b c >>> li=[1,2,3] >>> func(li) [1, 2, 3]
>>> func(*li)
1
2
3
**kwargs:接受键值对的动态参数。调用时将实际参数打包成字典
>>> def func(**kwargs): ... for kwg in kwargs: ... print(kwg,kwargs[kwg]) ... print(type(kwg)) ... >>> func(k1= 'v1',kw=[0,1,2]) k1 v1 <class 'str'> kw [0, 1, 2] <class 'str'> >>> dic={'k1':'v1','k2':'v2'} >>> func(dic) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: func() takes 0 positional arguments but 1 was given >>> func(**dic) k1 v1 <class 'str'> k2 v2 <class 'str'>
4 关键字参数 使用*将其与位置参数及默认参数分隔。必须传入参数名,必须传递,或缺省值。如已有*args则不需要*
def student(name, age, *, sex): #必须声明sex参数名 pass student(name="jack", age=18, sex='male')
浙公网安备 33010602011771号