Python 全栈开发:python函数进阶

python函数进阶

函数嵌套

函数对象

命名空间与作用域

闭包函数

装饰器

一、函数嵌套

函数的嵌套定义

def func1():
    print('from func1')
    def func2(): #func2=内存地址
        print('from func2')
    print(func2) 
func1()

函数的嵌套调用

# 比较两个数的大小
def max2(x,y):
    if x > y:
        return x
    else:
        return y
# 比较三个数的大小
def max3(x,y,z):
    res1=max2(x,y)
    res2=max2(res1,z)
    return res2

print(max3(11,199,2))

# 结果
# 199

二、函数对象

函数在python中是第一类对象

1.可以被引用

x=1
y=x
def bar():
    print('from bar')
f=bar   # 作为对象赋值时 bar代表的值是 内存地址
f()

2.可以当中参数传入(函数名的本质,函数的内存地址)

f=func

3.可以当中函数的返回值

def bar(x):
    print(x)
    x()

bar(func)

4.可以当中容器类型的元素

def bar(x): # x=func
    return x #return func

res=bar(func) #res=func
# print(res)
res()    

三、命名空间与作用域

命名空间:存放名字与绑定关系的空间

命名空间分为三类

内置命名空间:存放Python解释器自带的名字,在解释器启动时就生效,解释器关闭则失效

全局命名空间:文件级别的名字,在执行文件的时候生效,在文件结束或者在文件执行期间被删除则失效

局部命名空间:存放函数内定义的名字(函数的参数以及函数内的名字都存放与局部名称空间), #在函数调用时临时生效,函数结束则失效

 

三种命名空间之间的加载顺序和取值顺序:
加载顺序:内置(解释器启动时加载,程序运行前加载)-->全局(从上到下顺序加载进来的)-->局部(调用的时候加载)--->内置

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

在全局范围找:

全局----内置----局部使用:   

全局不能使用局部的    

局部的可以使用全局的

 

作用域:就是作用范围

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

2、作用域分为两种

  全局作用域:全局命名空间与内置命名空间的名字都属于全局范围,在整个文件的任意位置都能被引用,全局有效

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

3、站在全局看

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

  如果全局没有,用内置的

4、为什么要有作用域

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

5、

pass

 

四、闭包函数

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

def hei():
  x=20
  def inner():
    x=10 #如果x定义了,他就用自己的了,就实现不了闭包
print(x) 
# 闭包的常用形式: 
def hei(): 
  x=20 
  def inner(): 
    '''闭包函数''' 
    print(x) 
return inner()

闭包函数的常见形式

判断闭包函数的方法:__closure__

#输出的__closure__有cell元素 :是闭包函数
def func():
    name = 'eva'
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f = func()
f()


#输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f2 = func2()
f2()
View Code

闭包获取网络应用

# from urllib.request import urlopen
# def index(url):
#     def inner():
#         return  urlopen(url).read()
#     return inner
# u='http://www.cnblogs.com/Eva-J/articles/7156261.html#_label1'
# get = index(u)
# print(get())
View Code

五、装饰器

pass

 

posted @ 2018-03-28 18:26  Fixdq  阅读(207)  评论(0编辑  收藏  举报