初识函数对象
函数 --> 更高级的数据容器,里面存的不仅仅是数据,而是代码
函数对象 --> 把函数当成一个普通数据容器使用
1.函数可以被引用 --> 可以用函数来赋值
数据名 = 函数名 # 把函数复制了一份
def fun():
print(666)
a = fun # a的数据类型是函数 把函数fun复制给了a 相当于a 等价于fun
a()
print(type(a))
# 666
# <class 'function'>
变量名 = 函数名() # 把函数返回值赋值给了变量
def fun():
print(666)
b = fun() # 运行函数,并把函数的返回值赋值给了变量b
b
print(b)
print(type(b))
# 666
# None
# <class 'NoneType'>
2.函数可以作为元素,放到数据容器里面 --> 函数可以放在列表,集合元祖,字典中
def fun1():
print(666)
li = [123,True,fun1]
tup = (123,True,fun1)
dic = {
1:666,
2:fun1
}
set1 = {1,22,fun1}
# 在需要使用函数的时候 ,再取出来加括号
3.函数可以作为一个参数,传给别的函数
def fun2(a):
print(a)
def add(a,b):
return a+b
fun2(sum([12,334,45]))
fun2(add(234,32))
# 391
# 266
4.函数可以作为返回值使用
def get_sum(a, b):
def add(c, d):
return c + d # 计算,把得到的结果返回出去
return add(a, b) # 把add的结果返回出去
print(get_sum(324, 25))
# 349
名称空间
名称空间 --> 用来存名字的地方
变量名,函数名,模块名
程序中有专门的内存区域来存储对应的数据(堆栈):
名称空间:存储变量名,函数名,模块名
内存数据:变量值,函数代码,模块里的代码
名称空间,一共分为三层:
1.内建名称空间(存内置函数)
生命周期:随着python程序启动而产生,在程序关闭时回收,清除所有数据
加载顺序:最先被加载出来的
存放对象:print,input,type等内置函数、
2.全局名称空间(自己定义在python外层的所有名字)
生命周期:随着python程序启动而产生,在程序关闭时回收,清除所有数据
加载顺序:第二个加载的
存放对象:用户自己定义的变量名,函数名
3.局部名称空间(在函数里定义的名字)
生命周期:随着函数的调用而生成,结束调用后关闭
加载顺序:在调用时才会被加载
存放对象:在函数里定义的变量名,函数名,形参
作用域
作用域:一个数据能够被使用的范围
全局作用域:整个程序里都可以使用
局部作用域:只有局部位置才能使用
提权操作 --> 让一个数据从局部变为全局
gloabl = 全局
def 函数名():
global 变量名
变量名 = 值
函数名() # 需要先调用函数,才能使用里面的变量
变量
降权操作 --> 让一个数据变得私有化‘
nonlocal = 私有化
匿名函数 lambda函数
def add(a,b):
return(a+b)
匿名写法:
add = lambda a,b:a+b
语法:
lambda 变量:操作
总结
函数对象:把函数当成一个普通数据来使用
1.可以用函数来赋值
2.可以把函数放在数据容器里(列表,集合,字典)
3.可以用函数作为参数
4.可以用函数作为返回值
名称空间:存放python程序里名字的地方
1.内建名称空间 – > 内置函数
2.全局名称空间 – > 定义在外部的名字
3.局部名称空间 – > 函数里的名字
作用域:
全局 – > 整个程序都可以使用
局部 – > 只有程序的部分区域才可以使用
对数据提权 – > 局部升为全局 --> global
对数据降权 – > 全局降为局部 – > nonlocal