内置函数
Python里面自带的函数
详细说明参考python官网:https://docs.python.org/3/library/functions.html#next
abs(-1) #取绝对值 all(1,2,5,0) #当前全部为真时,才返回真(即一假全假) any(0,1,[]) #当前只要有一个为真,就返回真(即一真全真) type('123') #返回数据类型 bin() #10进制转换成2进制 oct() #10进制转换成8进制 hex() #10进制转换成16进制 chr() #内部是ascii码序号,使用该函数转化ascii中的值,随机验证码要用到这个内置函数 ord() #和chr()相反,把ascii码里面的值转化成对应的序号 ================================================================================== compile() #将字符串编译成python代码 exec() #执行python代码,接收代码或者字符串,无返回值 eval() #执行python表达式,有返回值,专门做表达式运算 eval("8*8") ================================================================================== dict() #生成字典 dir() #快速查看对象提供的方法功能 divmod() #提供一种计算出商和余数的方法,返回一个元组(商,余数),用来做分页 isinstance() #用于判断,对象是否是某个类的实例 isinstance(s,list)
globals() #所有全局变量 locals() #所有局部变量 hash() #转换成hash值 len() #python3中字符长度,python2中字节长度 #python3如果需要字节长度,用bytes转换一下即可 max() #求最大值 min() #求最小值 sum() #求和 memoryview() #和内存地址相关
object() #所有类的父类 pow() #求指数 2**10 #2的10次方 pow(2,10) #同理 reverse() #翻转 round() #4舍5入 slice() #提供切片功能 sorted() #排序 zip() #融合
利用chr()的随机验证码实例:
#随机验证码:(单字母版本) import random #random功能 li = [] for i in range(6): temp = random.randrange(65,91) #ascii中的A-Z是65-90,因此定义范围65<= temp <91 c = chr(temp) #将生成的数字转换成字符 li.append(c) #一个一个加入到空列表li中 result = "".join(li) #通过join将列表li中的字符连接起来 print(result) #实验run:随机输出PNUOUX #==================================================== #随机验证码:(部分位置为数字版本) import random li = [] for i in range(6): if i == 2 or i == 4: #第2和4次循环的时候就选择数字,即第3和5位置的验证码是数字 num = random.randrange(0,10) #选择ascii中的代表数字0-9,因此定义范围0<= num <10 li.append(str(num)) #由于数字不能直接通过join()处理,因此需要str()转换成字符串 else: temp = random.randrange(65,91) c = chr(temp) li.append(c) result = "".join(li) print(result) #实验run:随机输出VH1M9B #==================================================== #随机验证码:(终极版本:每个位置都随机出现数字或者字符) import random li = [] for i in range(6): r = random.randrange(0,5) #进入for循环的时候就做一个random.randrange取随机值 if r == 2 or r == 4: #然后针对这个随机值再进行一次判断 num = random.randrange(0,10) li.append(str(num)) else: temp = random.randrange(65,91) c = chr(temp) li.append(c) result = "".join(li) print(result) #实验run:随机输出W948WO
filter() 和 map()
filter() 循环第二个位置的可迭代对象,让每个循环元素执行第一个位置的函数,如果函数返回值为True,表示元素合法,如果返回值为False,则进行过滤
def f2(a): if a > 22: return True li = [11,22,33,44,55] ret = filter(f2,li) #让每一个li的值去执行f2函数 print(list(ret)) #[33, 44, 55] #============================================= #filter结合lambda表达式实现相同功能 li = [11,22,33,44,55] result = filter(lambda a: a > 22 ,li) print(list(result)) #[33, 44, 55]
map() 对于要批量为一个可迭代对象统一进行操作
#实现列表中每个元素都+100 li = [11,22,33,44,55] def f1(args): result = [] for i in args: result.append(100 + i) return result r = f1(li) print(list(r)) #[111, 122, 133, 144, 155] #=================================== #用map(函数,可迭代的对象) li = [11,22,33,44,55] def f2(a): return a + 100 result = map(f2,li) print(list(result)) #[111, 122, 133, 144, 155] #=================================== #map结合lambda表达式实现相同功能 li = [11,22,33,44,55] result = map(lambda a: a + 100,li) print(list(result)) #[111, 122, 133, 144, 155]
filter和map的区别
filter 函数返回 True,将元素添加到结果中
map 函数返回值,添加到结果中
zip()
l1 = ["even",11,22,33] l2 = ["is",11,22,33] l3 = ["a",11,22,33] l4 = ["boy",11,22,33,44] r = zip(l1,l2,l3,l4) print(list(r)) #[('even', 'is', 'a', 'boy'), (11, 11, 11, 11), (22, 22, 22, 22), (33, 33, 33, 33)] l1 = ["even",11,22,33] l2 = ["is",11,22,33] l3 = ["a",11,22,33] l4 = ["boy",11,22,33,44] r = zip(l1,l2,l3,l4) temp = list(r)[0] result = " ".join(temp) print(result) #even is a boy
内置函数补充 之 反射:
https://www.cnblogs.com/evenyao/p/9190868.html
装饰器
@ + 函数名
如:@outer
单个装饰器
功能:
1.自动执行outer函数并且将其下方的函数名 f1当做参数传递
2.将outer函数的返回值,重新赋值给 f1
一个函数被装饰器装饰之后
这个被装饰的函数会被重新赋值成装饰器的内层函数 inner()
详细执行流程顺序
双层装饰器/多层装饰器
参考示例
def f1(f): def inner1(*args,**kwargs): print('befor1') res=f(*args,**kwargs) print('after1') return res return inner1 def f2(f): def inner2(*args,**kwargs): print('befor2') res=f(*args,**kwargs) print('after2') return res return inner2 @f2 @f1 def main(): print('even') main()
befor2
befor1
even
after1
after2
该示例执行的操作顺序解析:
以下是 debug 的过程:
用户登录和管理-装饰器实例:(雏形)
#!/usr/bin/env python # -*- coding:utf8 -*- USER_INFO = {} def check_login(func): def inner(*args,**kwargs): if USER_INFO.get('is_login',None): ret = func(*args,**kwargs) return ret else: print('请登录') return inner # def check_admin(func): # def inner(*args,**kwargs): # if USER_INFO.get('is_login',None): # if USER_INFO.get('user_type',None) == 2: # ret = func(*args,**kwargs) # return ret # else: # print('无权限查看') # else: # print('请登录') # return inner def check_admin(func): def inner(*args,**kwargs): if USER_INFO.get('user_type',None) == 2: ret = func(*args,**kwargs) return ret else: print('无权限查看') return inner @check_login @check_admin def index(): """ 管理员的功能 :return: """ print('Index') @check_login def home(): """ 普通用户的功能 :return: """ print('home') def login(): user = input("请输入用户名:") if user == 'admin': USER_INFO['is_login'] = True USER_INFO['user_type'] = 2 else: USER_INFO['is_login'] = True USER_INFO['user_type'] = 1 def main(): while True: inp = input('1.登陆;2.查看信息;3.超级管理员管理 >>>') if inp == "1": login() elif inp == '2': home() elif inp == '3': index() main()
一些思考
在上述用户登录和管理的代码当中装饰器 @is_login 判断是否登录在上,@is_admin 判断是否是管理员在下,装饰器在函数名前调用 @的时候一定不能对换上下的位置,否则就会出现下面的现象
1.正常现象:
如果在未登录的状况下选择 3,程序会提示你需要登录,才能判断你是否拥有管理员权限
2.对换上下位置之后的异常现象:
如果在未登录的状况下选择 3,程序会错误的提示你没有权限,然而你这个时候根本没有登录,程序就已经先判断出了权限,所以更加证明了优先最上面的装饰器,然后运行下面的装饰器