函数基础操作2
注:函数必须先定义后调用
函数的语法结构
def 函数名(参数1, 参数2):
'''函数注释'''
函数代码体
return 返回值
一.名称空间
1.名称空间的定义:存放变量名与变量值绑定关系的地方
2.名称空间分为三大类
2.1内置名称空间:
python解释器定义好的
2.2全局名称空间:
在py文件中编写的代码运行产生的名字都会存到全局名称空间内
neme = 'thn' # name 变量名存入
dae fun(): # 未被调用的函数名fun 存入
pass
for i in range(5) #for循环里 i 变量名 存入
2.3局部名称空间
函数体代码运行时产生的都是局部名称空间
def fun():
name = 'thn' # neme 存入
"""
注:都是存活周期的
1.内置名称空间
python解释器运行 产生
python解释器关闭 销毁
2.全局名称空间
py文件开始运行 产生
py文件运行结束 销毁
3.局部名称空间
函数体代码开始运行 产生
函数体代码运行结束 销毁
"""
二.名字的查找顺序
怎样查找名字呢?
1.在查找名字的时候要认知自己在哪个空间(内置 全局 局部)
1.1在局部也就是底层
'局部名称空间 >>> 全局名称空间 >>> 内置名称空间'
1.2在全局
全局名称空间 >>> 内置名称空间
实验让三个名称空间中都有同一个名称
len = 全局
def fun():
print(' ')
fun()
print(len) = 局部
# 调用函数局部空间
三.作用域
作用域就是名称空间可以作用的范围
1.置名称空间
程序任意阶段任意位置均可使用(全局有效)
2.全局名称空间
程序任意阶段任意位置均可使用(全局有效)
3.局部名称空间
一般情况下只在各自局部名称空间中有效(局部有效)
'也可以通过其他方法打破这个规则'
四.global与nonlocal关键字
1.glonal关键字:局部修改全局不可改变类型
x = 111
def index():
x = 222 # 并不是在修改全局的x 而是在局部名称空间中创建了一个新的x
如果需要修改
global x
x = 666
index()
print(x) # 结果是666 如果修改的话是需要用到关键字global
1.1如果局部名称空间嵌套的情况下 内层如果想要修改外层
数据是不可变类型
需要使用关键字nonlocal
数据是可变类型(局部名称嵌套 内层修改)
不需要使用关键字nonlocal
def index():
x = 111 # 在index的局部产生一个x=111
l1 = [11, 22, 33]
def f1():
l1.append(44)
index()
结果是: l1 = [11, 22, 33,44]
五.函数名的多种用法
1.函数名可以当做变量名进行赋值
def index():
print('from function index')
index()
结果:'from function index'
2.也可以指向函数体代码
res = index
print(res)
res()
结果:from function index
3.函数名还可以当成函数的实参
def index():
print('from index')
def func(a):
print('from func')
print(a)
a()
func(index)
结果:
from func
<function index at 0x00000000025CC400>
from index
4.还可以当函数的返回值
def func():
print('from func')
return func
func()
结果:from func
5.可以作为容器类型(列表:元组:字典等)的元素
def index():
print('from index')
l1 = [11, 22, 33, 44, index]
print(l1)
结果:
[11, 22, 33, 44, <function index at 0x00000000025CC400>]
六.函数的镶嵌
x = 111
def f1():
x = 222
def f2():
x = 333
def f3()
x = 444
print(x)
f3()
f2()
f1()
结果是:444 由上往下调用 由下往上查