Tim Peters的《蟒蛇之禅》
美丽胜过丑陋。
外显优于内隐。
简单胜过复杂。
复杂比复杂好。
平坦优于嵌套。
稀疏比稠密好。
可读性计数。
特殊情况不足以打破规则。
虽然实用性胜过纯度。
错误永远不会悄然逝去。
除非明确沉默。
面对歧义,拒绝猜测的诱惑。
应该有一个-最好是只有一个——显而易见的方法。
虽然这种方式起初并不明显,除非你是荷兰人。
现在总比没有好。
虽然从来没有比现在好。
如果实施很难解释,那是个坏主意。
如果实现很容易解释,这可能是个好主意。
命名空间是一个宏大的想法——让我们多做一点吧!
命名空间分为:
全局命名空间
局部命名空间
内置命名空间
内置命名空间中存放了python解释器为我们提供的名字:
input print str list tuple .............都是拿过来就能用的方法。
三种命名空间的加载与取值的顺序:
加载顺序:内置命名空间(程序运行前加载)——> 全局命名空间(程序运行中:从上到下加载)——> 局部命名空间(程序运行中:调用时才加载)
取值顺序:在局部调用:局部命名空间——> 全局命名空间——> 内置命名空间
在全局调用:全局命名空间——> 内置命名空间
(在寻找变量时,从小范围一层一层到大范围寻找)
作用域:
作用域就是作用范围,按照生效范围可分为全局作用域和局部作用域。
全局作用域:包含内置命名空间、全局命名空间,在整个文件的任意位置都能被引用、全局有效。
局部作用域:局部名称空间,只能在局部范围内生效。
globals 和 locals 方法:
print(globals()) print(locals())
def func(): a = 12 b = 20 print(locals()) print(globals())
global 关键字, nonlocal 关键字
global:
1,声明一个全变量。
2,在局域作用想要对全局作用域的全局变量进行修改时,需要用到 global。(限于字符串,数字)
def func(): global a a = 3 func() print(a) count = 1 def seach(): global count coubt = 2 search() print(count)
~对可变数据类型(list,dict,set)可以直接引用不用通过global。
nonlocal:
1,不能修改全局变量。
2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,
从那层及以下此变量全部发生改变。
def add_b(): b = 42 def do_global(): b = 10 print(b) def dd_nonlocal(): nonlocal b b = b + 20 print(b) dd_nonlocal() print(b) do_global() print(b) add_b()
函数的嵌套和作用域链:
函数的嵌套调用
def max2(x, y) m = x if x>y else y return m def max4(a, b, c, d): res1 = max2(a, b) res2 = max2(res1, c) res3 = max2(res2, d) return res3 max4(23, -7, 31, 11)
函数的嵌套定义:
def f1(): print("in f1") def f2(): print("in f2") f2() f1() ########### def f1(): def f2(): def f3(): print("in f3") print("in f2") f3() print("in f1") f2() f1()
函数的作用域链:
def f1(): a = 1 def f2(): def f3(): print(a) f3() f2() f1() ################ def f1(): a = 1 def f2(): a = 2 f2() print('a in f1 : ',a) f1()
函数的本质:
函数的本质就是函数的内存地
1, 可以被引用
2, 可以被当作容器类行的元素
def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') l = [f1,f2,f3] d = {'f1':f1,'f2':f2,'f3':f3} #调用 l[0]() d['f2']()
3, 可以当作函数的参数和返回值
def f1(): print('f1') def func1(argv): argv() return argv f = func1(f1) f()