WELCOME

不积跬步,无以至千里;不积小流,无以成江海。

Python函数的参数传递-位置参数、关键字参数、默认参数、不定长参数

Python函数的参数传递-位置参数、关键字参数、默认参数、不定长参数

1. 函数的参数

参数列表:如果函数所实现的需求中涉及到未知项参与运算(这些未知项需要函数的调用者来决定),就可以将未知项设置为参数。

格式:参数1,参数2,参数3,…

形式参数:在方法中(函数内)定义的,用于接收中间参数的值

实际参数:在函数外面定义,实际参与运算的值,就是为了给形式参数赋值

1 #函数的定义
2 #name是形参
3 def myPrint(name):
4    print("%s is a good man !"%name)
5 
6 #"lili" 是实参
7 myPrint("lili")
8 #结果
9 # >> lili is a good man !

 

1 #形参 参数一:name  参数二:age
2 def myPrint(name, age):
3    print("%s is %d year old"%(name, age))
4 #函数调用,传递两个参数
5 myPrint("lili", 18)
6 #结果
7 # >> lili is 18 year old

1.2 函数的返回值

函数的返回值表示一个函数执行完成之后得到的结果

使用return返回函数的返回值,用于结束函数,得到最终运算的结果。

两个作用:1、返回计算到的函数值;2、用于结束函数(return之后下一行的语句不执行)

1.3 参数传递

参数传递的本质:实参给形参赋值的过程

1.3.1 位置参数

位置参数又称必选参数

传递参数的顺序与定义的顺序有关,必须按照定义的顺序来进行传递,传递参数的个数与参数的个数必须保持一致。

1 def ins(name,age,address):
2     print("大家好我是%s,我今年%d岁,我家乡在%s"%(name,age,address))
3 ins("小明",29,"深圳")
4 #结果
5 # >> 大家好我是小明,我今年29岁,我家乡在深圳

位置参数之值传递:指传递不可变类型,一般指string、tuple和number类型

 1 def func1(a):
 2    print(a)
 3    a = 10
 4    print(a)
 5 temp = 20
 6 #将temp作为实参传递给func1函数,将赋值给形参a
 7 #相当于 a = temp
 8 func1(temp)
 9 #结果
10 #20
11 #10

打印地址,如下

 1 def func1(a):
 2    print(id(a))
 3    a = 10
 4    print(id(a))
 5 
 6 temp = 20
 7 #将temp作为实参传递给func1函数,将赋值给形参a
 8 #相当于 a = temp
 9 print(id(temp))
10 func1(temp)
11 print(temp)
12 #结果两个id地址相同
13 #140735888668080
14 #140735888668080
15 #140735888667760
16 #20

位置参数之引用传递:一般传递的是可变类型,一般指list,dict和set


1 def func1(c):
2    c[0] = 100
3 
4 d =[1, 2, 3, 4]
5 #将引用传递过去
6 func1(d)
7 print(d[0])
8 #结果
9 100

说明:引用传递的本质上还是值传递,只不过传递的是地址

1.3.2 关键字参数

概念:用于函数调用时,通过“键-值”的形式加以指定,可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求(位置关系)

1 def func(name, age):
2    print("I am %s, and I am %d year old"%(name, age))
3 #一般调用(位置参数)
4 func("lili", 18)
5 #使用关键字参数
6 func(age = 18, name = "lili")

注意:当同时出现位置参数与关键字参数时,位置参数必须在关键字参数的前面(即只能是前若干个连续的参数为位置参数,后面再接关键字参数),但是关键字参数之间是不存在先后顺序的。

1.3.4 默认参数

概念:用于定义函数,为参数提供默认值,调用函数时可传递也可不传递该默认参数的值。调用函数时,如果没有传递参数则会使用默认参数,传递则覆盖默认函数。

比如:在使用sort()排序的时候,不更改其参数的时候我们一般情况下默认会升序排列'''

1 def func(name, age=18)
2    print("I am %s, and I am %d year old"%(name, age))
3 
4 #一般的函数调用
5 func('lilei', 19)
6 #关键字参数调用
7 func(name = 'leilei')
8 #使用默认参数调用
9 func('lili')
使用默认参数可以简化函数的调用。

使用默认参数的时候需注意:

1.若默认参数与位置参数同时存在的时候,必选参数在前,默认参数在后,否则python解释器会报错

2.默认参数必须指向不可变对象(会影响下一次调用的结果)

如何设置默认参数

当函数有多个参数时,把变化大的参数放在前面,变化小的放在后面,变化小的可以作为默认参数。

练习:

我们写一个小学生入学注册信息,要求输入姓名,性别,年龄,城市等信息,设计一个函数。

1 def student(name, sex, age = 6, city = '广州'):
2    print("name :", name)
3    print("sex :",sex)
4    print("age :",age)
5    print("city :",city)
6 #函数调用
7 student('lili', 'boy')
8 student('lili', 'boy', 7)
9 student('lili', 'boy', city='Beijing')

注意:有多个默认参数的时候,可以按顺序提供默认参数,当不按顺序提供参数的时候需要使用关键字参数进行调用。

1.3.5 不定长参数【可变参数】

概念:定义函数时,有时候我们不确定调用的时候会传递多少个参数(可能传递1个也可能多个或者不传递),此时我们可以使用包裹位置参数或者包裹关键字参数来进行参数传递。

特点:能处理比当初声明时更多的参数(传递多少参数,就处理多少参数,不传递则不处理)

*1.包裹位置传递–args

用法:**变量名 (一般用*args)

功能:可以收集除了必选参数以外剩余的位置参数,会根据传进参数的位置合并成一个元组(tupe),args是元组类型,这就是包裹位置传递。
1 #与之前形参不同的是在hoby的变量名之前添加了“*”
2 #添加了星号(*)的变量名会存放所有未命名的变量参数
3 #如果在函数调用时没有指定参数,它就是一个空的元组
4 #一般情况下使用*args
5 def func(name, *hoby):
6    print("I am ",name,"I like",hoby)
7 
8 >>func('lili','flower','money')
9 I am  lili I like ('flower', 'money')

(1)装包
def 函数(*args):  -->此时会出现装包的操作
    pass
函数(1,2,3,4)
1 def get_sum(*args):
2     print(args)  # >> (12, 25, 4, 5, 56)
3     s = 0
4     for i in args:
5         s += i
6     print(s)  # >> 102
7 
8 
9 get_sum(12, 25, 4, 5, 56)

(2)拆包
list,tuple,set
调用的时候:函数(*list),函数(*tuple),函数(*set)
 1 # 拆包
 2 def get_sum(*args):
 3     print(args)  # >> (12, 25, 4, 5, 56)
 4     s = 0
 5     for i in args:
 6         s += i
 7     print(s)  # >> 102
 8 
 9 
10 list1 = [12, 25, 4, 5, 56]
11 get_sum(*list1)

 


**2.包裹关键字参数–**kwargs

用法:**变量名 一般用**kwargs

功能:收集除定义的变量的关键字参数之外,其它剩余关键字参数。kwargs是一个字典(dict),收集所有的关键字参数。
 1 def ins2(name,age=18,*args,**kwargs):
 2     print(name)
 3     print(age)
 4     print(args)
 5     print(kwargs)
 6 
 7 ins2("lili",18,"打豆豆","吃手手",hobby1="吃饭",hobby2="睡觉")
 8 #结果
 9 lili
10 18
11 ('打豆豆', '吃手手')
12 {'hobby1': '吃饭', 'hobby2': '睡觉'}
 1 def show_book(**kwargs):
 2     print(kwargs)
 3     for k, v in kwargs.items():
 4         print(k, v)
 5 
 6 
 7 # 装包
 8 show_book(bookname='西游记', author='吴承恩')
 9 
10 '''
11 {'bookname': '西游记', 'author': '吴承恩'}
12 bookname 西游记
13 author 吴承恩
14 '''
15 # 拆包
16 book = {'bookname': '红楼梦', 'author': '曹雪芹', 'number': 5}
17 show_book(**book)
18 
19 '''
20 {'bookname': '红楼梦', 'author': '曹雪芹', 'number': 5}
21 bookname 红楼梦
22 author 曹雪芹
23 number 5
24 '''

 1 def show_book(*args, **kwargs):
 2     print(args)  # ()
 3     print(kwargs)  # {}
 4 
 5 
 6 show_book()
 7 # >> ()
 8 #    {}
 9 
10 show_book('龙少', '小飞')
11 
12 # >> ('龙少', '小飞')
13 #    {}
14 
15 book = {'bookname': '坏小孩', 'author': 'zzz', 'number': 5}
16 show_book('龙少', '小飞', **book)
17 
18 # >> ('龙少', '小飞')
19 #    {'bookname': '坏小孩', 'author': 'zzz', 'number': 5}

 


注意:在python中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这4中参数可以一起使用,或者是只用其中的某些,但是注意,参数定义与调用的顺序必须是:

必选参数【位置参数】、默认参数、可变参数【包裹位置】和关键字参数【包裹关键字】。(默认参数与包裹位置参数可以根据需求进行位置调换)

posted @ 2022-03-22 18:04  Ambitious~  阅读(390)  评论(0)    收藏  举报