函数的定义和调用
申请内存,存函数体代码
将内存地址绑定给函数名
定义函数,不会执行函数体代码,但是会检测语法
def func():
函数体
调用函数
func()
有参函数,无参函数,空函数
语句形式,表达式形式,函数调用可以当参数
结束函数的调用:return
return 返回值,没有值或者return就是None
return x,y,[1,] 值组成元组,返回元组
实参与形参
位置参数
位置形参:
def func(x,y):
print(x,y)
参数必须传相应数量
位置实参:
参数必须一一对应传入,按形式参数名字赋值也可
关键字参数
具体到传给哪个形参,可以打乱传参顺序
混合使用:
先位置,后关键
不能为同一个形参重复传值
默认形参:
def func(x,y = 1):
print(x,y)
定义阶段赋值形参,为默认值
默认值一般不是可变类型,l = None
注意:有默认值的参数在后面
可变长度的参数
def func(x,y,z,*args,**kwargs):
用来接收溢出的位置实参:*args
用来接收溢出的关键字实参:**kwargs
args是溢出的值,args = (),保存成元组
**kwargs是字典
func([1,2,3])
将列表解压成三个位置参数
*实际参数 相当于遍历对象,取每一个值为位置参数
**实际参数 相当于遍历对象(字典,字典的key,必须和形参一一对应),取每一个值为关键字参数
*args 在 **kwargs 之前
def index(x,y,z):
print('index=>>> ',x,y,z)
def wrapper(*args,**kwargs): #args=(1,) kwargs={'z':3,'y':2}
index(*args,**kwargs)
# index(*(1,),**{'z':3,'y':2})
# index(1,z=3,y=2)
wrapper(1,z=3,y=2) # 为wrapper传递的参数是给index用的
原格式---》汇总-----》打回原形
命名关键字参数:定义函数时,*后定义的参数,
def func(a,s,*,t,n):
t,n为命名关键字参数
func(1,2,111,222)
t,n 只能传关键字参数
def func(x,a = 111,*args,命名关键字参数,**kwargs):
func(2,*,y=1,**)
名称空间:内置名称空间,全局名称空间,局部名称空间
内置:
Python解释器内置的名字
解释器的启动和关闭
全局:
除了内置,和函数内定义的名称,顶级代码的名称
python文件执行,开始与结束
局部:
函数体内,定义的名称
执行函数,开始与结束
加载:内置>全局>局部
销毁:局部>全局>内置
空间不是真正的东西,真正的是栈区
名称查找优先级:
先找当前,找不到,然后再往上找:局部 > 全局 > 内置
名称空间的嵌套关系,以定义阶段为准了了了!!!
注意:运行顺序
局部空间的自由变量,检测语法的时候,就已经将变量名字放进名称空间,标记为什
么区域的变量,执行语法的时候,才绑定值
作用域
全局作用域:内置名称空间,全局名称空间
局部作用域:局部名称空间
global : 把变量变为全局变量
nonlocal: 用于把变量变为非local,非全局的变量
一:大前提:
闭包函数=名称空间与作用域+函数嵌套+函数对象
核心点:名字的查找关系是以函数定义阶段为准
二:什么是闭包函数
"闭"函数指的该函数是内嵌函数
"包"函数指的该函数包含对外层函数作用域名字的引用(不是对全局作用域)
闭包函数:名称空间与作用域的应用+函数嵌套
def f1():
x = 33333333333333333333
def f2():
print(x)
f2()
x=11111
def bar():
x=444444
f1()
def foo():
x=2222
bar()
foo()
闭包函数:函数对象
def f1():
x = 33333333333333333333
def f2():
print('函数f2:',x)
return f2
f=f1()
print(f)
x=4444
f()
def foo():
x=5555
f()
foo()
三:为何要有闭包函数=》闭包函数的应用
两种为函数体传参的方式
方式一:直接把函数体需要的参数定义成形参
def f2(x):
print(x)
f2(1)
f2(2)
f2(3)
方式二:
def f1(x): # x=3
x=3
def f2():
print(x)
return f2
x=f1(3)
print(x)
x()
import requests
传参的方案一:
def get(url):
response=requests.get(url)
print(len(response.text))
get('https://www.baidu.com')
get('https://www.cnblogs.com/linhaifeng')
get('https://zhuanlan.zhihu.com/p/109056932')
传参的方案二:
def outter(url):
# url='https://www.baidu.com'
def get():
response=requests.get(url)
print(len(response.text))
return get
baidu=outter('https://www.baidu.com')
baidu()
cnblogs=outter('https://www.cnblogs.com/linhaifeng')
cnblogs()
zhihu=outter('https://zhuanlan.zhihu.com/p/109056932')
zhihu()