前言
函数非常非常重要,但是也不要过于的神话,害怕它.认清它的本质就好了
函数,就是一个高级点的数据容器,一个数据能干啥,函数也能干啥
- 函数可以被引用
- 函数可以作为元素,放到列表,元组,集合,字典中
- 函数可以作为参数,传给别的函数
- 函数可以作为一个返回值
直接和间接:
我电脑硬盘内存不足,解决方式:
1.我的电脑支持扩充硬盘 --> 再装一个固态,机械 --> 直接修改
2.我的电脑不支持插硬盘 --> 买个U盘,移动硬盘来用 --> 间接修改
说白了,函数就是个高级点的数据容器.可以把它理解为装了很多代码的变量
所以你可以拿他来赋值,把它放到列表,元组,集合,字典中.也可用它作为返回值和传参
一、名称空间与作用域
名称空间: 专门用来存储名字的一个地方
变量名,函数名
程序中有专门的内存区域,来存储专门的数据
1.名称空间 --> 栈(变量名,函数名)
2.内存数据 --> 堆(变量值,函数值)
有一个东西叫"名称空间"是专门用来存放名字,并且为了避免重名,它一共有三层
-
内建名称空间(存内置函数的地方)
这个名称空间会随着python程序的启动而生成,在程序关闭时,回收,清除里面的数据
它是在程序中,最先被加载出来的,用来存一些内置函数
print input type int float -
全局名称空间(存你在python外层定义的名字,不是内置以及函数内的名字)
这个名称空间会随着python文件的执行产生,执行后销毁,清除
它是在程序中第二个被加载出来的名空军,外层代码里写的名字都放在这
自己定义得变量,函数名(不是内置的,也不是在函数内定义得) -
局部名称空间(函数里面的变量名,函数名)
这个名称空间会随着函数的调用/结束调用而产生,销毁.函数的形参,函数内定义名字都放着
它也是最后一个被加载出来的名称空间,在调用函数时存活,调用完后销毁
存放的名称:
1.函数内定义的变量名,函数名
2.函数的形参三国版的名称空间:
曹操
内建名称空间 --> 曹操的亲戚兄弟,出来打天下的时候就带这的 --> 曹仁,夏侯惇,夏侯渊,曹洪
全局名称空间 --> 曹操在打天下过程中,收复的文臣武将 --> 郭嘉 许褚 李典 荀彧 张辽
局部名称空间 --> 曹老板打天下过程中,分封了很多太守(市长),太守自己招的小弟 --> 会听太守的话,但不一定听曹操的话.总结:
一个程序里的数据,是有专门的地方存储的.
存储名字的叫命名空间,也叫栈. 名字会因为类型不同,分开放在3个命名空间中
存储数据的地方叫堆, 变量值,函数内容
二、作用域的概念
-
全局作用域: 整个程序都可以使用
(内置名称空间,全局名称空间)
内置函数,在外层定义的变量,函数 -
局部作用域: 只有在局部位置才能使用(函数内)
局部名称空间
函数里面定义得变量和函数定义域: 定义域相当于开辟了一个地盘.来执行操作.里面的"数据",未经许可外人不能使用
作用域: 定义好的数据,能够使用,作用的范围 -
作用域实战:
global --> 全局,提域
语法:
def 函数名():
global 数据名
声明/操作数据
def fun():
global a
a = 123
fun()
print(a)
一个被提权了的变量,使用之前,还是需要先调用该函数,生成对应的名称空间.才能使用,否则报错
nonlocal --> 局部,降域. 目前用的不多
def fun1():
a = 2
def fun2():
nonlocal a # 把变量a深度私有化
a = 3
fun2()
print(a)
fun1()
全局 = 大方的人 --> 我的东西你们都可以用
局部 = 小气的人 --> 我的东西只有我能用
三、匿名函数 lambda函数
我有个项目,有很多功能,为了好管理控制,准备把每个功能都写成函数
每个功能都写成函数,想名字很麻烦,尤其是有很多函数里面没啥内容,所以就采取匿名函数手段
语法:
lambda 参数:执行代码
有的懒癌患者,不想写def声明.就直接匿名了
b = lambda x,y:x+y
print(b(70,36))
总结
函数对象的核心概念: 把函数当成一个普通的数据来使用,可以用它来赋值,传参,作为返回值.也可以把函数放到列表,集合,元组,字典
名称空间 = 放名字的地方,一共有三块
名称空间:
内建名称空间:存储python自带的一些内置函数
全局名称空间:用户写代码过程中,自己定义出来的名字
局部名称空间:存储函数内定义的名字(函数名,变量名),形参
作用域:
1.全局作用域: 大方,所有人都可以使用
整个程序内都可以使用
2.局部作用域: 小气,少部分人才能使用
只有在局部位置才能使用 --> 函数内
提权,提高作用域 --> global --> 全局
def fun():
global name
name = "热水"
fun()
print(name)
降权,降低作用域 --> nonlocal --> 局部