函数(方法)

函数的定义和调用

申请内存,存函数体代码
将内存地址绑定给函数名
定义函数,不会执行函数体代码,但是会检测语法

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()
原文地址:https://www.cnblogs.com/pythonwl/p/12513240.html