函数 前半部

函数

什么是函数

在程序中,函数就是具备某一功能的工具,事先将准备好的工具准备好就是函数的定义

 

为什么要用函数

没有函数的话,写程序的时候会遇到以下问题:

  1. 程序长

  2. 扩展性差

  3. 可读性差

如何用函数:

先定义函数,再使用函数

 

函数的分类:内置函数和自定义函数

定义函数

语法

有参数函数,及应用场景

在函数定义阶段括号内有参数,成为有参函数

注意: 定义时有参,意味着调用的时候也必须传入参数

如果函数逻辑代码需要依赖外部传入的值。必须定义为有参函数

无参数函数,及应用场景

定义函数时,参数是函数体接收外部传值的一种媒介,其实就是一个变量名

在函数阶段,括号内没有参数,成为无参函数

注意:定义时无参,意味着调用的时候也无需传入参数

如果代码逻辑不需要依赖外部传入的值,则必须定义为无参函数

空函数,及应用场景

当你知道你需要实现某种功能的时候,但不知如何代码实现的时候,你可以暂时写一个空函数

def func():
   pass

 

调用函数

函数名() 即调用函数

会执行函数代码,直到碰到return 或者执行完函数内所有代码结束

如何调用函数

函数调用的三种方式

def max_self(x,y):
   if x>y:
       return x
   else:
       return y
   
   
   
# 1
max_self(1,2)
# 2
res = max_self(1,2)
# 3
max_self(max_self(2000,3000),4000)

 

函数的返回值

函数参数的应用:形参和实参,位置形参,位置实参,关键字实参,默认形参,*args **kargs

形参

在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名

实参

在函数调用阶段,括号内传入的参数,称之为实际参数,简称实参,本质就是变量的值

位置形参

在函数定义阶段按照从左到右的循序依次定义的形参,称之为位置形参

特点:按照为之定义的形参,都必须被传值,多一个也不行少一个也不行

位置实参

在函数调用阶段,按照从左到右的顺序依次定义的实参,被称之为位置实参

特点: 按照位置为对应的形参依次传值

关键字实参

在调用函数时,按照key=value的形势为指定的参数传值,成为关键字实参

特点:可以打破位置的限制,但仍能为指定的形参赋值

注意:

  1. 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边

  1. 可以混用位置实参和关键字实参,但是不能对一个形参重复赋值

默认形参

在定义阶段就已经被赋值。

特点,在定义阶段就已经被赋值,意味着调用时可以不用为他赋值

注意:

  1. 位置形参必须放在默认形参的左边

  2. 默认形参的值,之在定义阶段复制一次,也就是说默认参数的值在函数定义阶段就已经固定

  3. 默认参数的值通常是不可变类型

总结:

实参的应用:取决于个人习惯

形参的应用:

  1. 大多数情况的调用值不一样,变化较大,就应该将该参数定义成位置形参

  2. 大多数情况的调用之一样,变化较小,就应该将该参数定义成默认形参

高级函数(函数对象)

可变长参数:指的是在调用函数时,传入的参数个数可以不固定

调用函数时,传值的方式无非两种,一种为位置实参,一种是关键字实参,因此形参也必须有两种解决方法,以此来分别接受溢出的位置实参(*)和关键字实参(**)

可变长实参 *

实参中的* ,* 会将*后参数的值循环取出,打散成位置实参,以后但凡碰到实参中带 *的,他就是位置实参,应该马上打散成位置实参去看

可变长形参 **

形参中的 **会将溢出的关键字实参全部接受,然后存储字典的形势,然后把字典赋值给 * *后的参数, 约定俗成 * * 后的参数名为kwargs

可变长实参之**

实参中的**,会将后参数的值循环取出,打散成关键字实参

命名关键字形参

需求: 函数的使用者必须按照关键字实参传

命名关键字形参,在函数定义阶段,* 后面的参数都是命名关键字参数

特点: 在传值的时候,必须按照key=value的方式传值,而且key鼻血命名关键字参数指定的参数名

函数对象的四大功能

  1. 引用

  2. 当做参数传给一个函数

  3. 可以当做函数的返回值

  4. 可以当做容器类型的元素

函数嵌套

函数内部定义的函数,无法在函数外部使用内部定义的函数

函数内部的函数只能在函数内部调用

作用域和名称空间

内置名称空间

存放python解释器自带的名字,如int float 等

生命周期,再解释器启动时生效,再解释器关闭时失效

全局名称空间

全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间下,如x,fun , z

生命周期:在文件执行时生效,在文件执行结束后失效

局部名称空间

局部名称空间: 用于存放函数调用期间函数体产生的名字

生命周期:在文件执行函数调用期间生效,在函数执行结束后失效

加载顺序

内置------->全局------->局部

查找顺序

局部------->全局-------->内置 ( 从当前位置开始查找,如果当前位置为全局,则为全局)

闭包函数

闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用)

闭包函数: 函数内部函数对外部作用域而非全局作用域的引用

提示 :我们之前都是通过参数将外部的值传给函数,闭包提供另外一种思想

两种方式: 使用参数的形式 包给函数

 

装饰器

什么装饰器,指为装饰器对象添加额外功能,因此定义一个装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能

注意:

  1. 装饰器本身其实是可以任意可调用的对象

  2. 被装饰的对象也可以是任意可调用的对象

为什么要用装饰器:例如。我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改该方法的使用模式,这时候可以使用装饰器,因为一旦软件上线后,一般对修改源代码是封闭的,对于扩展功能是开放的

两大原则:

  1. 不修改被装饰对象的源代码

  2. 不修改被装饰对象的调用方式

 

第一种传参方式:改变调用方式

第二种传参方式:包给函数-外包

 

 

原文地址:https://www.cnblogs.com/zrx19960128/p/10960190.html