博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之路——函数(进阶)
阅读量:4580 次
发布时间:2019-06-09

本文共 2969 字,大约阅读时间需要 9 分钟。

函数名(第一对象)

1. 函数的内存地址,print(func)

def func():    print(222)print(func)

 

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

def func():    print(222)f = funcprint(f())

 

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

def func1():    print(111)def func2():    print(222)def func3():    print(333)li = [func1,func2,func3]for i in li:    i()

 

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

def func1():    print(111)def func2(x):    x()func2(func1)

 

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

 

def f1():    print('f1')def func1(argv):    argv()    return argvf = func1(f1)f()

 

闭包:(cell)

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

def wrapper():    name = 'alex'    def inner():        print(name)    inner()    print(inner.__closure__)  #检查是不是闭包    return innerf = wrapperf() #输出的__closure__有cell元素 :是闭包函数
name = 'egon'def func2():    def inner():        print(name)    print(inner.__closure__)    return innerf2 = func2()f2() #输出的__closure__为None :不是闭包函数

 

2. 在外层函数的内部执行 inner()

def wrapper():    name = 'alex'    def inner():        print(name)    inner()    print(inner.__closure__)  #检查是不是闭包    return innerf = wrapperf()

 

闭包的好处:如果说内存函数是个闭包,python内部有一个机制,遇到闭包,它会在内存中开启一个内存空间,不会随着函数的结束而关闭。

装饰器:

1,  简单的装饰器

import  timedef func1():    print('in func1')def timer(func):    def inner():        start = time.time()        func()        print(time.time() - start)    return innerfunc1 = timer(func1)func1()
View Code

 

2,  带参数的装饰器

import timedef timer(func):    def inner(a):        start = time.time()        func(a)        print(time.time() - start)    return inner@timerdef func1(a):    print(a)func1(1)
View Code

 

3,  带返回值的装饰器

 

4,  通用的的装饰器

import timedef timer(func):    def inner(*args,**kwargs):        start = time.time()        re = func(*args,**kwargs)        print(time.time() - start)        return re    return inner@timer   #==> func1 = timer(func1)def func1(a,b):    print('in func1')@timer   #==> func2 = timer(func2)def func2(a):    print('in func2 and get a:%s'%(a))    return 'fun2 over'func1('aaaaaa','bbbbbb')print(func2('aaaaaa'))装饰器---hold住所有参数的装饰器
View Code

 

5,  语法糖 @

import timedef timer(func):    def inner():        start = time.time()        func()        print(time.time() - start)    return inner@timer   #==> func1 = timer(func1)def func1():    print('in func1')func1()装饰器---语法糖

开放封闭原则:

1.对扩展是开放的,为什么要对扩展开放呢?

    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

 

2.对修改是封闭的为什么要对修改封闭呢?

    就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

装饰器完美的遵循了这个开放封闭原则。

装饰器的主要功能和固定结构

#固定格式def wrapper(func):    def inner(*args,**kwargs):        '''执行函数前的操作'''        ret = func(*args,**kwargs)        '''执行函数后的操作'''        return ret    return innerdef func():    print(666)

多个装饰器装饰一个函数

def outer(flag):    def timer(func):        def inner(*args,**kwargs):            if flag:                print('''执行函数前要做的''')            ret = func(*args,**kwargs)            if flag:                    print('''执行函数后要做的''')            return ret        return inner    return timer@outer(False)def func():    print(111)func()
View Code

 

转载于:https://www.cnblogs.com/lzg-lzg/p/8406719.html

你可能感兴趣的文章
【SQL Server备份恢复】提高SQL Server备份速度
查看>>
移位操作的疑问
查看>>
gitlab 邮件服务器配置
查看>>
Python 循环语句(while, for)
查看>>
LinearGradient类来实现图片的渐变效果
查看>>
Golang关键字—— if/else
查看>>
PHP&MySQL(三)——数组
查看>>
GPS.NET 和 GeoFramework开源了
查看>>
汇编:采用址表的方法编写程序实现C程序的switch功能
查看>>
OFO和摩拜共享单车
查看>>
数据适配 DataAdapter对象
查看>>
有序列表ol和定义列表dl,dt,dd
查看>>
联想小新Air 15 安装黑苹果macOS High Sierra 10.13.6过程
查看>>
公共POI导出Excel方法–java
查看>>
次短路——Dijkstra
查看>>
Enter Query Mode Search Tricks Using Enter_Query Built-in in Oracle Forms
查看>>
Form属性、内置子程序、触发器、系统变量
查看>>
广州夜景一
查看>>
JVM(2)--一文读懂垃圾回收
查看>>
游戏开发——战斗系统设计技巧
查看>>