python的内置作用域_python开发函数进阶:命名空间,作用域,函数的本质,闭包,内置方法(globales)...

一,命名空间

#局部命名空间

#全局命名空间

#内置命名空间

#三者的顺序

#加载顺序 硬盘上——内存里

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

1 #!/usr/bin/env python

2 #_*_coding:utf-8_*_

3

4 #全局命名空间

5 a = 5

6 b = 8

7 #局部命名空间(函数)

8 defmy_max():9 c = a if a > b elseb10 returnc11 m =my_max()12 print(m)

二,作用域

#命名空间+作用域是分不开的

#两种

#全局作用域:全局命名空间、内置命名空间

#局部作用域:局部命名空间

#站在全局看:

#使用名字:

#如果全局有:用全局的

#如果全局没有:用内置的

#为什么要有作用域的概念:

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

1 #!/usr/bin/env python

2 #_*_coding:utf-8_*_

3

4 defmax(a,b):5 a = 10 #局部

6 b = 20

7 a = 2 #全局

8 b = 3 #9 max(30,50)10 print(a,b)

总结:

#小范围的可以用大范围的

#但是大范围的不能用小范围的

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

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

#如果都没有,报错

三,作用域链,小范围的可以用大范围的

1 #!/usr/bin/env python

2 #_*_coding:utf-8_*_

3

4 x = 1

5 defheihei():6 definner1():7 definner2():8 print(x)9 inner2()10 inner1()11 heihei()

四,函数的嵌套

#为了保护内部函数,确定内部函数只能在外部函数中被调用

1 #!/usr/bin/env python

2 #_*_coding:utf-8_*_

3

4 #函数嵌套

5 defanimal():6 deftiger():7 print(‘bark‘)8 print(‘eat‘)9 tiger()10 animal()11

12 #函数嵌套使用

13 deff1():14 print(a) #无法获取f2的a的值,注意执行顺序

15 print(‘f1‘)16 deff2():17 a = 10

18 f1()19 f2()

五,函数名的本质就是内存地址

1 #!/usr/bin/env python

2 #_*_coding:utf-8_*_

3

4 deffunc():5 print(‘func‘)6 print(func) #函数func内存地址

7 f = func #就是函数的内存地址

8 print(f) #函数func内存地址

9 f() #执行代码

10 #############

11 l = [f] #还是函数内存地址

12 print(l)13 l[0] == f #用索引取值

14 l[0]()15

16 #可以用作函数的参数

17 deffunc():18 print(‘func‘)19 deffunc2(f):20 print(f) #func的内存地址

21 f() #执行func函数

22 print(‘func2‘)23 func2(func)24

25 #可以作为函数的返回值

26 deffunc():27 print(‘func‘)28 def func2(f): #1 接收func函数的内存地址

29 print(‘func2‘)30 return f #2 返回给fu函数func函数的内存地址

31 fu =func2(func)32 fu() #3 执行函数func

33

34 #如果我想在全局使用内部的函数

六,闭包

#1.闭 :内部的函数

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

1 #!/usr/bin/env python

2 #_*_coding:utf-8_*_

3

4 #闭包函数:内部函数,包含了对外部作用域中变量的引用

5 defhei():6 x = 20

7 definner():8 ‘‘‘

9 闭包函数10 ‘‘‘

11 print(x)12

13 #闭包的常用形式

14 defhei():15 x = 20

16 definner():17 print(x) #局部的

18 returninner19 i =hei()20 i() #全局

21

22

23 #闭包的例子,爬网页,函数执行完就会消失,但是在调用的时候又会打开,闭包解决了这个问题

24 from urllib.request importurlopen25 #def index():

26 #url = "http://www.cnblogs.com/Eva-J/articles/7125925.html"

27 #return urlopen(url).read()

28 #index()

29

30 defindex():31 url = "http://www.cnblogs.com/Eva-J/articles/7125925.html"

32 definner():33 returnurlopen(url).read()34 print(inner.__closure__)35 returninner36 #u = "http://www.cnblogs.com/Eva-J/articles/7125925.html"

37 get =index()38 print(get())

7,内置方法

#locals,globals方法,只有globals方法,作用是局部可以更改全局的变量

1 #!/usr/bin/env python

2 #_*_coding:utf-8_*_

3

4 a = 20

5 b = 50

6 defhaha():7 x = 1

8 y = 2

9 print(globals()) #全局作用域中的名字

10 print(locals()) #局部作用域中的名字

11 haha()12 print(globals()) #全局作用域中的名字

13 print(locals()) #全局的局部还是全局

nonlocal

# 1.外部必须有这个变量

# 2.在内部函数声明nonlocal变量之前不能再出现同名变量

# 3.内部修改这个变量如果想在外部有这个变量的第一层函数中生效

1 #!/usr/bin/env python

2 #_*_coding:utf-8_*_

3

4 deff():5 a = 3

6 deff1():7 a = 1

8 deff2():9 nonlocal a #可以将上一层的变量更改赋值

10 a = 2

11 f2()12 print(‘a in f1 :‘, a) #此时a是内部函数的a

13 f1()14 print(‘a in f :‘,a) #此时a是局部函数的a

15 f()16 #a in f1 : 2

17 #a in f : 3

原文:http://www.cnblogs.com/jokerbj/p/7242550.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值