python学习之路-4 内置函数和装饰器
本篇涉及内容
内置函数
callable() 判断对象是否可以被调用,返回一个布尔值
1234567891011num=10print(callable(num))# num不能够被调用,返回Falsedeff1():print("name")print(callable(f1))# f1可以被调用,返回True# 输出FalseTruechr() 将十进制整数转换为ascii编码中对应的字符
12345678910111213141516171819202122232425262728293031num=chr(69)# 整数69在ascii编码表中对应的是字母Eprint(num)# 输出E# 练习# 利用ascii编码随机生成6位验证码importrandomli=[]foriinrange(6):r=random.randrange(0,3)# 生成随机数用来选择数字,小写字母或大写字母ifr==0:# 随机数字num=random.randrange(0,10)li.append(str(num))elifr==1:# 随机大写字母temp=random.randrange(65,91)# 65-91在ascii表中对应的字符是A-Zc=chr(temp)# 将十进制整数转换成为ascii表中对应的字符li.append(str(c))elifr==2:# 随机小写字母temp=random.randrange(97,123)# 97-123在ascii表中对应的字符是a-zc=chr(temp)# 将十进制整数转换成为ascii表中对应的字符li.append(str(c))result="".join(li)print(result)# 输出814P8iord() 将字符转换成ascii编码表中对应的十进制整数
12345st=ord("E")# 字符E在ascii编码表中对应的十进制整数是69print(st)# 输出69dir() # 查看一个对象有哪些功能
1234print(dir(dict))# 输出['__class__','__contains__','__delattr__','__delitem__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__getitem__','__gt__','__hash__','__init__','__iter__','__le__','__len__','__lt__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__setitem__','__sizeof__','__str__','__subclasshook__','clear','copy','fromkeys','get','items','keys','pop','popitem','setdefault','update','values']help() 查看对象的使用方法
1234print(help(list))# 输出输出内容太长,自己去试divmod() # 通过除数和被除数返回一个元组(商, 余数) 做分页比较有用
12345n=divmod(100,9)print(n)# 输出(11,1)isinstance() 判断对象是否是一个类的实例, 返回一个布尔值
12345678r=isinstance("abc",str)print(r)r=isinstance("abc",dict)print(r)# 输出TrueFalseenumerate() 用于遍历序列中的元素以及它们的下标
1234567fori,jinenumerate(('a','b','c')):print(i,j)# 输出0a1b2cfilter(函数名, 可迭代对象) 调用函数,将可迭代对象中的每一个元素传给函数去执行,返回的结果为True则保留该元素,将保留的元素组成一个列表,将该列表作为返回值
1234567891011121314151617181920deff2(a):ifa >22:returnTrueli=[11,22,33,44,55,66]ret=filter(f2, li)print(list(ret))# 输出[33,44,55,66]## 使用lambda表达式f1=lambdaa: a >30li=[11,22,33,44,55,66]ret=filter(f1, li)print(list(ret))# 输出[33,44,55,66]map(函数,可迭代对象) 调用函数,将可迭代对象中的每一个元素传给函数去执行,返回的结果组成一个列表,将该列表作为返回值
1234567891011121314151617def f2(a):returna +100li = [11,22,33,44,55,66]ret = map(f2, li)print(list(ret))# 输出[111,122,133,144,155,166]## 使用lambda表达式f2 = lambda a: a +100li = [11,22,33,44,55,66]ret = map(f2, li)print(list(ret))# 输出[111,122,133,144,155,166]globals() # 全局变量 locals() # 局部变量
12345678910NAME="aaa"defshow():a=123print(globals())print(locals())show()# 输出{'__file__':'D:/SVN/learning/s13/day4/class_code/2、内置函数.py','show': <function show at0x00000000004BCBF8>,'__builtins__': <module'builtins'(built-in)>,'__spec__':None,'NAME':'aaa','__cached__':None,'__package__':None,'__loader__': <_frozen_importlib.SourceFileLoaderobjectat0x000000000276E7B8>,'__doc__':None,'__name__':'__main__'}{'a':123}hash() 通过hash计算出一个全数字的值
123456s="123"ret=hash(s)print(ret)# 输出 pycharm执行有问题,这个值会变,在python命令提示符下执行没问题-5981999319787686991len() python2.7 字节长度 python3 字符长度
12345name="张三"print(len(name))# 输出2bytes() 将字符转成字节
123456name="张聪"ret=bytes(name, encoding="utf-8")print(ret)# 输出b'\xe5\xbc\xa0\xe8\x81\xaa'max() 求最大值
12345r=max([11,22,33,1])print(r)# 输出33min() 求最小值
12345r=min([11,22,33,1])print(r)# 输出1sum() 求和
12345r=sum([11,22,33,1])print(r)# 输出67pow() 求幂次方
12345r=pow(2,10)# 2的10次方print(r)# 输出1024reversed() 反转 和list的reversed()方法一样
123456li=[1,3,4,1,53,3,5]ret=reversed(li)print(list(ret))# 输出[5,3,53,1,4,3,1]round() 四舍五入
12345678ret=round(1.8)ret2=round(3.3)print(ret)print(ret2)# 输出23slice() 跟切片的方法一样 没什么卵用,比切片还麻烦
123456789myslice=slice(0,5,2)print(myslice)l=list(range(10))print(l[myslice])# 输出slice(0,5,2)[0,2,4]sorted() 排序
123456li=[1,3,4,1,53,3,5]ret=sorted(li)print(ret)# 输出[1,1,3,3,4,5,53]type() 查看对象类型
1234567891011a="abc"b=[1,2,3]c={1:"a",2:"b"}print(type(a))print(type(b))print(type(c))# 输出<class'str'><class'list'><class'dict'>zip() 将多个列表的相对应的位置进行组合成一个元组,元组作为元素产生新的列表
12345678910l1=[11,12,13,14]l2=[21,22,23,24]l3=[31,32,33,34]ret=zip(l1, l2, l3)print(list(ret))# 输出[(11,21,31), (12,22,32), (13,23,33), (14,24,34)]
装饰器
装饰器可以在不改变函数体和函数调用的情况下在该函数执行之前,或者执行之后进行额外的操作
装饰器的功能
自动执行装饰器函数,并将被装饰函数的函数名当做参数传递给装饰器函数
将装饰器函数的返回值,重新赋值给被装饰函数
装饰器之案例演变
创建一个简单的函数,该函数的内容为输出nginx告警信息,该函数同时被A部门调用
1234567891011defprint_nginx_log():"""nginx服务器告警:return:"""print("nginx server is down")print_nginx_log()# 输出nginx serverisdown新的需求来了,A部门说需要在输出告警之前和输出告警之后分别输出"即将告警"和"告警结束",然后我们对上面的代码做如下修改:
1234567891011121314151617defprint_nginx_log():# 直接在该代码中告警的前后添加代码"""nginx服务器告警:return:"""print("nginx即将告警")print("nginx server is down")print("nginx告警结束")print_nginx_log()# 输出nginx即将告警nginx serverisdownnginx告警结束### 这个时候完成了A部门的需求,A部门老大很高兴,请我出去happy了一下新的问题出现了,A部门老大说你这个修改了原来函数的代码,有没有办法在不修改函数代码的基础上完成这个功能啊,思考半天,灵机一动,想到一个办法,代码如下:
123456789101112131415161718192021defnew_func(func):# 新添加一个函数,在该函数内去调用nginx告警函数,并在告警前后完成A部门的需求print("nginx即将告警")func()print("nginx告警结束")defprint_nginx_log():"""nginx服务器告警:return: None"""print("nginx server is down")new_func(print_nginx_log)# 输出nginx即将告警nginx serverisdownnginx告警结束## 代码改完,告诉他新的函数的名称,让他去修改代码调用的函数,使用new_func(print_nginx_log)进行调用就可以实现他说的那个功能,A思考了1秒钟,回答说:"fuck,你知道这样我需要改多少个地方么,我有n个位置调用了这个nginx告警函数,让我改不现实,赶紧想办法解决吧",然后我就开始各种百度,谷歌一顿狂搜,然后发现了装饰器这么个玩意总结了一下A部门老大的需求就是要想不改变函数调用方式的情况下去对原函数做扩展,然后就有了下面的装饰器:
12345678910111213141516171819202122232425defnew_func(func):"""装饰函数:param func: 被装饰函数的函数名:return: func"""print("nginx即将告警")func()print("nginx告警结束")returnfunc@new_funcdefprint_nginx_log():"""nginx服务器告警:return: None"""print("nginx server is down")# 输出nginx即将告警nginx serverisdownnginx告警结束上面代码流程详解:

使用了装饰器之后执行发现,我并没有调用函数,但是自己就执行了,这肯定不是我想要得结果,然后继续百度、谷歌。。。各种FQ各种搜最后,代码修改如下:
12345678910111213141516171819202122232425262728defnew_func(func):"""装饰函数:param func: 被装饰函数的函数名:return: func"""definner():print("nginx即将告警")func()print("nginx告警结束")returninner@new_funcdefprint_nginx_log():"""nginx服务器告警:return:"""print("nginx server is down")print_nginx_log()# 输出nginx即将告警nginx serverisdownnginx告警结束### 从结果中看出,当调用nginx告警函数的时候,才会进行输出,完成了A部门老大的需求,于是他猛夸了我一番上面代码流程详解:

过了几天,A部门老大跑过来对我说:"你看能不能这样,这个只能够对nginx做告警,我现在需要对mysql也要做告警,你能不能在底层函数上面加一个参数,然后我把告警的信息当做参数给传进去",然后我又一顿狂搜,搞出来的代码如下:
123456789101112131415161718192021222324252627282930defnew_func(func):"""装饰函数:param func: 被装饰函数的函数名:return: func"""definner(value):print("nginx即将告警")func(value)print("nginx告警结束")returninner@new_funcdefprint_nginx_log(value):"""nginx服务器告警:return:"""print(value)value="mysql is down"print_nginx_log(value)# 输出nginx即将告警mysqlisdownnginx告警结束### 这样就解决了A部门老大的需求了过了没几天,他又跑过来,说mysql告警的时候需要传多个参数,nginx告警只需要传一个参数,你看能否搞下,然后我又进入到狂搜的状态,最后搞出来代码如下
12345678910111213141516171819202122232425262728293031defnew_func(func):"""装饰函数:param func: 被装饰函数的函数名:return: func"""definner(*args,**kwargs):print("nginx即将告警")func(*args,**kwargs)print("nginx告警结束")returninner@new_funcdefprint_nginx_log(*args,**kwargs):"""nginx服务器告警:return:"""print(*args,**kwargs)value="mysql is down"k_value={"time":100}print_nginx_log(value, k_value)# 输出nginx即将告警mysqlisdown {'time':100}nginx告警结束### 这样就解决了A部门老大的需求,于是他又请我出去happy了一下^.^过了没两天又跑来找我,说底层函数没有返回值,我需要一个返回值,然后经过一顿的狂搜,搞到下面的代码
1234567891011121314151617181920212223242526272829303132333435defnew_func(func):"""装饰函数:param func: 被装饰函数的函数名:return: func"""definner(*args,**kwargs):print("nginx即将告警")res=func(*args,**kwargs)print("nginx告警结束")returnresreturninner@new_funcdefprint_nginx_log(*args,**kwargs):"""nginx服务器告警:return:"""print(*args,**kwargs)res="ok"returnresvalue="mysql is down"k_value={"time":100}res=print_nginx_log(value, k_value)print(res)### 输出nginx即将告警mysqlisdown {'time':100}nginx告警结束ok
python学习之路-4 内置函数和装饰器的更多相关文章
- Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)
Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数
- Python学习(八) —— 内置函数和匿名函数
一.递归函数 定义:在一个函数里调用这个函数本身 递归的最大深度:997 def func(n): print(n) n += 1 func(n) func(1) 测试递归最大深度 import sy ...
- python学习 day013打卡 内置函数
本节主要内容: 内置函数: 内置函数就是python给你提供的.拿来直接用的函数,比如print,input等等.截止到python版本3.6.2 python一共提供了68个内置函数.他们就是pyt ...
- python成长之路八 -- 内置函数
1,python内置函数 内置函数 abs() dict() help() min() setattr() all() dir() hex() next() slice() a ...
- Python学习笔记——常用的内置函数
一.yield def EricReadlines(): seek = 0 while True: with open('D:/temp.txt','r') as f: f.seek(seek) da ...
- python之路 内置函数,装饰器
一.内置函数 #绝对值 abs() #所有值都为真才为真 all() #只要有一个值为真就为真 any() #10进制转成二进制 bin() #10进制转成八进制 oct() #10进制转成十六进制 ...
- Python学习【第5篇】:Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器、模块)
一.为什么要使用函数? 1.避免代码重用 2.提高代码的可读性 二.函数的定义与调用 1. def 函数名(参数1,参数2): ''' 函数注释''' print('函数体') return 返回值 ...
- python学习三十八天常用内置函数分类汇总
python给我们提供丰富的内置函数,不用去写函数体,直接调用就可以运行,很方便快速给我提供开发所需要的函数. 1,查内存地址 id() 变量的内存地址 id() 2,输入输出 input() pr ...
- python学习笔记-day4笔记 常用内置函数与装饰器
1.常用的python函数 abs 求绝对值 all 判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any ...
随机推荐
- 用户控件(.ascx)与<ul><li>以及<a>布局之小结
用户控件(.ascx)与<ul><li>以及<a>布局 小结 一.用户控件(.ascx) 1.aspx是浏览器直接访问的页面,而ascx是用户控件,一般是用来重用. ...
- JAVA学习第三十课(经常使用对象API)- String类:类方法练习
intern方法 public class Main { public static void main(String[] args) { String str1 = new String(" ...
- JMeter基础概念
JMeter 介绍:一个非常优秀的开源的性能测试工具. 优点:你用着用着就会发现它的重多优点,当然不足点也会呈现出来. 从性能工具的原理划分: Jmeter工具和其他性能工具在原理上完全一致,工具包含 ...
- Ubuntu 14.04根据系统,休眠后不能启动要解决的问题
简介: 提升Ubuntu制度14.04之后,当系统进入休眠,我们不能再次启动,直接崩溃,凡出了问题? 1. 问题纳入 Ubuntu升级系统14.04之后.通过系统的Power设置休眠时间,在系统进 ...
- js中window.print()去除页眉页脚
//jsp打印时去除页眉页页脚 打印前加入下面代码即可 var HKEY_Root,HKEY_Path,HKEY_Key; HKEY_Root="HKEY_CURRENT_USER" ...
- 调用具体webservice方法时时报错误:请求因 HTTP 状态 503 失败: Service Temporarily Unavailable
添加web引用会在相应项目的app.cofig文件中产生如下代码: <sectionGroup name="applicationSettings" type="S ...
- silverlight 生成图表 WCF 解析XML代码.svc.cs 文件
silverlight 调用wcf 文件代码 private ListItem AnalyzeXML(string XMLCode, string Reportdate, string ChartNa ...
- C++中cin输入类型不匹配解决方法
#include <iostream> #include <set> using namespace std; int main() { int a; cin>>a ...
- dedecms likearticle 调用附加表的字段调用方式
[field:id runphp='yes'] $aid = @me; $row = $GLOBALS['dsql']->GetOne("Select 字段名 From `dede_a ...
- HoG SVM 目标检测分析
前一段时间开始了解HoG跟SVM行人识别,看了很多包括Dalal得前辈的文章及经验分享,对HoG理论有了些初步的认识. HoG 的全称是 Histogram of Oriented Gradient, ...