Python函数
Posted itone
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python函数相关的知识,希望对你有一定的参考价值。
Python-11
@(Python)
一、函数的返回值
1. 什么是返回值
- 返回值,是函数处理后的结果
2. 为什么要有返回值
- 如果需要在程序中拿到函数的处理结果,然后对这个结果进一步处理,就需要函数必须有返回值
3. 返回值的应用
- 函数的返回值由
return
定义:return 值
return
是一个函数结束的标志,函数内可以有多个return
,但是只要执行一次return
,整个函数就会结束运行return
后面的返回值可以是任何数据类型return
后面的返回值没有个数限制,如果有多个,可以使用逗号分隔开多个值return +0个值
:返回None
,如果函数中不写return
,默认会在函数的最后一行添加return
,返回None
return +1个值
:返回的值就是该值本身return +多个值
:返回的值以元组形式呈现
二、函数调用的三种形式
def func(x,y):
if x > y:
return x
else:
return y
func(1,2) # 直接传值
res=func(3000,2000) * 12 # 调用函数的结果
res=func(func(1000,2000),3000) # 把函数的结果(调用)当作参数
三、函数参数的分类
1. 函数定义阶段的参数
① 形参
- 在函数定义阶段,括号内定义的参数,称之为形式参数,简称形参,本质是变量名
② 位置形参
- 在函数定义阶段,按照从左到右的顺序依次定义的形参,称为位置形参
- 特点:但凡是按照位置定义的形参,都必须被传值,并且不能多不能少,否则会报错
③ 默认参数(默认形参)
- 在函数定义阶段,就已经为形参赋值,也称为默认形参
- 特点:在定义阶段就已经被赋值,意味着在调用阶段可以不用为其传值(如果传值,会以传的值为准)
def func(x,y=10)
中的y=10
就是默认参数
注意:
- 位置形参必须放在默认形参的前面
- 默认形参的值在定义阶段已经赋值,即默认参数的值在函数定义阶段就已经固定(除非调用时专门传值)
- 默认参数的值通常应该定义为不可变类型,避免耦合(解耦思想,单独使用不影响其他)
- 有一部分,或大多数都一样,可以定义为默认形参,个别不同的再传值
2. 函数调用阶段的参数
① 实参
- 在函数调用阶段,括号内传入的值,称为实际参数,简称实参,本质就是变量的值
② 位置实参
- 在函数调用阶段,按照从左往右的顺序依次定义的实参,称为位置实参
- 特点:按照对应的位置,给形参依次传值,严格受限于位置;实参就是给形参传值的
③ 关键字实参
- 在调用函数时,按照
key=value
的形式为指定的参数传值,称为关键字实参- 特点:不受位置的限制,仍然可以给指定的形参传值
- 位置实参和关键字实参可以混用
- 但是位置实参必须在关键实参的前面,否则会报错
- 并且关键字实参不能对一个形参重复赋值
3. 总结:
① 实参的应用场景:
- 根据需求,可以位置实参传值,也可以使用关键字传值
② 形参的应用场景:
- 当大多数情况不一样时,可以考虑将该参数定义成位置形参
- 当大多数情况一样时,可以考虑将该参数定义成默认形参(即定义函数时就规定一个大多数都用的值)
4. 可变长参数
- 指的是在调用函数时,传入的参数个数可以不固定
- 长度指的是参数的个数
- 调用函数时,传值的方式有位置实参和关键字实参,对应形参也需要有两种解决方案,分别来接收溢出的位置实参
*
和关键字实参**
① 形参中*
的使用
- 在函数定义阶段,形参中的
*
会将溢出的位置实参全部接收,存成元组的形式,然后把元组赋值给*
后面的变量名z
- 格式:
def 函数名(x,y,*z):
- 约定俗成,形参中的
*变量名
的写法统一为:*args
- 一般应用于实参不固定的场景
- 比如:求出多个数的和,数字个数不固定,就可以用到
② 形参中**
的使用
- 在函数的定义阶段,形参中的
**
会将溢出的关键字实参全部接收,以字典的形式存储,并赋值给**
后面的变量名- 约定俗成,形参中的
**变量名
的写法统一为:**kwargs
③ 实参中*
的使用
- 在函数调用阶段,
*
会将后面的值,进行for
循环取出,形成位置实参(一个个值),因此,*
后可以放能被for
循环取出的数据类型- 格式:
函数名(实参,*实参)
- 但凡遇到实参中带
*
的,那么它就是位置实参,应该立马打散成位置实参看
④ 实参中**
的使用
- 实参中使用
**
,这个参数必须为字典- 实参中的参数前面带
**
,**
会将这个参数的值循环取出,拆成关键字实参- 但凡遇到实参中参数前面带
**
的,它就是关键字实参,应该将其拆分成关键字实参看
⑤ 实参中*
和**
的使用
⑥ 形参中和实参中*
的综合使用
- 应用场景:
*
应对溢出
⑦ 形参中和实参中*
和**
的综合使用
- 如果想将函数的实参,原封不动的传给内部的函数,就需要使用
*args
和**kwargs
- 这种原封不动的传值,要遵循
index
的规则传值方式才可以
def index(name,age,sex):
print(‘Welcome %s:%s:%s to index page‘ %(name,age,sex))
def wrapper(*args,**kwargs):
index(*args,**kwargs) # *(1,2,3) **{‘a‘:4,‘b‘:5,‘c‘:6} 实参都会将这些打散
# index(1,2,3,a=4,b=5,c=6) 原封不动的将实参翻译过来,
# 因此,wrapper的实参实际是传给index的
wrapper(name=‘xut‘,age=18,sex=‘male‘)
5. 命名关键字形参(了解)
- 目的是让用户必须用关键字实参传值
- 在函数定义阶段,
*
后面的参数都是命名关键字参数- 格式:定义函数时,
def func(x,y,*args,后为命名关键字参数)
,注意,*args
还是接收溢出的位置实参- 特点:在传值时,必须按照
key=value
的形式传,并且key
必须命名关键字参数指定的参数名
- 最全参数使用,但是没有这种应用场景,z=1表示命名关键字默认参数,而不是默认参数
以上是关于Python函数的主要内容,如果未能解决你的问题,请参考以下文章