函数:可读性,复用性强
def 函数名():
函数体
return 返回值
def my_max(x,y): m = x if x>y else y 三元运算 return m bigger = my_max(10,20) print(bigger)
函数进阶:
命名空间:
全局命名空间:程序在执行时,有上到下依次加载到内存
局部命名空间:函数内部定义的名字,只有函数调用时才会加载到内存中
内置命名空间:python 解释器(print,input...)启动就可以使用的名字存储在内置命名空间,在解释器启动时就会加载到内存中
(在局部可以使用全局与内置命名空间,在全局只能使用内置命名空间;内置不能使用局部与全局命名空间)
多个函数应该有多个局部命名空间,各个函数中局部空间不能互相使用
#在正常情况下,直接使用内置的名字
#当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字
#当我自己有的时候 我就不找我的上级要了
#如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错
# 多个函数应该拥有多个独立的局部名字空间,不互相共享
作用域:
# 作用域两种
# 全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域 ——globals()
# 局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()
# a = 1 # def func(): # global a 加global后,局部作用域将成全局作用域 # a = 2 # # func() # print(a)
# 对于不可变数据类型 在局部可是查看全局作用域中的变量
# 但是不能直接修改
# 如果想要修改,需要在程序的一开始添加global声明
# 如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效
#globals 永远打印全局的名字
#locals 输出什么 根据locals所在的位置
函数嵌套调用:
def max2(x,y): m = x if x>y else y return m def max4(a,b,c,d): res1 = max2(a,b) res2 = max2(res1,c) res3 = max2(res2,d) return res3 # max4(23,-7,31,11)
def f1(): def f2(): def f3(): print("in f3") print("in f2") f3() print("in f1") f2() f1()
nonlocal关键字
1.外部必须有这个变量
2.在内部函数声明nonlocal变量之前不能再出现同名变量
3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效
def f1(): a = 1 #1 def f2(): # 3 nonlocal a 只能修改上一级 a = 2 f2() # 1 print('a in f1 : ',a) f1()
闭包函数:
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数
由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!
我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?
是不是直接就把这个函数的名字返回就好了?
这才是闭包函数最常用的用法
def outer(): a = 1 def inner(): print(a) return inner inn = outer() inn()
判断闭包函数的方法__closure__
#输出的__closure__有cell元素 :是闭包函数 def func(): name = 'eva' 调用外部作用域,而非全局作用域 def inner(): print(name) print(inner.__closure__) return inner f = func() f()
“结果“:
(<cell at 0x0000026FD8E90F78: str object at 0x0000026FD9037D18>,)
egon
#输出的__closure__为None :不是闭包函数 name = 'egon' def func2(): def inner(): print(name) print(inner.__closure__) return inner f2 = func2() f2()
函数的嵌套:
嵌套调用
嵌套定义:定义在内部的函数无法直接在全局被调用
函数名的本质:
就是一个变量,保存了函数所在的内存地址
闭包:
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数