python函数本质与闭包

默认参数特殊情况

def func_1(li = []) :
    li.append(1)
    print(li)

func_1()
func_1()
func_1()
func_1()

$[1]
$[1, 1]
$[1, 1, 1]
$[1, 1, 1, 1]

三元运算符

def func_1(a,b):
   return a if a> b else b

命名空间  

"存放名字与值的关系”的空间起了一个名字——叫做命名空间

全局命名空间创建的存储“变量名与值的关系”的空间

局部命名空间在函数的运行中开辟的临时的空间

内置命名空间:中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。

 全局和内置同名-使用全局

def input():
   print('put put put in input now')
def func():
   input()
func()

#重写了input方法,现在input走自定义方法,变量也如些

作用域:

a = 1 
def func() :
    a += 1
对于不可变数据类型 在局部可查看全局,但不能修改
如想修改需要添加global

a = 1 
def func() :
    global a 
    a += 1
以上方法不安全,建议少用
解决方法是传参或用返回值接收

关键字:locals()  globals()  

函数的本质

函数的本质:就是一串内存地址

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

  1.可以被引用

  2.可以被当作容器类型的元素

  3.可以当作函数的参数和返回值

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

  1.可在运行期创建

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

  3.可存入变量的实体。  

函数的嵌套与作用域

#比较三个数大小
def func_max(a,b) :
    return a if a>b else b 
def func_max1(a,b,c) :
    z = max(a,b)
    return max(z,c)

函数的嵌套:

def outer() :
      def inner() :
            print('inner')
      return inner
outer()

  

初始闭包:

def outer():
       a = 1 
       def inner():
              print(a)
      print(inner.__closure__)
outer()

 

inner.__closure__调用后出现cell为闭包 嵌套函数,内部函数调用外部函数的变量

如果把inner当做内存地址,传到外部,则a值不会消失 inn全局变量,内部函数用到a,因为inn不消失,一直在调用a, 所以a一直存在

print(inner.__closure__)这句话放的位置可能会出问题,像下面这样写打印出来确是闭包,

但这是错误的 

 

def outer():
       def inner(a):
              print(a)
              print(inner.__closure__)
outer()

简单应用闭包:提取目标网页源代码

import urllib   #模块,简单理解为urllib.py文件
from urllib.request import urlopen  #可以打开网页
urlopen('www.....').read()
print(ret)
def get_url():
          url = 'wwww'
           def inner():     
                urlopen(url).read()  
                print(ret)
            return inner

get_func = get_url()
get_func()

  

  

posted @ 2017-12-27 20:28  wsg-python  阅读(250)  评论(0编辑  收藏  举报