Python 函数

函数

说明:函数是以功能为导向,封装单一功能的代码块,能够被调用执行

优点:函数能够降低代码的重复率

   提高代码的可读性

函数的定义:

  def fun():

    函数体

函数的调用:

  fun()

  函数被调用了多少次,函数就执行多少次

函数的返回值:

  通过return关键字将函数体的结果返回给函数的执行者

  return的作用:

      1. 结束函数

      2. 函数中没有或者只有一个return 函数返回一个None给函数执行者

      3. return后面有一个值得时候,函数执行知将得到这个值(不会改变数据类型)

      4. return后面跟多个值得时候,多个值组成元组后返回给函数执行者

函数传参: 实际就是实参传给形参的行为过程

    形参:定义函数时括号中的参数,用于接收调用函数时传过来的实参

      分类:

        位置参数  从左至右 按照顺序 一一对应

        默认参数  一定要在位置参数的后面,不传实参默认使用形参的默认参数

        动态参数

        仅限关键字参数

    实参:代用函数时指定的参数,用于传给函数中的形参供函数体使用

      分类:

        位置参数  从左至又 一一对应

        关键字参数  一一对应

        动态参数  关键字参数一定要在位置参数后面 一一对应

 

函数的传参:形参角度:第三种传参方式。

 

动态参数:*args **kwargs

 

*args : 能够接收实参角度的所有位置参数,得到一个元组存储到args中

**kwargs : 接收实参角度的所有关键字参数,得到一个字典存储在kwargs中

 

# def eat(food1,food2,food3):
#     print(f'我请你吃:{food1},{food2},{food3}')
# eat('蒸羊羔','蒸熊掌','蒸鹿尾')

# 当给函数传入的参数数目不定时,之前的传参方式解决不了问题。
# 万能参数,动态参数。 *args
# def eat(food1,food2,food3):
#     print(f'我请你吃:{food1},{food2},{food3}')
# eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')

def eat(*args): # 将实参角度:定义一个函数时,* 所有的位置参数聚合到一个元组中。
  print(args)
  print(f'我请你吃:{args}')
eat('蒸羊羔','蒸熊掌','蒸鹿尾','烧花鸭','烧企鹅')

 

*的魔性用法

 

  • 函数中的打散和聚合

 

在函数的定义时 *起到的是聚合的作用

在函数的执行时 *起到的是打散的作用

 

  • 处理剩下的元素

    a,*b = (1, 2, 3, 4,)
    print(a, b) # 1 [2, 3, 4]
    *rest,a,b = range(5)
    print(rest, a, b) # [0, 1, 2] 3 4
    print([1, 2, *[3, 4, 5]]) # [1, 2, 3, 4, 5]

     

 

 

 

形参角度的最终顺序

 

位置参数,*args,默认参数,**kwargs (仅限关键字参数在*args和**kwargs之间,和默认参数的位置不冲突)

 

原因:

 

  • 动态参数*args不能放在位置参数之前,这样位置参数就接收不到任何实参了,都被*args抢去了

  • 动态参数*args一定要在默认参数之前,因为放在默认参数后面就没法使用默认参数的默认值了

  • 动态参数**kwargs一定要放在默认参数之后,如果在默认参数之前会报错,因为默认参数的值永远改变不了

 

第四种传参方式:仅限关键字参数

 

仅限关键字参数是python3x更新的新特性,他的位置要放在*args后面,kwargs前面(如果有kwargs),也就是默认参数的位置,它与默认参数的前后顺序无所谓,它只接受关键字传的参数

 

也可以把它当成没有默认值的默认参数,只接受关键字参数,不传就会报错

 

从空间角度研究函数

 

 

全局名称空间: py文件运行时开辟的,存放的是执行的py文件(除去函数内部)的所有的变量与值(地址)的对应关系,整个py文件结束之后,才会消失。

 

临时(局部)名称空间: 函数执行时,在内存中临时开辟的一个空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失。

 

内置名称空间:存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

 

加载顺序(三个空间加载到内存的顺序)

 

内置命名空间(程序运行伊始加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载

 

取值顺序:(就近原则)取值顺序就是引用一个变量,先从哪一个空间开始引用

 

取值顺序满足的就近原则,从小范围到大范围一层一层的逐步引用。

 

 

作用域

 

作用域就是作用范围, 按照生效范围来看分为全局作用域和局部作用域

 

全局作用域:全局名称空间,内置名称空间。

 

局部作用域:局部名称空间。

 

内置函数:globals,locals

 

globals(): 以字典的形式返回全局作用域所有的变量对应关系。

 

locals(): 以字典的形式返回当前作用域的变量的对应关系。

 

高阶函数(嵌套函数)

 

函数的嵌套,就是一个函数中,还有函数。

 

posted @ 2019-06-17 20:05  穆澄  阅读(148)  评论(0编辑  收藏  举报
Live2D