三元运算:
if条件成立的结果 if 条件 else else 条件成立的结果
a=2
b=3
c= 6 if a<b esle 7
print(c)
命名空间:
全局命名空间
局部命名空间
内置命名空间
def n_max(a,b):
c=a if a>b else b
return c
n=n_max(6,5)
加载顺序: (从硬盘到内存里)
内置命名空间----->全局命名空间(从上到下顺序加载进来的)------->局部命名空间(调用的时候加载)
!!!作用域:命名空间和作用域是分不开的,作用域分两种
1:全局作用域: 全局命名空间和内置命名空间
2:局部作用域: 局部命名空间
站在全局看:
如果全局有,用全局的。 如果全局没有,用内置的。
为什么要有作用域的概念?
是为了函数内的变量不会影响到全局
#def max():
a=10
b=20
a=3
b=2
#函数的嵌套调用 # def f1(): # print('f1') # # def f2(): # a = 10 # f1() #函数的嵌套 #为了保护内部函数,确定内部函数只能在外部函数中被调用 def animal(): def tiger(): print('bark') print('eat') tiger() # animal() #函数名的本质 def func(): print('func') print(func) # print(func) # f = func # print(f) # f() # # l = [f] # print(l) # #l[0] == f # l[0]() #可以用作函数的参数 def func(): print('func') def func2(f): print(f) f() print('func2') # func2(func) #可以作为函数的返回值 def func(): print('func') def func2(f): print('func2') return f fu = func2(func) # print(fu) # fu() #==>func() # print(fu) # print(func) #如果我想在全局使用内部的函数
def func(): print('func') print(func) f = func l = [f] f1 = l[0] #== f print(f1) print(f) print(func) func() f() f1() #函数名做参数 # def func(): # print('func') # def func2(f): # f() # func2(func) #函数的名字可以做返回值 def func(): def func2(): print('hello') return func2 # f2 = func() # f2() # f = func def heiheihei(): ha = 10 heng = 20 def inner(): print(ha) print(heng) inner() # heiheihei() #作用域: #小范围的可以用大范围的 #但是大范围的不能用小范围的 #范围从大到小(图) #在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的 #如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。 #如果都没有,报错 #作用域链 x = 1 def heihei(): # x = 'h' def inner1(): # x = 'i1' def inner2(): print(x) inner2() inner1() # heihei() #闭包函数:内部函数,包含了对外部作用域中变量的引用 def hei(): x = 20 def inner(): ''' 闭包函数 ''' print(x) #闭包 #1.闭 内部的函数 #2.包 包含了对外部函数作用域中变量的引用 #闭包的常用形式 def hei(): x = 20 def inner(): print(x) #局部的 return inner # i = hei() # i() #全局 from urllib.request import urlopen # def index(): # url = "http://www.cnblogs.com/Eva-J/articles/7125925.html" # return urlopen(url).read() # index() def index(): url = "http://www.cnblogs.com/Eva-J/articles/7125925.html" def inner(): return urlopen(url).read() print(inner.__closure__) return inner # u = "http://www.baidu.com" get = index() print(get())
补充!
3、作用域链
对函数做下调整,看看下面的代码执行结果如何?
1 2 3 4 5 6 7 8 9 10 | #作用域链 name = "lzl" def f1 ( ) : name = "Eric" def f2 ( ) : name = "Snor" print ( name ) f2 ( ) f1 ( ) |
学过函数,肯定知道最后f1()执行完会输出Snor;我们先记住一个概念,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错
4、终极版作用域
好,铺垫了够了,终极版的来了~~
1 2 3 4 5 6 7 8 9 10 11 12 | #终极版作用域 name = "lzl" def f1 ( ) : print ( name ) def f2 ( ) : name = "eric" f1 ( ) f2 ( ) |
想想最后f2()执行结果是打印“lzl”呢,还是打印“eric”?记住自己的答案,现在先不把答案贴出来,先看看下面这段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #终极版作用域 name = "lzl" def f1 ( ) : print ( name ) def f2 ( ) : name = "eric" return f1 ret = f2 ( ) ret ( ) #输出:lzl |
执行结果为“lzl”,分析下上面的代码,f2()执行结果为函数f1的内存地址,即ret=f1;执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系,name=“lzl”与f1()在一个作用域链,函数内部没有变量是会向外找,所以此时变量name值为“lzl”;理解了这个,那么刚才没给出答案的那个终极代码你也知道答案了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #终极版作用域 name = "lzl" def f1 ( ) : print ( name ) def f2 ( ) : name = "eric" f1 ( ) f2 ( ) # 输出:lzl |
是的,输出的是“lzl”,记住在函数未执行之前,作用域已经形成了,作用域链也生成了
def func(): print('func') print(func) f = func l = [f] f1 = l[0] #== f print(f1) print(f) print(func) func() f() f1() #函数名做参数 # def func(): # print('func') # def func2(f): # f() # func2(func) #函数的名字可以做返回值 def func(): def func2(): print('hello') return func2 # f2 = func() # f2() # f = func def heiheihei(): ha = 10 heng = 20 def inner(): print(ha) print(heng) inner() # heiheihei() #作用域: #小范围的可以用大范围的 #但是大范围的不能用小范围的 #范围从大到小(图) #在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的 #如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。 #如果都没有,报错 #作用域链 x = 1 def heihei(): # x = 'h' def inner1(): # x = 'i1' def inner2(): print(x) inner2() inner1() # heihei() #闭包函数:内部函数,包含了对外部作用域中变量的引用 def hei(): x = 20 def inner(): ''' 闭包函数 ''' print(x) #闭包 #1.闭 内部的函数 #2.包 包含了对外部函数作用域中变量的引用 #闭包的常用形式 def hei(): x = 20 def inner(): print(x) #局部的 return inner # i = hei() # i() #全局 from urllib.request import urlopen # def index(): # url = "http://www.cnblogs.com/Eva-J/articles/7125925.html" # return urlopen(url).read() # index() def index(): url = "http://www.cnblogs.com/Eva-J/articles/7125925.html" def inner(): return urlopen(url).read() print(inner.__closure__) return inner # u = "http://www.cnblogs.com/Eva-J/articles/7125925.html" get = index() print(get())