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()
内置函数
- abs:返回绝对值
- all: 遍历一个迭代器,如果都为空,或者每个迭代元素都会true,则返回ture
- any:如果任何迭代的一个元素为ture,或者为空,则返回false
- ascii: 转成ascii码
- bool:转换一个值,得到一个bool类型
- bytes: 根据一个编码转换成字节形式
- chr:返回一个整形数字的Unicode形式,比如97返回a
- dict:创建一个字典
- enumerate:返回一个枚举对象
- eval:执行一个表达式,或字符串作为运算
- exec:支持python代码的动态执行
- filter:在一个元组里面过滤出目标字符串
- float:字符串转成浮点类型
- format:格式化字符串
- globals: 返回当前全局的字典表
- hash:取一个对象的hash值
- help:调用系统内置的帮助系统
- hex:转换一个整形数字,为小写的十六进制
- id: 返回一个对象的唯一标识值
- input:从控制台读取数据
- int,转换字符串为int型
- len: 返回一个字符串的长度
- list:打印一个集合对象
- locals:更细并返回一个词典的本地标志表
- map:返回一个可迭代的map函数
- max:返回集合里面最大的一个或多个值
- min:返回集合里面最小的一个或多个值
- next:返回集合里面的下一项数值
- oct:返回一个整形为八进制类型
- open: 打开一个系统文件
- ord:得到一个字符串或unicode类型的ascii数值
- pow:返回的数字n次方值
- print:打印输出语句
- range:产生一个数字序列
- set:返回一个新的集合对象
- sorted:对一个集合进行排序
- str:将数字类型转换为字符串
- sum:对一个集合里面的值求和
- tuple:返回一个元组
- type:返回一个对象的类型
内置函数不止这么多,还有一些不常用的这里没有都列举出来
0 0
- python第四天学习记录——装饰器、生成器、内置函数
- python 学习2:生成器,迭代器,装饰器
- 记录学习python装饰器
- Python内置装饰器
- 函数嵌套,内置函数,闭包函数,迭代器,生成器,装饰器
- python[变量作用域-函数-闭包-装饰器-生成器]
- python内置函数记录
- Python生成器、迭代器、装饰器
- Python----装饰器/生成器/迭代器
- python 函数装饰器学习
- python学习之迭代器、生成器和装饰器
- Python学习笔记——内置函数
- python 装饰器 递归函数 记录
- python 的内置函数,闭包,以及装饰器
- Python——编写函数装饰器
- python学习——生成器
- Python学习:内置函数
- python内置函数学习
- UVA 11427 Expect the Expected
- 学习笔记3——32位和64位Linux操作系统的区别及系统识别方法
- LeetCode Distinct Subsequences(动态规划)
- 第二部分:文字录入及身份证校验
- Xcode删除所有的mobileprovision
- python第四天学习记录——装饰器、生成器、内置函数
- https介绍
- LintCode算法题解
- poj2299:Ultra-QuickSort(树状数组+离散化)
- Android相关导图
- Binary 【NOIP2016提高A组模拟8.17】
- hdu 5867 Water【水题】
- 存储过程procedure
- 关于SPFA算法和一维优化