python函数嵌套变量_python------函数嵌套及作用域链

1.三元运算

if条件成立的结果 if 条件 else 条件不成立的结果

例如:

a=20

b=10

c=a if a>b else b

print(c)

2.命名空间

全局命名空间:创建的存储“变量名与值的关系”的空间叫做全局命名空间

局部命名空间:在函数的运行中开辟的临时的空间叫做局部命名空间

内置命名空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

1184802-20170726170143953-1926219639.png

三种命名空间之间的加载顺序和取值顺序:

加载顺序:内置(程序运行前加载)-->全局(从上到下顺序加载进来的)-->局部(调用的时候加载)--->内置

取值:在局部调用:局部命名空间--->全局命名空间--->内置命名空间

站在全局范围找:全局----内置----局部

使用:

全局不能使用局部的

局部的可以使用全局的

3.作用域:就是作用范围

1.命名空间和作用域是分不开的

2.作用域分为两种:

全局作用域:全局命名空间与内置命名空间的名字都属于全局范围

在整个文件的任意位置都能被引用,全局有效

局部作用域:局部命名空间,只能在局部范围内生效

3.站在全局看:

使用名字的时候:如果全局有,用全局的

如果全局没有,用内置的

4.为什么要有作用域?

为了函数内的变量不会影响到全局

5.globals方法:查看全局作用域的名字【print(globals())】

locals方法:查看局部作用域的名字【print(locals())】

ContractedBlock.gif

ExpandedBlockStart.gif

1 def func():2 a = 12

3 b = 20

4 print(locals())5 print(globals())6

7 func()

在局部调用locals()和globals()

站在全局看,globals is locals

global关键字:强制转换为全局变量

ContractedBlock.gif

ExpandedBlockStart.gif

1 # x=1

2 # def foo():3 # globalx #强制转换x为全局变量4 # x=10000000000

5 # print(x)6 # foo()7 # print(x)8 # 这个方法尽量能少用就少用

global

nonlocal让内部函数中的变量在上一层函数中生效,外部必须有

ContractedBlock.gif

ExpandedBlockStart.gif

1 # x=1

2 # def f1():3 # x=2

4 # def f2():5 # # x=3

6 # def f3():7 # # globalx#修改全局的8 # nonlocal x#修改局部的(当用nonlocal时,修改x=3为x=100000000,当x=3不存在时,修改x=2为100000000 )9 # # 必须在函数内部10 # x=10000000000

11 # f3()12 # print('f2内的打印',x)13 # f2()14 # print('f1内的打印', x)15 # f1()16 # # print(x)

nonlocal

4.函数的嵌套定义

ContractedBlock.gif

ExpandedBlockStart.gif

1 def animal():2 def tiger():3 print('nark')4 print('eat')5 tiger()6 animal()

函数的嵌套定义

5.作用域链

ContractedBlock.gif

ExpandedBlockStart.gif

1 x=1

2 def heihei():3   x='h'

4 def inner():5     x='il'

6 def inner2():7 print(x)8 inner2()9 inner()10 heihei()

函数的作用域链

6.函数名的本质:就是函数的内存地址

ContractedBlock.gif

ExpandedBlockStart.gif

1 def func():2   print('func')3 print(func)#指向了函数的内存地址

函数的本质

7.函数名可以用做函数的参数

1184802-20170726165948984-1380815663.png

ContractedBlock.gif

ExpandedBlockStart.gif

1 def func():2 print('func')3

4 def func2(f):5 f()6 print('func2')7 func2(func)

函数名可以用作参数

函数名可以作为函数的返回值

1184802-20170726165957890-1353248796.png

return说明1

def func():

def func2():

print('func2')returnfunc2

f2=func()

f2()

#func2=func()

#func2()

2.

def f1(x):

print(x)

return '123'

def f2():

ret = f1('s') #f2调用f1函数

print(ret)

f2()

3.

def func():

def func2():

return 'a'

return func2 #函数名作为返回值

func2=func()

print(func2())

8.闭包:

闭包:1.闭 :内部的函数

2.包 :包含了对外部函数作用域中变量的引用

def hei():

x=20

def inner():

x=10 #如果x定义了,他就用自己的了,就实现不了闭包

print(x)

ContractedBlock.gif

ExpandedBlockStart.gif

1 # 闭包的常用形式:2 def hei():3   x=20

4 def inner():5     '''闭包函数'''

6 print(x)7 return inner()

闭包函数的常见形式

判断闭包函数的方法:__closure__

ContractedBlock.gif

ExpandedBlockStart.gif

1 #输出的__closure__有cell元素 :是闭包函数2 def func():3 name = 'eva'

4 def inner():5 print(name)6 print(inner.__closure__)7 returninner8

9 f =func()10 f()11

12

13 #输出的__closure__为None :不是闭包函数14 name = 'egon'

15 def func2():16 def inner():17 print(name)18 print(inner.__closure__)19 returninner20

21 f2 =func2()22 f2()

View Code

闭包获取网络应用

ContractedBlock.gif

ExpandedBlockStart.gif

1 #from urllib.request import urlopen

2 #def index(url):

3 #def inner():

4 #return urlopen(url).read()

5 #return inner

6 #u='http://www.cnblogs.com/Eva-J/articles/7156261.html#_label1'

7 #get = index(u)

8 #print(get())

View Code

9.总结

作用域:小范围的可以用大范围的,但是大范围的不能用小范围的

范围从大到小(图)

1184802-20170726165851531-1883242501.png

如果在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的

如果在小范围内没有,就用上一级的,上一级没有的,就用上上级的,以此类推

如果都没有,报错

10.思维导图

1184802-20170726230744421-500400268.png

### 回答1: Python函数中的变量作用域指的是变量的可见范围。在函数中定义的变量可以分为两种:局部变量和全局变量。 局部变量指的是在函数内部定义的变量,只能在函数内部使用,函数外部无法访问。当函数执行完毕后,局部变量的值会被销毁。 全局变量指的是在函数外部定义的变量,可以在函数内部和外部使用。但是,在函数内部如果要修改全局变量的值,需要使用global关键字进行声明。 在Python中,变量的作用域遵循LEGB规则,即:Local(局部变量)-> Enclosing(闭包函数外的函数中的变量)-> Global(全局变量)-> Built-in(内置变量)。 当函数内部使用变量时,Python会按照LEGB规则从内到外查找变量,直到找到为止。如果在函数内部没有找到变量,则会继续向外查找,直到找到为止。如果最终还是没有找到变量,则会抛出NameError异常。 因此,在编写Python函数时,需要注意变量的作用域,避免出现变量名冲突等问题。 ### 回答2: Python函数中,变量的作用域并不像其他编程语言那样严格。在Python中,变量的作用域很容易受到内层作用域的影响,而无法访问外层的变量,这部分属于局部变量。下面我们从全局变量和局部变量两个方面来讲解变量的作用域。 一、全局变量的作用域 在Python中,如果变量未定义在任何函数内,即在全局作用域内,那么在各个函数内都可以访问该变量。 例如: ``` count = 0 def test(): global count count += 1 print(count) test() ``` 以上代码中,count变量未定义在函数内部,属于全局作用域,在调用函数`test()`时,可以使用`global`关键字来声明该变量为全局变量,然后在函数内部可以直接对该变量进行修改和访问。 二、局部变量的作用域 在Python中,如果变量定义在函数内部,则该变量的作用域只限于函数内部,外部无法访问该变量,称为局部变量。 例如: ``` def test(): count = 0 count += 1 print(count) test() ``` 以上代码中,count变量定义在函数`test()`内部,属于局部变量。在函数内部对count进行修改和访问也是可以的,但是在函数外部是无法访问到该变量的,否则会报错。 需要注意的是,函数内的变量名如果和全局变量变量名相同,那么在函数内访问该变量时,默认会访问局部变量,而非全局变量。如果仍要在函数内部访问全局变量,可以使用`global`关键字进行声明。 例如: ``` count = 0 def test(): count = 1 print("count in local:", count) test() print("count in global:", count) ``` 以上代码中,函数内部定义了一个名为count的局部变量,调用函数后,输出的是局部变量count的值,而不是全局变量count的值0。如果要访问全局变量count的值,可以在函数内部使用`global count`声明该变量为全局变量,再进行访问。 总之,Python变量作用域相对比较宽松,可以根据具体情况进行灵活使用,但是在使用局部变量和全局变量时要避免命名冲突,同时合理使用`global`关键字来声明全局变量,以免出现意想不到的错误。 ### 回答3: 在Python中,变量的作用域指的是变量所能被访问到的范围。在一个函数中定义的变量只能在函数内部被访问到,而在函数外定义的变量则可以在整个程序中被访问到。 Python中的变量作用域分为两种:局部作用域和全局作用域。局部变量指的是在一个函数内部定义的变量,只能在该函数内部访问。全局变量指的是在函数外部定义的变量,可以在整个程序中被访问到。如果在函数内部要访问全局变量,则需要使用global关键字进行声明。 在Python中,变量的作用域可以遵循 LEGB 原则,即 Local(局部)、Enclosing(闭包)、Global(全局)、Built-in(内置)的顺序进行查找。这意味着变量首先在函数内部被查找,然后在函数外部被查找,之后在内置变量中被查找。 当在函数内部定义与全局变量同名的变量时,Python会优先使用局部变量而不是全局变量。如果需要在函数内部修改全局变量,则必须使用global关键字声明。 在使用闭包时,可以通过在函数内部再定义一个函数,内部函数可以访问外部函数中的变量。这样的变量作用域称为嵌套作用域。在Python中,使用nonlocal关键字可以实现在内部函数中修改外部函数中定义的变量。 总之,学习变量的作用域对于编写规范化的程序来说非常重要,特别是在编写复杂的函数时。了解变量作用域可以帮助我们更好地管理变量,并避免不必要的错误和问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值