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函数的主要内容,如果未能解决你的问题,请参考以下文章

python使用上下文对代码片段进行计时,非装饰器

python 元组有用的函数,方法和片段。

Python代码阅读(第26篇):将列表映射成字典

VSCode自定义代码片段——声明函数

Python学习 :函数

VSCode自定义代码片段8——声明函数