装饰器及内置函数
Posted yzl2333
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器及内置函数相关的知识,希望对你有一定的参考价值。
听名字应该知道这是一个装饰的东西,我们今天就来讲解一下装饰器,有的铁子们应该听说,有的没有听说过.没有关系我告诉你们这是一个很神奇的东西
这个有多神奇呢? 我们先来复习一下闭包
def func1(): ? name = "alex" ? def func2(): ? print(name) ? # 闭包 ? func2() ? func1()
这就是闭包,那刚刚说的很神奇的东西呢?,为什么又说闭包了呢? 机智的铁子们已经猜到,装饰器和闭包是有点关系的,是滴没错.
那什么是装饰器呢?装饰器是干什么的呢?
装饰器的本质其实就是闭包
现在你在公司,领导让你写一个函数,来测试另一个函数的执行效率,你怎么做?
我先告诉大家一个查看时间的东西
我们可以通过这个来计算执行时间
上面你已经写完了,但是你应该放在函数中,这样减少重复代码,可读性好,ok继续做。
好你又写完了,但是执行之前的函数只是func(),而你写玩了这个之后,还得加一步timmer(func),如果要是领导让你测试500个函数的执行效率呢?好,你又进一步改,如下
现在你请教了我,我说来,写个装饰器就能解决。
这样,就写好了,这是最简单的装饰器,装饰任何函数,只需要加一句func = timmer(func)
但是Python认为你这个还是不简单,所以Python给你提供了一个更见的方式就是语法糖。
@装饰器函数 == 重新定义被装饰函数=装饰器函数(被装饰函数)
内置函数
什么是内置函数?就是python帮我们提供的一个工具,拿过直接用就行,比如我们的print,input,type,id等等.截止到python3.6.2版本
中一共提供了68个内置函数.他们就是python直接提供给我们的,有一些我们已经用过了.有一些还没有用过.还有一我们需要学完面向对象才能继续学习.今天我们认识一下python的内置函数
作用域相关
locals() 返回当前作用域中的名字
globals() 返回全局作用域中的名字
迭代器相关
range() 生成数据
next() 迭代器向下执行一次,内部实际使用了next()方法返回迭代器的下一个项目
iter() 获取迭代器,内部实际使用的是iter()方法来获取迭代器
字符串类型代码的执行
eval() 执行字符串类型的代码,并返回最终结果
exec() 执行字符串类型的代码
通过上边的测试发现,只要是exec就没有返回值,eval就是有返回值的
输入和输出相关
input() 获取用户输入的内容
print() 打印 输出
print里的sep
print里的end
内存相关
hash() 获取对象的哈希值(int.str,bool,tuple)
id() 获取到对象的内存地址
文件操作相关
open() 用于打开一个文件,创建一个文件句柄
模块相关
? import() 导入,引入
帮助
help() 函数用于查看函数或模块用途的详细说明
调用相关
callable() 用于检查一个对象是否是可调用的,如果返回True,object有可能调用失败,要是返回False,那调用绝对就完犊子
查看内存属性
dir() 查看对象的内置属性,方法,访问的是对象的dir()方法
数字相关:
bool() 将给定的数据转换成bool值,如果不给值.返回False
int() 将给定的数据转换成int值,如果不给值,返回0
float() 将给定的数据转换成float值,也就上次小数
compilex() 创建一个复数,第一个参数为实部,第二个参数为虚部.或者第一个参数直接用字符串来描述复数
进制转换:
bin() 将给的参数转换成二进制
otc() 将给的参数转换成八进制
hex() 将给的参数转换成十六进制
数字运算:
abs() 求绝对值
divmod() 返回商和余数
第一个参数是商,第二参数是余数
round() 四舍五入
pow(a,b) 求a的b次幂,如果有个三次参数,则求万次幂后对第三方个数取余
sum() 求和
max() 求最大值
数据结构相关
列表和元祖
list() 将一个可迭代对象转换成列表
tuple() 将一个可迭代对象转换成元祖
reversed() 将一个序列反转,返回反转序列的迭代器
字符串相关:
str() 将数据转化成字符串
format() 与具体数相关,用于计算各种小数,精算等
字符串
数值 自己练习
bytes() 把字符串转换成bytes类型
bytearray() 返回一个新字节数组,每个元素的值的范围是0~256对应的是ascii码表
memoryview() 查看bytes的内存地址
ord() 输入字符找带字符编码的位置
chr() 输入位置数字找出对应的字符
ascii() 是ascii码中的返回值 不是就返回u
repr() 返回一个对象本质的形式
数据集合
dict() 创建一个字典
set() 创建一个集合
其他相关
len() 返回一个对象的元素个数
enumerate() 获取枚举对象
all() 可迭代对象中全部是True,结果才是True
any() 可迭代对象中有一个是True,就是True
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元祖,
然后返回由这些元祖组成的内容,如果各个迭代器的元素个数不一致,则按照长度最短的返回
lambda
匿名函数,为了解决一些简单的需求而设计的一句话函数
lambda表示的是匿名函数,不需要用def来声明,一句话就可以声明出一个函数
语法:
函数名 = lambda 参数:返回值
注意:
1.函数的参数可以有多个,多个参数之间用逗号隔开
2.匿名函数不管多复杂.只能写一行.且逻辑结束后直接返回数据
3.返回值和正常的函数一样,可以是任意数据类型,但是只能一个,不能返回多个.
匿名函数并不是说一定没有名字,这里前面的变量就是一个函数名,说他是匿名原因是我们通过
name查看的时候是没有名字的.统一都叫做lambda.在调用的时候没有什么特别之处
像正常的函数调用既可
sorted
排序函数
语法:sorted(iterable,key=None,reverse=False)
iterable : 可迭代对象
key: 排序规则(排序函数),在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数.根据函数运算的结果进行排序
reverse :是否是倒叙,True 倒叙 False 正序
字典使用sorted排序
和函数组合使用
和lambda组合使用
filter
筛选过滤
语法: filter(function,iterable)
function: 用来筛选的函数,在filter中会自动的把iterable中的元素传递给function,然后根据function返回的True或者False来判断是否保留此项数据
iterable:可迭代对象
map
映射函数
语法: map(function,iterable) 可以对可迭代对象中的每一个元素进映射,分别取执行function
计算列表中每个元素的平方,返回新列表
改写成lambda
计算两个列表中相同位置的数据的和
reduce
在Python2.x版本中recude是直接 import就可以的, Python3.x版本中需要从functools这个包中导入
龟叔本打算将 lambda 和 reduce 都从全局名字空间都移除, 舆论说龟叔不喜欢lambda 和 reduce
最后lambda没删除是因为和一个人写信写了好多封,进行交流然后把lambda保住了.
参考资料:
https://www.processon.com/view/link/5b4ee15be4b0edb750de96ac
递归
在函数中调用函数本身,就是递归
在python中递归的深度最大到998
官方文档表示最大递归深度是1000
递归的应用:
我们可以使用递归来遍历各种树形结构,比如我们的文件夹系统.可以使用递归来遍历该文件夹中的所有文件
以上是关于装饰器及内置函数的主要内容,如果未能解决你的问题,请参考以下文章