Python 基础知识——函数(一)

 

微信公众号:数据分析与统计学习
如有问题或建议,请公众号留言
 

一、前言

Python的系列文章主要介绍python语言的基础语法知识。按照核心内建数据类型、语句、函数、类、异常、标准模块的顺序对相关的语法知识进行讲解。
python函数知识的介绍主要分为两块:第一部分讲解函数的基础知识,包括函数的定义、参数、作用域;第二部分介绍函数的高级特性,包括迭代器、生成器、匿名函数lambda,递归函数和装饰器以及常见的函数工具。
本期主要介绍函数的基础知识。

二、为什么使用函数

1、函数是最大化的代码重用和最小化代码冗余的最基本的程序结构
2、流程的分解。函数提供一种将系统分割为定义完好的不同部分的工具。

三、函数的定义(创建)——def语句

def语句是一个可执行的代码,在未执行前,函数对象不存在,执行后,创建一个函数对象并将其赋值给一个变量名(就是函数名)。函数名变成了一个函数的引用。
def语句可以嵌套的在其他语句当中。

通用格式

1def  <name>(arg1, arg2, arg3, …argN):
2    <statements> 
3    return <value>


return 语句包含一个对象表达式,它是函数的结果

四、变量的作用域

变量的作用域就是变量定以及查找的地方。Python创建、改变或查找变量名都是在命名的空间(一个保存变量名的地方)中进行的。作用域就是命名空间。
所有变量名,包括作用域,都是在Python赋值的时候产生的。由于变量最初没有声明,Python将一个变量名的地点关联为(绑定给)一个特定的命名空间。换句话说,在代码中给一个变量赋值的地方决定了该变量将存在于哪个命名空间,也就是作用域或者说可见范围或者说使用的地方。
一个函数的所有变量名都是与函数的命名的空间相关联的。

作用域法则:

1、内置的模块是全局作用域
2、全局作用域的作用的范围仅限于单个文件
3、每次对函数的调用都创建了一个新的本地作用域
4、赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量。
5、所有其他的变量名都可以归纳为本地、全局或者内置的。

变量名解析:LEGB原则

1、变量名引用先后在4个作用域查找:首先是本地(L),之后是函数内(E),其次是全局(G),最后是内置(B)。并在第一处能够找到该变量名的地方停止查找。
2、在默认情况下,变量名赋值会创建或者改变本地作用域的变量。除非已经声明为全局变量。
3、当在函数之外给一个变量赋值时,本地作用域与全局作用域是相同的。
4、全局声明和非本地声明将赋值的变量映射到模块文件内部的作用域。

global语句

格式:global x, y ,z, …

声明变量为全局变量,无论变量是否赋值,都可以被引用。查找变量时直接在全局作用域或者嵌套模块开始,然后内置作用域。
1、全局变量位于模块文件内部的顶层变量名
2、全局变量如果是在函数内被赋值的话,必须声明
3、全局变量名在函数的内部不经过声明也能引用

需要注意的是:

1、最小化全局变量(尽量避免使用全局变量)
2、最小化文件间的修改(文件间信息的传递最好通过函数)
nonlocal语句(用于嵌套的def语句中)
格式:nonlocal x, y, z, …
内嵌def语句中的变量可以引用外层def语句中的变量,但是不能修改。如果想修改,可以在内嵌def语句中对外层def语句中的变量进行nonlocal声明,从而可以对外层def语句中的变量进行修改。
nonlocal限制作用域查找只是被嵌套def语句中,而不是继续到全局或内置作用域。无论变量是否赋值,都可以被引用。

五、函数的参数

传递参数的关键点

1、参数的传递是通过自动将对象赋值给本地变量名来实现的
2、在函数内部的参数名的赋值不会影响被调用者
3、改变函数的可变对象参数(可作输入和输出)的值也许会对调用者有影响
4、不可变参数“通过值”传递。如数字、字符串、元组是通过对象引用赋值传递给参数,但不能在函数内部修改,实际效果像创建了一份拷贝。
5、可变对象是通过“指针”传递。如列表和字典通过引用对象赋值传递给参数,但能在函数内部原处修改对象,实际效果像指针一样。

参数的匹配模式:

1、位置参数:从左至右进行匹配
2、关键字参数:通过参数名匹配
3、默认参数:为没有传入值的参数定义参数值
4、可变参数:收集任意多基于位置或关键字的参数。以字符开头 5、可变参数解包:传递任意多基于位置或关键字的参数。以字符开头
6、Keyword-only参数:参数必须按照名称传递

参数匹配表

函数调用

1#语法                解释
2func(value)         # 常规参数:通过位置进行匹配
3func(name=value)    # 关键字参数:通过变量名匹配
4func(\*iterable)    # 分解位置参数的序列或其他迭代
5func(**dict)        # 分解关键词参数的字典

函数定义(创建)

1#语法                  解释
2def func(name)          # 常规参数:通过位置或变量名进行匹配
3def func(name=value)    # 没有传递name时的默认值
4def func(*name)         # 收集额外的位置参数作为新的元组名
5def func(**name)        # 收集额外的关键字参数作为新的字典名
6def func(*args, name)   # 参数必须在调用中按照关键字传递
7def func(*, name)       # 参数必须在调用中按照关键字传递
8

混合特定的参数匹配模型的注意事项

1、在函数调用中,参数必须按照下面的顺序出现:任何位置参数(value),后面跟着任何关键字参数(name=vlaue)和iteralbe形式的组合,后面跟着*dict形式。

2、在函数定义头部中,参数必须按照下面的顺序出现:任何一般参数(name),紧跟着任何默认参数(name=value),如果存在,后面是name的形式,后面跟着任何name或name=value keyword-only参数,后面是*name的形式。

Python内部在对参数赋值前是通过以下的步骤对参数进行匹配的。
1、通过位置分配位置参数
2、通过匹配变量名分配关键字参数
3、其他额外的位置参数分配到name元组中 4、其他额外的关键字参数分配到*name字典中
5、用默认值分配给在头部未得到的分配的参数。

六、后记

写到这里,本期内容讲解完了,不知道读者的你有什么不明白的地方,欢迎各位留言反馈。小编尽最大的努力让理解我所介绍的内容。
下期,小编主要介绍python函数的高级特性。敬请期待。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值