第十天

函数

一、函数的定义与调用:

定义函数时发生的事情:

  1、申请内存空间把函数体代码放进去
  2、将函数内存地址绑定给函数名
  强调:定义函数只检测语法,不执行代码

调用函数时发生的事情:

  1、先通过函数名定位到函数的内存地址
  2、函数内存地址()->触发函数体代码的运行
  强调:调用函数才会执行函数体代码

1.1什么是函数:

  函数就是盛放代码的容器

  具备某一功能的工具->函数
  事先准备工具的过程-》函数的定义
  遇到应用场景拿来就用-》函数的调用

  所以函数的使用原则:
  先定义
  后调用

1.2为什么要学函数:

  解决下述问题:
    1、代码组织结构不清晰、可读性差
    2、可扩展性差

1.3如何用函数:

  定义的语法:
def 函数名(参数1,参数2,参数3,...):         #定义的方法
    '''函数的文档注释'''
    代码1
    代码2
    代码3
    return 返回值
函数名(参数1,参数2,参数3,...)      #调用的方法

二、定义函数和调用函数的的三种形式:

2.1定义函数的三种方式

  1、无参(无需为代码块传值)
        例:
            def say():                     #无参函数的定义,括号内可以不用写参数
              print("hello")
            say()                          #无参函数的调用,如果定义时没有参数那调用时也可以没有参数
  2、有参(需要为代码块传值)
        例:
              def compare(x,y):             #有参函数的定义,括号内写了参数
                  if x > y:
                    print(x)
                  else:
                    print(y)
              compare(10,20)              #有参函数的调用,定义时有参数那调用时应该也有参数
  3、空
        例:
            def x():    #空函数的调用,多用与在建立功能结构时先占位,等以后再补充
              pass

2.2调用函数的三种方式:

  1、语句式
        例:
        len("hello")       
  2、表达式
        例:
        res=len("hello")*10
        print(res)
  3、可以当作参数传给另一个函数
        例:
        print(len("hello")

三、参数的形式:

3.1形参(在定义阶段,相当于变量名)

  1、位置形参与默认值形参
  例:
    def func(x,y):      #位置形参的定义,括号内的参数必须被赋值
        print(x)
        print(y)
    func(10,20)
    def func(x,y=20)     #默认值形参的定义,在函数定义阶段就默认赋值了,在调用阶段可以不用为其赋值
        print(x)                              如果实参传入了新值那么代码块内所用的值为新值
        print(y)
    func(10)
  ps:位置形参与默认形参可以混用,但是位置形参必须在关键字形参的前面

3.2实参(在调用阶段,相当于变量值)

  1、位置实参与关键字实参
  例:
   def func(x,y):
        print(x)
        print(y)
   func(10,20)           #位置实参的定义,从左到右依次为形参赋值,不能多也不能少
   func(y=20,x=10)       #关键字实参的定义,以key:value的形式为形参传值,可以无需,不能多也不能少
  ps:位置实参与关键字实参的方式可以混用,但是位置实参必须在关键字实参的前面

四、可变长参数:*与**在形参与实参中的作用

4.1*与**在形参中是一种汇总行为

  例:
    def func(x,*args)     #*在形参中的作用:*会接收溢出的位置实参,组合成一个元祖,并赋值给args
        print(x)
        print(args)
    func(1,2,3,4,5)
    def func(x,**kwargs)    #**在形参中的作用:**会接收溢出的关键字实参,组合成一个字典,并赋值给kwargs
        print(x)
        print(kwargs)
    func(x=10,y=20,z=30)

4.2*与**在实参中是一种打散行为

  例:
    def func(x,y,z):
        print(x)
        print(y)
        print(z)
    func(*[1,2,3])           #*在实参中的作用:*后面可以跟一个能被for循环使用的值,*会将紧跟其后的值打散成位置实参
    func(**{x=10,z=30,y=20)    #**在实参中的作用:**后面只能跟一个字典,**会将字典打散成关键字实参

了解:命名关键字形参(用处不多,只用于了解)

  例:
    def func(x,*args,y=20,z,**kwargs)    #在*与**之间的参数叫做命名关键字形参,这时y=20,z就叫命名关键字形参而不是关键字形参与位置形参
        print(x)                              如果z接在*后面那z永远不会被传值,所以顺序不能写反
        print(args)
        print(y)
        print(z)
        print(kwargs)
    func(1,2,3,4,z=30,a=10,b=20,c=30)
原文地址:https://www.cnblogs.com/kk942260238/p/14202049.html