参数
1.1 参数的定义
形参定义:在函数定义的时候用到的参数,没有具体值,只是一个占位符称为形参。
实参:在调用函数的时候输入的值。
在def语句中。位于函数名后面的变量通常称为形参,而调用函数时提供的的值称为实参。
以前接触过c/c++的时候
>>>int f(int a,int b)//自定义函数中括号里的a,b就是形参,它在函数自定义过程中实际并不占内存
...
>>>int main()
>>>{
>>>int m=1,n=2,result;
>>>result=f(m,n);//这里的m,n就是实参
>>>/*
>>>运行过程是:
>>>int a,b;
>>>a=m;
>>>b=n;
>>>即临时创建两个变量a,b,然后将实参的值赋予形参,然后形参按照f函数进行运>>>算。
>>>*/
>>>return 0;
}
在Python里面
>>>def add(a, b) :
... return a+b
...
>>>if __name__=="__main__"
>>> x = 2
>>> y = 3
>>> print add(x, y)
程序如上,在函数定义中的a,b是形参,函数调用中的x,y是实参
1.2 参数的修改
>>>def a(n):
... n = 'Jack'
...
>>>name = 'aaa'
>>>a(n)
>>>name
>'Jack'
在a内,将新值赋给参数n,但对name的值没有影响,结果表明这是一个不同的变量。
>>>name ='Jack'
>>>n = 'b'
>>>name = n #赋值是在一个函数内进行的
>>>name
>b
name的值变了,即函数内部赋值时,函数外部不受影响。参数储存在局部作用域之内。
字符串和元组是不能修改的,但参数为可变结构(如列表)
>>>def change(n):
... n[0] = 'Jack'
...
>>>names = ['a','b']
>>>change(names)
>['Jack','b']
以上是在函数内修改参数,用了函数调用。如果不用函数调用,修改参数
>>>names = ['a','b']
>>>n = names
>>>n[0] = 'Jack'
>>>name
>['Jack','b']
将同一个列表赋值给两个变量时这两个变量将同时指向这个列表。为了避免这种结果,必须创建列表的副本。对列表进行切片操作时,返回的切片都是副本。如果创建的是整个列表的切片,得到的将是列表的副本。
>>>names = ['a','b']
>>>n = names[:]
n和names包含两个相等但不同的列表。
>>>n == names
>True
>>>n is names
>False
如果修改n的元素,是不会影响names
>>>n[0] = 'c'
>>>n
>['c','b']
>>>names
>['a','b']
总而言之n是副本,修改副本的值是不会影响原始列表names
1.3 位置参数
def addfa(a,b):
result = 1
if b >0:
a+=1
result = result*b+a
return result
print (addfa(3,4))
addfa(a,b)里面有两个参数,a和b是位置参数,再调用时按照顺序依次传递给a和b。
位置参数也叫必选参数
1.3 默认参数
默认参数最大的优点在于可以指定默认值,参数作用清晰。
def addfa(a,b=1):
result = 1
if b >0:
a+=1
result = result*b+a
return result
print (addfa(3))
第一:必选参数在前,默认参数在后,否则python解释器会报错,在程序当中就是a在前面。
第二:默认参数一定要指向不变对象
如果不懂python在可变和不可变对象,请参考 https://www.jianshu.com/p/c5582e23b26c
1.4 可变参数
定义:在参数前面加了一个*号,函数可以接收0个或多个值作为参数,返回的结果是一个元组。一般默认的参数为*args
*args:将参数组织成元组;
#*args:将参数组织成元组;
def print_params(*args):
print(args)
>> print_params('Testing')
('Testing', )
>> print_params(1, 2, 3)
(1, 2, 3)
#------------------------------------
#与普通参数的组合使用:
def print_params(title, *args):
print(title)
print(args)
>> print_params('Params', 1, 2, 3)
Params
(1, 2, 3)
星号不会收集关键字参数(z=3),要收集关键字参数,可以使用两个星号,一般默认为**kwargs,返回的是一个字典而不是元组
def print_params(x, y, z=3, *parms, **kw):
print(x, y, z)
print(params)
print(kw)
>> print_params(1, 2, 3, 5, 6, 7, foo=1, bar=2)
1 2 3
(5, 6, 7)
{'foo':1, 'bar':2}
1.5 参数的分配
def add(x, y): return x+y
params = (1, 2)
>>> add(*params)
3
通过调用函数时使用运算符实现的,部分位于参数的末尾,通过*可将字典中的值分配给关键字参数。