@SuHongjun
2020-11-17T07:37:17.000000Z
字数 1909
阅读 1067
Python
2020春季学期
def f(): #函数定义
pass
f() #函数调用
值传递采用的是拷贝值的方式
def f1( x ): #函数定义,形参 x
x = 2*x
print("f1: x=",x)
return x**3 #函数返回值,用return语句
a = 5
print( 'a=',a )
y = f1( a ) #函数调用 ,实参a,值传递
print( 'y=',y )
print( 'a=',a )
输出为:
a= 5
f1: x= 10
y= 1000
a= 5
def f2( x ): #函数定义,形参 x
x.add(9)
s1 = set([1,2,3])
print(s1)
f2(s1) #函数调用 ,实参s1,引用传递
print(s1)
输出为:
{1, 2, 3}
{1, 2, 3, 9}
Python 中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:
值传递:适用于实参类型为不可变类型(字符串、数字、元组);
引用(地址)传递:适用于实参类型为可变类型(列表,字典, 集合);
1. 位置参数(必选参数)
2. 默认参数
3. 可变参数
4. 命名关键字参数
5. 关键字参数
在Python中定义函数,可以用必选参数、默认参数、可变参数、命名关键字参数和关键字参数,这5种参数可以组合使用。
注意:
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数、关键字参数。
def f1( x1 , x2): #x1,x2都是位置参数
return x1 + x2
y = f1( 6 , 7) #因为有2个位置形参,这里必须传2个实参
print(y)
def f1( x1 , x2=0): #x2是默认参数
return x1 + x2
y = f1( 6 ) #因为x2是默认参数,所以这里可以传1个实参,也可以传 2个实参
print(y)
标志: *
def f1( x1, x2 = 0, *ls1): #ls1是可变参数
a = 0
for i in ls1:
a += i
return x1 + x2 + a
y = f1( 5,8,2,3,4,5,6,7,8,9,2,43,123,45) # 2,3,4,5,6,7,8,9,2,43,123,45都是传给可变参数 ls1
print(y)
注意:可变参数的标志 * 是区分参数类型的分界点, * 之前的参数是位置参数、默认参数, * 之后的参数是命名关键字参数、关键字参数,
例1:
def f1( x1, x2 = 0, *ls1, p1 = 1): #p1就是命名关键字参数
a = 0
for i in ls1:
a += i
return (x1 + x2 + a) * p1
#y = f1( 5 )
y = f1( 5 ,4,p1=7)
#因为p1参数有缺省值,所以调用的时候可以省略,如果要给p1传参则必须用 p1 = x 的形式给出实参
print(y)
输出:
63
例2:
def person(name, age, *, city, job): #*后面的city、job都是命名关键字参数
print(name, age, city, job)
person('bbj',23,city='hefei',job='engineer')
#命名关键字参数,在调用的时候与位置参数不同的是必须给出参数名否则调用时会报错
输出:
bbj 23 hefei engineer
标志:**
def person(name, age, **kw): #**kw是关键字参数
print('name:', name, ',age:', age, ',other:', kw)
person('Michael', 30)
dictArray = {'city': 'Beijing', 'job': 'Engineer'} #定义一个字典数据
person('Jack', 24, **dictArray ) #用字典作为参数来调用函数
person("李明",23,city="hefei",habit="basketball") #注意这里的实参 city="hefei",habit="basketball"
输出结果:
name: Michael ,age: 30 ,other: {}
name: Jack ,age: 24 ,other: {'city': 'Beijing', 'job': 'Engineer'}
name: 李明 ,age: 23 ,other: {'city': 'hefei', 'habit': 'basketball'}