day13

1.函数嵌套
定义:一个函数内定义了另一个函数
函数嵌套调用:在调用一个函数的过程中又调用了其他函数
def func(radius,num):
import math
def perimeter(radius):
return 2math.piradius
def area(radius):
return math.pi*(radius**2)
if num == 1:
return perimeter(radius)
if num == 2:
return area(radius)
res = func(18,2)
print(res)

2.名称空间与作用域
1.1内置名称空间:python解释器自带的名字,如print,input,str等
生命周期:解释器启动则创建,解释器关闭则销毁
1.2全局名称空间:除内置和局部名称空间之外的都是全局名称空间
生命周期:运行顶级代码/主流水线则创建,顶级代码/主流水线结束则销毁
1.3局部名称空间:函数内的变量名
生命周期:函数调用时创建,调用完毕后销毁
2.名称空间名字的查找顺序:基于当前所在的位置向上寻找
局部=>外层套的局部=>再外层套的局部…=>全局=>内置
示例1:在全局查找
a = 111
def func():
a = 222
func()
print(a)
分析:打印a,全局变量,只能从全局或者内置找,函数内的a 在调用完后自动销毁,无法改变全局变量的值
示例2:在局部变量查找
a = 111
def func():
a = 222
print(a)
a = 333
func()
分析:定义一个函数func(),调用时打印a,此时a为局部变量,从本层向上查找,a = 222,故打印222,若无a=222这行,则局部无变量a,查找全局,a = 111和a =333都是全局变量,a =333,故打印a = 333,再深入,在func()下面再写a=444,对结果无影响
示例3:
def f1():
input = 444
print(input)
def f2():
input = 555
print(input)
input = 333
f1()
f2()
分析:局部哪个没有,就取全局的值
示例4:
def f1():
input = 444
def inner():
input = 555
print(input)
inner()
input = 333
f1()
示例5:
def func():
print(x)
x= 111
x= 222
func()
分析:x 为局部变量,打印值时先从局部空间寻找,在本空间,print打印操作下方才有给x的赋值,不符合先赋值再使用的原则,会报错


注意点:名称空间的"嵌套关系"是函数定义阶段、也就是检测语法的时候就确定的,与调用为无关
x=111
def f():
print(x)
def r():
x=222
f()
r()
分析:先调用r函数,r函数中又调用f函数,这里的f()可以理解为调用f()而得到的结果,而不是把f函数的定义内容嵌套进来

3.作用域
全局作用域:内置名称空间,全局名称空间
全局存活,全局有效
局部作用域:局部名称空间
局部存活,局部有效
4.函数的参数传递都是值拷贝
示例1:对全局定义的不可变类型,不可以在函数内直接修改
x = 1 #定义x 为1的内存地址
def func(a):#a =1的内存地址
a = 123#定义a为123的内存地址
print(a,x)#打印a,x 的值
func(x)#x=1的内存地址为实参,调用函数
print(x)

示例2:对全局定义的可变类型,可以在函数内直接修改
lst = []
def func(a):
a.append(1234)
func(lst)
print(lst)
示例3:在函数内修改全局的不可变类型
a = 1
def func():
global a
a = 222
func()
print(a)
示例4:内函数中修改外函数的不可变类型
def outer():
a = 1
def inner():
nonlocal a
a += 1
inner()
print(a)
outer()
总结:
全局变量是不可变类型时,想要在函数内修改,需用global
外函数变量是不可变类型时,想要在内函数修改,需用nonlocal
全局变量为可变类型时,内函数可以直接修改全局变量

3.闭包函数
特点:内函数使用了外函数的局部变量
外函数将内函数返回出来的过程
内函数就叫闭包函数
def outer():
x=2
def inner():
print(x)
return inner
res =outer()
res()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值