python基础(十一)—函数(三)

函数名

1.函数名的内存地址 (直接打印函数名)

def func():
    pass
print(func)

2.函数名可以赋值给其他变量

def func():
    pass
f = func
print(f)

3.函数名可以当作容器类元素

def a():
    print(1)
def b():
    print(2)
def c():
    print(3)
def d():
    print(4)
def e():
    print(5)
li = [a,b,c,d,e]
for i in li:
    i()

4.函数名可以当作函数的参数

def a(x):
    x()
    return b()
def b():
    print(666)
print(a(b))

5.函数名可以当作函数返回值

def a(x):
    x()
    return b()
def b():
    print(666)
print(a(b))

函数名就是第一类对象

闭包

闭包就是内层函数,对外层函数(非全局函数)的变量引用叫做闭包

def a():
    a = 2
    def b():
        c = a + 1
        print(c)
    b()
a()

_closure_

def a():
    x = 2
    def b():
        c = x + 1
        print(c)
  print(b._closure_) #检测函数是不是闭包,有cell就是闭包 b() a()

x = 2
def a(): def b(): c = x + 1 print(c)
  print(b._closure_) #检测函数是不是闭包,有None就不是闭包 b() a()

在外层函数的内部执行inner

def a():
    def b():
        print(666)
    return b  #函数返回值返回给函数调用者a()
a()()

如果说你的内存函数是个闭包,python中有一个几只,遇到闭包他会在内存中开启一个内存空间,不会随着函数的结束而关闭

闭包函数应用(爬虫)

from urllib.request import urlopen
# print(urlopen('https://123.sogou.com/').read())
def index(url):
    c = urlopen(url).read()
    def a():
        with open('爬虫','a') as f1:
            f1.write(c.decode('utf-8'))
    a()
index('https://i.cnblogs.com/EditArticles.aspx?postid=8406818&update=1')

闭包的嵌套

def f():
    c = 1
    def f1():
        b = 2
        def f3():
            print(c + b)
        return f3
    return f1
f()()()

装饰器

简单的装饰器

import time
def f():
    a = 1
def times(x):
    def inner():
        start = time.time()
        time.sleep(0.1)
        x()
        end = time.time()
        print('执行效率时间%s'%(end-start))
    return inner
f = times(f)
f()

语法糖@

posted @ 2018-02-02 20:24  小黑啊小黑  阅读(142)  评论(0编辑  收藏  举报