Python-函数进阶

今日的内容:

命名空间

命名空间一共分为三种:

    全局命名空间

    局部命名空间

    内置命名空间:中存放了python解释器为我们提供的名字:input,print,str,list、、、

 

           它们都是我们熟悉的,拿过来就可以用的方法
启动python:
内置的命名空间->加载全局命名空间中的名字 —— (从上到下顺序加载)->加载局部命名空间中的名字 ——— 调用该函数的时候,从上到下去加载(程序运行中:调用时才加载)
取值:
  在局部调用:布局命名空间 -> 全局命名空间 -> 内置命名空间
a = 0
b = 1
print(a)
def my_max():
      c = 5
      def asy():
            d= 2
            print(a)
my_max()

命名空间 名称空间

内置命名空间

全局命名空间

局部命名空间

对于变量的使用:在局部可以使用全局命名空间中的名字,但是全局不可以使用局部命名空间的名字

对于局部来说:自己有的时候就用自己的,自己没有再用全局的

三种:内置、全局、局部

全局:除了函数内部的名字之外,我们自己写的代码里所有的名字

局部:函数内部的

 

作用域:

内置的命名空间 在任意地方可以用

全局的命名空间 在我们写的代码里任意地方

局部的命名空间 只能在自己的函数内使用

globals(): 修改全局命名空间的变量值

 

a = 0
def demo1():
      global a
      a= 2
      print(a)
demo1()
print(a)

 

范围从大到小:内置 全局 局部

作用域:站在范围小的布局,如果局部有用局部,局部没有往上一层找,一层一层往上找,找到一个可用的名字就用这个

 

a = 0
def demo1():
      a = 1
      def demo2():
            def demo3():
                  global a
                  a = "小神仙"
                  print("demo3:", a)
            demo3()
            print("demo2:", a)
      demo2()
      print(a)
demo1()
print(a)
# 函数的嵌套调用
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
print(max4(23,-6,32,12))
# 函数的嵌套定义(一)
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():
            print(a)
      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()

nonlocal关键字

1.外部必须有这个变量

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

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

4.只修改局部命名空间里的 从内往外部找到第一个对应的变量名

# nonlocal关键字
def f1():
      a = 1
      def f2():
            nonlocal a
            a = 2
      f2()
      print("a in f1 :", a)
f1()

函数名的本质:

函数的名字 —— 可以当作变量使用 —— 函数名是第一类对象的概念

第一类对象(first-class-object)指:

1.可在运行期创建

2.可用作函数参数或返回值

3.可存入变量的实体

# 1.可以被引用
def func():
      print("in func")
f= func
print(f)
# 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']()

闭包函数:

内部函数引用了外部函数的变量,内部的函数就叫做闭包

装饰器是闭包的一种应用

闭包的作用:

 

def func():
      name = "eva"
      def inner():
            print(name)
      return inner
f = func()
f()

 

# 判断闭包函数的方法_closure_
#输出的_closure_有clee元素:是闭包函数
def func():
      name = "eva"
      def inner():
            print(name)
      print(inner.__closure__)
      return inner
f = func()
f()
#输出的_closure_为None:不是闭包函数
name = "egon"
def fun2():
      def inner():
            print(name)
      print(inner.__closure__)
      return inner
f2 = fun2()
f2()
#闭包嵌套
def wrapper():
      money = 1000
      def func():
            name = "eva"
            def inner():
                  print(name,money)
            return inner
      return func
f = wrapper()
i = f()
i()
#闭包函数获取网络应用
from urllib.request import urlopen
def index():
      url = "http://www.cnblogs.com/Eva-J/articles/7156261.html#_label2"
      def get():
            return urlopen(url).read()
      return get
art = index()
content = art
print(content

 

 
posted @ 2017-08-30 17:22  程先生_Python  阅读(100)  评论(0)    收藏  举报