python核心编程
一、python函数
1.1 函数的概念
概念: 代码实现了一个功能,集中放在一块,起个名字,下一次可以根据这个名字再次使用这个代码块,这就是函数
作用:
1. 方便代码重用
2. 分解任务,简化程序逻辑
3. 使代码更加模块化
函数分类:
1. 内建函数(python内置的一些函数)
2. 三方函数(别人写好的,自己直接用)
3. 自定义函数
1.2 函数的基本使用
# 函数定义
def 函数名():
函数体
# 函数调用
函数名()
1.3 函数的参数
1.3.1 单个参数
场景: 需要动态的调整函数体中某一个处理信息,则可以以参数的形式接收到相关数据
定义:def 函数名(参数名称):
函数的调用:函数名(参数值)
形参和实参的概念:
1. 上述函数定义中,“参数名称”即为形参
2. 在调用函数的时候,传递的真实数据,即为实参
1.3.2 多个参数
场景:需要动态的调整函数体中多个处理信息时,则可以以逗号做分割,接收多个参数
定义:def 函数名(参数名称1,参数名称2):
调用:
1. 函数名(参数1,参数2,参数3...) 形参和实参一一对应
2. 函数名(参数名称1=参数1,参数名称n=参数n...)
可以指明形参名称,称为“关键字参数”
不需要严格按照顺序
1.3.3 不定长参数
场景:如果函数体中,需要处理的数据,不确定长度,则可以以不定长参数的方式接收数据
方式1:
定义:def 函数名(*args) 函数体内部可以以元组变量的方式使用该参数
使用:函数名(参数1,参数2,参数3...)
方式2:
定义:def 函数名(**dic) 函数体中可以直接以字典变量的方式使用该参数
使用:函数名(参数名称1=参数1,参数名称2=参数2...)
参数拆包:
装包:把传递的参数,包装成一个集合,称为"装包"
拆包:把集合参数,再次分解成单独的个体,称为“拆包”
1.3.4 缺省参数
场景:当我们使用一个函数的时候,如果大多数情况下,使用的某个数据是一个固定值,或者属于主功能之外的小功能实现,则可以去使用默认值,这种参数我们称为“缺省参数”
定义:
def 函数名(变量1=默认值1,变量名2=默认值2)
在函数体中,即使外界没有传递指定变量,也可以使用,只不过值给的是默认值
使用:
函数名(变量1,变量2) 此处如果是缺省参数,则可以不填写
1.3.5 参数注意
值传递和引用传递:
值传递:传递过来只是原本数据的副本,修改副本,对原件没有任何影响
引用传递:是指传递过来的,是一个变量的地址,通过地址,可以存在同一份原件
注意:
1. 在python当中,只有引用传递(地址传递)
2. 如果数据类型是可变类型,则可以改变原件
可变类型有列表,集合,字典
3. 如果数据类型是不可变类型,则不可以改变原件
python里面不可变的数据类型有以下几种,分别是整型,浮点数,字符串,元组,冻结集合,布尔值
1.4 函数的返回值
场景:当我们通过某个函数,处理好数据之后,想要拿到处理的结果
语法:
def 函数():
函数体
return 数据
注意:
1. return后续代码不会被执行
2. 只能返回一次
3. 如果想要返回多个数据,把多个数据包装称为一个集合,整体返回(列表,元组,字典等)
1.5 函数的使用描述
场景:当我们编写三方函数,为了方便他人使用,就需要描述清楚我们所写的函数功能以及使用方式等信息
定义格式:
def calculate(a, b=1):
"""
计算两个数据的和
:param a: 数值1,数值类型,不可选,没有默认值
:param b: 数值2,数值类型,可选,默认值:1
:return: 返回计算的结果
"""
return a+b
查看函数使用文档 help(函数)
经验:
一般函数的描述,需要说明如下几个信息:
1. 函数的功能
2. 参数 例如:含义,类型,是否可以省略,默认值
3. 返回值 例如:含义,类型
1.6 函数的作用域
基本概念:变量的作用域
1. 可操作的范围
2. python是静态作用域,也就是说在python中,变量的作用域源于它在代码中的位置;在不同的位置,可能有不同的命名空间
命名空间: 是作用域的体现形式
不同的具体的操作范围
python_LEGB:
1. L-Local 函数内的命名空间 作用范围:当前整个函数体范围
2. E-Enclosing function locals 外部嵌套函数的命名空间 作用范围:闭包函数
3. G-Global 全局的命名空间 作用范围:当前模块(文件)
4. B-Builtin 内建模块命名空间 作用范围:所有模块(文件)
注意:
1. python里面没有块级作用域
2. LEGB规则按照 L->E->G->B的顺序进行查找
基于命名空间的常见变量类型
1. 局部变量:在一个函数内部定义的变量,作用域为函数内部,查看局部变量 locals()
2. 全局变量:
2.1. 在函数外部,文件最外层定义的变量
2.2. 作用域为整个文件内部
2.3. 查看全局变量 globals()
注意点:
1. 访问原则 从内到外
2. 全局变量命名的时候,用g_b 这样
1.7 相关函数
1.7.1 偏函数
概念:当我们写一个参数比较多的函数时,如果有些参数,大部分场景下都是某一个固定值,那么为了简化使用,就可以创建一个新函数,指定我们要使用的函数的某个参数,为某个固定的值;这个新函数称为”偏函数“
语法:
方式1:自己写一个新的
方式2:借助functools模块的partial函数
import functools
newFunc=functools.partial(函数,特定参数=偏爱值)
1.7.2 高阶函数
概念:当一个函数A的参数,接收的又是另一个函数时,则把这个函数A称为是”高阶函数“
例如:sorted函数(动态的计算两个数据)
1.7.3 返回函数
是指一个函数内部,它返回的数据是另外一个函数,把这样的操作称为”返回函数“
1.7.4 匿名函数
概念:称为”lambda函数“,顾名思义,就是指没有名字的函数
语法:
1. lambda 参数1,参数2...:表达式
2. 限制
只能写一个表达式 不能直接return
表达式的结果就是返回值
所以,只适用于一些简单的操作处理
1.7.5 闭包
概念:
1. 在函数嵌套的前提下
2. 内层函数引用了外层函数的变量(包括参数)
3. 外层函数,又把内层函数当做返回值进行返回
标准格式:
def test1(a):
b = 10
def test2():
print(a)
print(b)
return test2
应用场景:外层函数,根据不同的参数,来生成不同作用功能的函数
注意事项:
闭包中,如果要修改引用的外层变量,需要使用 nonlocal 变量 进行声明,否则会当作是闭包内新定义的变量
1.7.6 装饰器
作用:在函数名以及函数体不改变的前提下,给一个函数附加一些额外代码
代码:
注意:装饰器的执行时间是立即执行
进阶:
1. 装饰器叠加 从上到下装饰,从下到上执行
2. 对有参函数进行装饰
2.1 无论什么场景,保证函数调用参数个数一致
2.2 为了通用,可以使用不定长参数,结合拆包操作进行处理
3. 对有返回值的函数进行装饰 无论什么场景,保证函数返回值一致
4. 带有参数的装饰器
4.1 通过@装饰器(参数)的方式,调用这个函数,并传递参数;并把返回值,再次当做装饰器来进行使用
4.2 先计算@后面的内容,把这个内容当作是装饰器