python第四天学习记录——装饰器、生成器、内置函数

来源:互联网 发布:艾克里里淘宝店叫什么 编辑:程序博客网 时间:2024/06/06 08:38

装饰器

装饰器的本质是函数,可以装饰其它函数,为其它函数添加附加功能
装饰器的原则:
1.不能修改被装饰的函数的源代码
2.不能修改被装饰函数的调用方式

装饰器的用法:

import timedef timer(func):    def wrapper(*args, **kwargs):        start_time = time.time()        func(*args, **kwargs)        stop_time = time.time()        print('the func run time is %s' % (stop_time - start_time))    return wrapper@timerdef test1():    time.sleep(3)    print("in the test1")test1()

如上面的代码所示,test1是原本的函数,timer是装饰器,给test1函数增加了计算函数调用前后的时间,但是并不改变test1函数本身以及调用方式。给函数增加装饰器的方式就是在函数前面加@。

终极版装饰器:

import timeuser,passwd = 'alex', 'abc123'def auth(auth_type):    print("auth func:", auth_type)    def outer_wrapper(func):        def wrapper(*args, **kwargs):            print("wrapper func args:", *args, **kwargs)            if auth_type == "local":                username = input("Username:").strip()                password = input("Password:").strip()                if user == username and password == passwd:                    print("User has passed authentication")                    return func(*args, **kwargs)                else:                    exit("Invalid username or password")            elif auth_type == "ldap":                print("ldap......")        return wrapper    return outer_wrapper@auth(auth_type="local")def home():    print("welcome to home page")    return "return from home"@auth("ldap")def bbs():    print("Welcome to bbs page")print(home())

这个装饰器比较特别的地方是,装饰器也可以传递参数,然后可以在装饰器内实现自定义的功能,在这种情况下,装饰器里面要包装两层。这里的装饰器提供用户认证的功能。并根据传递给装饰器的参数不同实现不一样的功能。

生成器

列表生成式:
列表里面不采用列举的方式而是类似循环的方式生成元素

>>> [i * 2 for i in range(10)][0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

如果把外面的中括号改成小括号就成了生成器,生成器不会立即生成所有元素,只能用遍历或者__next__()函数和next()方法来逐步访问所有元素。

>>> gen = (i * 2 for i in range(10))>>> gen<generator object <genexpr> at 0x107121ca8>>>> gen.__next__()0>>> gen.__next__()2>>> gen.__next__()4>>> next(gen)6>>> next(gen)8

除了使用类似列表生成器的方法之外,也可以使用函数来制作生成器:

def fib(max):    n, a, b = 0, 0, 1    while n < max:        yield b        a, b = b, a + b        n += 1    return '---done----'g = fib(6)while True:    try:        x = next(g)        print('g:', x)    except StopIteration as e:        print('Generator return value %s', e.value)        break

这个程序是生成一个斐波那契数列,通过函数中的yield可以把一个函数变成一个生成器,yield的作用是让函数中断执行,并且返回一个值,下一次从yield中断的地方继续执行。该程序用了异常捕获一个stopiteration,当该生成器运行完毕的时候会抛出该异常。

利用yield的特性,并且结合yield的一个send()方法,可是实现一个类似多线程的程序效果:

import timedef consumer(name):    print("准备做包子!")    while True:        baozi = yield        print("包子[%s]来了,被[%s]吃了" % (baozi, name))def producer():    c = consumer('A')    c2 = consumer('B')    c.__next__()    c2.__next__()    for i in range(10):        time.sleep(1)        c.send(i)        c2.send(i)producer()

内置函数

  1. abs:返回绝对值
  2. all: 遍历一个迭代器,如果都为空,或者每个迭代元素都会true,则返回ture
  3. any:如果任何迭代的一个元素为ture,或者为空,则返回false
  4. ascii: 转成ascii码
  5. bool:转换一个值,得到一个bool类型
  6. bytes: 根据一个编码转换成字节形式
  7. chr:返回一个整形数字的Unicode形式,比如97返回a
  8. dict:创建一个字典
  9. enumerate:返回一个枚举对象
  10. eval:执行一个表达式,或字符串作为运算
  11. exec:支持python代码的动态执行
  12. filter:在一个元组里面过滤出目标字符串
  13. float:字符串转成浮点类型
  14. format:格式化字符串
  15. globals: 返回当前全局的字典表
  16. hash:取一个对象的hash值
  17. help:调用系统内置的帮助系统
  18. hex:转换一个整形数字,为小写的十六进制
  19. id: 返回一个对象的唯一标识值
  20. input:从控制台读取数据
  21. int,转换字符串为int型
  22. len: 返回一个字符串的长度
  23. list:打印一个集合对象
  24. locals:更细并返回一个词典的本地标志表
  25. map:返回一个可迭代的map函数
  26. max:返回集合里面最大的一个或多个值
  27. min:返回集合里面最小的一个或多个值
  28. next:返回集合里面的下一项数值
  29. oct:返回一个整形为八进制类型
  30. open: 打开一个系统文件
  31. ord:得到一个字符串或unicode类型的ascii数值
  32. pow:返回的数字n次方值
  33. print:打印输出语句
  34. range:产生一个数字序列
  35. set:返回一个新的集合对象
  36. sorted:对一个集合进行排序
  37. str:将数字类型转换为字符串
  38. sum:对一个集合里面的值求和
  39. tuple:返回一个元组
  40. type:返回一个对象的类型

内置函数不止这么多,还有一些不常用的这里没有都列举出来

0 0
原创粉丝点击