zoukankan      html  css  js  c++  java
  • 内置函数 和 装饰器

    内置函数

    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
    chr()随机验证码实例

    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
    zip()

    内置函数补充 之 反射:

    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,程序会错误的提示你没有权限,然而你这个时候根本没有登录,程序就已经先判断出了权限,所以更加证明了优先最上面的装饰器,然后运行下面的装饰器

     

  • 相关阅读:
    C# 数据的序列化存取
    C# 移动端与PC端的数据交互
    C# Socket 简易的图片传输
    C# Socket学习笔记二
    C# Socket学习笔记一
    unity 小地图的制作
    Unity Layout碰撞检测
    Unity sqlite学习笔记一
    玩家信息血条及伤害值随主角移动
    C# 热水器
  • 原文地址:https://www.cnblogs.com/evenyao/p/9183776.html
Copyright © 2011-2022 走看看