文章目录
1.阶乘函数(一行搞定)
print(reduce(lambda x, y: x * y, range(1, int(input()) + 1)))
2.hasattr() & getattr() & setattr()
class func_test(object):
name = 'test'
def read(self):
return "正在读书"
func_test = func_test()
- hasattr(object, name)
判断对象object是否有name属性/name方法
# 判断func对象是否有read属性/read方法
hasattr(func_test , "read")
- getattr(object, name, default)
获取对象object的属性/方法
存在——打印出来
不存在——打印默认值,默认值可选
如果返回的是对象的方法,则打印出方法的内存地址,如果需要运行这个方法,可以在方法后面加括号()
getattr(func_test, "read") # 打印read的内存地址
print(getattr(func_test, "read")()) # 运行read方法
getattr(func_test, "name") # 打印name值
getattr(func_test, "play", "正在玩耍") # 打印默认值,无默认值会报错
- setattrobject, name, values)
给对象object的属性赋值,如果属性不存在则先创建再赋值
setattr(func_test, "play", "正在玩耍")
3.闭包
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称为闭包
4.函数装饰器作用
装饰器本质上是一个callable object,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能。装饰器的返回值也是一个函数的对象,它经常用于有切面需求的场景。比如:插入日志,性能测试,事务处理,缓存。权限的校验等场景,有了装饰器就可以抽离出大量的与函数功能本身无关的雷同代码并发并继续使用
5.生成器 & 迭代器
【迭代器】是遵循迭代协议的对象。用户可以使用 iter() 以从任何序列得到迭代器(如 list, tuple,dictionary, set 等)。另一个方法则是创建一个另一种形式的迭代器 —— generator 。要获取下一个元素,则使用成员函数 next()(Python 2)或函数 next() function (Python 3) 。当没有元素时,则引发 StopIteration 此例外。若要实现自己的迭代器,则只要实现 next()(Python 2)或 next ()(Python 3)
【生成器】只是在需要返回数据的时候使用yield语句。每次next()被调用时,生成器会返回它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)
区别:生成器能做到迭代器能做的所有事,而且因为自动创建iter()和next()方法,生成器显得特别简洁,而且生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出StopIteration异常
6.yield的用法
yield就是保存当前程序执行状态,你用for循环的时候,每次取一个元素的时候就会计算一次。用yield的函数叫generator,和iterator一样,它的好处是不用一次计算所有元素,而是用一次算一次,可以节省很多空间,generator每次计算需要上一次计算结果,所以用yield,否则一return,上次计算结果就没了
7.面向对象
面向对象是相当于面向过程而言的,面向过程语言是一种基于功能分析的,以算法为中心的程序设计方法,而面向对象是一种基于结构分析的,以数据为中心的程序设计思想。在面向对象语言中有一个很重要的东西,叫做类。面向对象有三大特性:封装、继承、多态。
8.python异步使用场景
1、不涉及共享资源或对共享资源只读,即非互斥操作
2、没有时序上的严格关系
3、不需要原子操作或可以通过其他方式控制原子性
4、常用于IO操作等耗时操作,因为比较影响客户体验和使用性能
5、不影响主线程逻辑