Python学习笔记
函数
定义:申请内存空间将保存函数体代码,将上述内存地址绑定函数名,
定义函数不会运行函数体代码,但是会检测函数体代码语法
def 函数名(参数1,参数2...):
'''文档描述'''
函数体
return 值
调用:通过函数名找到函数的内存地址,然后通过加括号触发函数体代码的执行
1.语句形式:只加括号调用函数
2.表达式形式:赋值表达式,数学表达式
3.函数调用当参数
函数返回值:
return是函数结束的标志,即函数体代码一旦运行到return会立刻
终止函数的运行,并且会将本次运行的结果返回
1.返回None:函数体内没有return
return
return None
2.返回一个值:return 值
3.返回多个值:return 值,值
用逗号分隔开,会被return返回成元组
无参函数:
无需参数,自身代码能实现功能
有参函数:
需要参数,代码执行是需要传入对应的参数才能执行
形参:
在定义函数阶段定义的参数称之为形式参数,简称形参,相当于变量名
实参:
在调用函数阶段传入的值称之为实参,相当于变量值
形参与实参的关系:
在调用阶段,实参(变量名)会绑定给形参(变量名)
这种绑定关系只能在函数体内用
形参与实参绑定关系在函数调用是生效,函数调用结束后解除绑定关系
形参与实参的具体作用:
1.位置参数:按照位置从左到右的顺序依次定义的参数称之为位置参数
位置形参:在函数定义阶段,按照从左到右的顺序直接定义的“变量名”
特点:必须被传值,多一个不行少一个不行
位置实参:在函数调用阶段,按照从左到右的顺序依次传入的值
特点:按照顺序与形参一一对应
2.关键字参数(实参)
关键字实参:在函数调用阶段,按照key=value的形式传入的值
特点:可以指明给某个形参传值,完全不参照顺序
3.默认参数(形参)
默认形参:在定义函数阶段。就已经被赋值的形参,称之为默认形参
特点:在定义阶段就已经被赋值,意味着在调用阶段可以不用为其赋值
默认形参是在函数定义阶段被赋值的,被赋予的是值的内存地址
不推荐使用可变类型
4.混合使用:
1.位置实参必须放在关键字实参前
2.不能为同一个形参重复传值
可变长度的参数:
可变长度指的是在调用函数时,传入的值(实参)的个数不稳定
而实参是用来为形参赋值的,所以对应着,针对溢出的实参必须有对应的实参来接收
形参:
*形参格式:接收溢出的位置实参,溢出的实参会被*保存成元组的格式然后赋值紧跟其后的形参
*后跟的可以说任意名字,但是约定俗成的是args
**形参格式:接收溢出的关键字实参,**会将溢出的实参会保存成字典的格式然后赋值紧跟其后的形参
**后跟的可以说任意名字,但是约定俗成的是kwargs
实参:
实参中带*,先将*后的值打散成位置实参
实参中带**(**后只能是字典),先将**后的值打散成关键字实参
混用*与**:*args必须在**kwargs前
特点:什么都能接收(元组在前,字典在后)
函数对象:
精髓:可以把函数当成变量去用
可以把函数当做参数传给另外一个函数
可以把函数当做另外一个函数的返回值
可以把函数当做容器类型的一个元素
名称空间与作用域
名称空间:
存放名字的地方,是对栈区的划分
有了名称空间后,就可以在栈区中存放相同的名字
名称空间分为三种:
1.内置名称空间
存放的名字:存放Python解释器内置的名字
存活周期:Python解释器启动则产生,Python解释器关闭则销毁
2.全局名称空间
存放的名字:只要不是函数内定义,也不是内置的,剩下的都是全局名称
存活周期:Python文件运行则产生,Python文件运行完毕后销毁
3局部名称空间
存放的名字:在调用函数时,运行函数体代码的过程中产生的函数内的名字
存活周期:在调用函数是存活,函数调用完毕后则销毁
名称空间的加载顺序:
内置名称空间------>全局名称空间------->局部名称空间
名称空间的销毁顺序:
局部名称空间------>全局名称空间------->内置名称空间
名称的查找优先级:当前所在的位置往上一层一层查找(以定义为基准)
局部名称空间 ^
全局名称空间 ^
内置名称空间 ^
作用域:
作用范围:
全局作用域:全局有效:被所有函数共享
内置名称、全局名称
局部作用域:临时存活,局部有效
局部名称
装饰器:为其他函数添加额外的功能
在不修改被装饰对象源代码以及调用方式的前提下为被装饰对象增加新功能
开放封闭原则:
开放:指的是对拓展功能是开放的
封闭:指的是对修改源代码是封闭的
语法糖:
可以更加方便的调用装饰器
@函数名
无参装饰器:
from functools import wraps
def outter(func)
@wraps(func)
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
叠加多个装饰器:
加载顺序为自下而上
加载顺序为自上而下
闭包函数:
闭包函数 = 名称空间与作用域 + 函数嵌套 + 函数对象
核心点:名字的查找关系是以函数定义阶段为准
生成器:generator
在函数内一旦存在yield关键字,调用函数并不会执行函数体代码,会返回一个生成器对象,生成器即自定义迭代器
__next__会触发函数体代码的运行,然后遇到yield停下来会将yield后的值当做本次调用的结果返回
迭代器:keyiterator
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代
可迭代对象:
__iter__()将可迭代对象转化成迭代器
__next__()将可迭器取出
在一个迭代器取值取干净的情况下,在对其取值取不到
for循环原理:迭代器循环
1、可迭代对象.__iter__()得到一个迭代器对象
2、迭代器对象.__next__()拿到一个返回值,然后该返回值赋值给X
3、循环往复步骤2,直到抛出异常StopIterantion然后for循环捕捉异常结束循环
def fo(d):
while True:
dc = d.__iter__()
while True:
try:
print(dc.__next__())
except StopIteration:
break
break
三元表达式:
条件成立时要返回的值if条件else条件不成立要返回的值
res = 1 if 1 > 2 else 2
等同于
res = if i > 2:
return 1
else:
return 2
函数的递归调用:
在调用函数的过程中又直接或者间接地调用到本身
强调:
递归不应该无限循环地调用下去,必须在满足条件后结束递归调用
递归的两个阶段:
回溯:一层一层调用下去
递推:满足某种结束条件,结束递归调用,然后一层一层返回
匿名函数lambda:用于临时调用一次的场景

浙公网安备 33010602011771号