一、初识函数对象
函数非常重要,但是不要过于害怕,搞清楚本质
函数:更高级的容器,里面存的不是数据,而是代码
一个容器能干嘛,函数也可以干嘛
函数对象--把函数当成一个普通数据容器来使用
1.函数可以被引用(把定义好的函数赋值给变量)
<1>把函数的返回值赋值给一个变量
def fun1():
return 'hello'
a=fun1() #把函数fun1的返回值赋值给了变量a
print(a)
<2>把函数本身复制一份给一个变量,这个变量就相当于函数的分身
# <1>把函数的返回值赋值给一个变量
def fun1():
return 'hello'
a=fun1() #把函数fun1的返回值赋值给了变量a
print(a)
print(b()) #会达到两个目的:首先调用函数,有print会学先输出好好学习天天向上,其次函数没有定义返回值默认是None
2.函数可以作为元素放在列表,元组,字典中使用
集合是无序类型,没有对应查找的方法,所以函数如果存进去,不好把函数拿出来并且完成调用,所以一般不会把一个函数存到一个集合里
def fun2():
print('好好学习天天向上')
def fun3():
print('学习加油')
return 123
li=['伊诺',12,5,6,fun3,123] #存进去的时候函数不要加括号,加括号就调用了,不需要此时调用
li[4]() #学习加油
print(li[4]()) #学习加油 123
# print(li[4]) #内存地址
info={
'message':fun2,
'age':18
}
info['message']()
3.函数可以作为参数,传递给另一个函数
def name():
my_name='张三'
return my_name
def name1(a):
print(f'我是个靓仔{a}')
def name2(b):
print(f'{b}是靓仔一个')
name1(name()) #把name返回值传给了name1,name的返回值是张三 所以再作为参数传给了a
name2(name())
4.函数可以作为返回值来使用,你返回的数据可以是一个函数
'''
卑微小张在线打工
甲方派发的任务
老板(任务1,任务2)
小张(要求1,要求2)
干活
干活
返回 做好的东西
返回 小张(要求)
'''
def boss(a,b):
def xiao_zhang(c,d): #我接收到老板的任务,加了两个创意c,d
return c+d
return xiao_zhang(a,b) #老板拿到做好的东西 邀功
print(boss(66,88)) #成果是老板的,给老板打工
名称空间
名称空间:用来存名字的地方
程序中有一些专门的内存区域来保存对应的数据
名称空间-->存储变量名,函数名,模块名
内存数据-->变量值,函数代码,模块代码
生命周期-->一个数据/程序,从创建到结束的过程
名称空间 一共分为3层
1.内建名称空间(存内置函数)
生命周期:随着python程序启动而生成,在程序关闭时回收/清除所有数据
加载顺序:最先被加载出来的
存放对象:print input type sum..这些内置函数
2.全局名称空间(用户定义在python外层的名字)
生命周期:随着python程序启动而生成,在程序关闭时回收/清除所有数据
加载顺序:第二个加载出来的
存放对象:用户自己定义的变量名/函数名
3.局部名称空间(在函数内定义的名字)
生命周期:随着函数调用而生成,结束调用后关闭
加载顺序:在函数调用时才会被加载
存放对象:在函数里定义的变量名/函数名/形参名
a=666 #a定义在外层,属于全局名称空间
def fun():
z=666 # z定义在函数里,属于局部名称空间
#print(z) #在这里打印 小弟听太守的
print(88)
fun() #变量b只有在函数调用时才能输出
#print(z) #报错 相当于太守的小弟会听太守的话,但是不一定听曹老板的话
总结:
一个程序里的数据都是会存储在对应的位置
名称空间-->用来存储名字的地方!!
作用域
作用域:一个数据能够使用的范围
作用域分为:
1.全局作用域(内建名称空间,全局名称空间)
整个程序都可以使用
2.局部作用域(局部名称空间)
只有局部位置才能使用(函数内)
#全局变量 name是一个全局变量,整个程序里都可以使用
name='张三'
print(name) #不管在外层直接输出
def fun2():
print(name) #还是在函数里输出都可以
fun2()
#局部变量
def fun3():
num=1
print(num) #num是一个局部变量,正常来说只有函数fun3才能使用
fun3()
# print(num) #在外面直接打印会报错
global提权
用法一:可以将一个局部变量提权为全局变量
用法二:可以在局部内修改全局变量
ef 函数名():
global 变量名
变量名=变量值
#用法一:可以将一个局部变量提权为全局变量
def name():
global a #这个语句必须写在要提权的变量的上面
a='加油'
name() #记得调用函数,才能生成对应的名称空间
print(a) #a就提权成为了全局变量 在外层也可以直接使用
# 用法二:可以在局部内修改全局变量的值
num=10
def num_sum():
global num
num+=100
return num
print(num_sum())
nonlocal降权
必须在嵌套函数中,作用是在内部函数修改外部函数的变量值
将局部变量深度局部化
def fun():
a=520
def res():
nonlocal a #私有化 局部变量再度局部化
a=666
res()
print(a)
fun()
匿名函数 lambda表达式
我们平时函数都是称为:有名函数
匿名函数顾名思义:无名函数
给懒人用的-->如果你要写一个函数,但是不想给他取名字,那么就可以用匿名函数来写
语法格式:
lambda 变量:操作
#有名函数
def add1(a,b):
return a+b
print(add1(70,80))
#匿名函数
res=lambda a,b:a+b
print(res(90,100))
fun=lambda c:print(c)
fun('哈哈哈')