zoukankan      html  css  js  c++  java
  • python周报第四周

    0.本周知识点预览

    • 内置函数
    • 装饰器基础

    1.内置函数进阶

    1.chr()、ord()

    print(chr(66))
    
    print(ord("F"))

    执行结果如下

    B
    70

    总结:chr()函数是把数字转换成相应ASCII码对应的值,ord()和chr()相反,可以把ASCII码对应的值转换成数字。

    2.random()

    import random
    list = []
    for i in range(6):
        r = random.randrange(0,6)
        if r == 0 or r == 2:
            num = random.randrange(0,10)
            list.append(str(num))
        elif r == 1 or r == 3:
            num = random.randrange(65,91)
            ret = chr(num)
            list.append(ret)
        else:
            num = random.randrange(97,113)
            ret = chr(num)
            list.append(ret)print("".join(list))

    执行结果如下

    aA3cc4

    总结:random模块的randrange()方法返回一个随机数,上述代码返回一个6位随机的验证码。

    3.compile()、eval()、exec()

    1.compile()

    eval_code = compile( '1+2', '', 'eval')
    ret = eval(eval_code)
    print(ret)

    执行结果如下

    3

    总结:compile()方法是把str里的语句编译成代码对象

    2.eval()

    num = 10
    ret = eval('num * 7')
    print(ret)

    执行结果如下

    70

    总结:eval()方法是用来执行字符串中的有效的python表达式,注意eval()是有返回值的。

    3.exec()

    a=1
    exec("a=a+10")
    print(a)

    执行结果如下

    11

    总结:exec()方法用来执行存储在str中的python代码。

    4.dir()、help()

    a=[1,2,3]
    ret = dir(a)
    print(ret)

    执行结果如下

    ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

    ========================================================================================

    a=[1,2,3]
    ret = help(a)
    print(ret)

    执行结果如下

    Help on list object:
    
    class list(object)
     |  list() -> new empty list
     |  list(iterable) -> new list initialized from iterable's items
     |  
     |  Methods defined here:
     |  
     |  __add__(self, value, /)
     |      Return self+value.
     |  
     |  __contains__(self, key, /)
     |      Return key in self.
    ......

    总结:dir()、help()方法会打印函数的帮助信息,help会比dir更详细

    5.isinstance()

    testlist = [1,2,3]
    ret1 = isinstance(testlist,list)
    ret2 = isinstance(testlist,tuple)
    print(ret1,ret2)

    执行结果如下

    True False

    总结:isinstance()方法,会判断第一个参数是否是第二个参数的子类,返回True或者False。

    6.filter()、map()

    1.filter()

    a= [1,3,5,7,8,9]
    
    def f1(num):
        return num>5
    
    ret = filter(f1,a)
    print(list(ret))

    执行结果如下

    [7, 8, 9]

    总结:filter()方法的第一个参数是一个函数,第二个参数是一个可迭代的对象,它会循环第二个参数,让每个元素循环执行函数,如果函数返回为True,表示元素合法,添加到结果中。

    2.map()

    c = [1,3,4,5,7,10]
    
    ret = map(lambda num: num + 20,c)
    
    print(list(ret))

    执行结果如下

    [21, 23, 24, 25, 27, 30]

    总结:map()方法的第一个参数是一个函数,第二个参数是一个可迭代的对象,它会循环第二个参数,让每个元素循环执行函数,将函数返回值添加到结果中。

    7.zip()

    a = ["lk",11,22,33]
    b = ["is",7,8]
    c = ["god","haha",123]
    
    print(list(zip(a,b,c)))

    执行结果如下

    [('lk', 'is', 'god'), (11, 7, 'haha'), (22, 8, 123)]

    总结:zip()函数的参数是N个可迭代的对象,返回值是迭代对象聚合后的元组,用list()可以使其转化为列表。列表长度为最短参数的长度。

    2.装饰器

     1.初识

    1.被装饰函数无返回值

    
    
    def outer(func):
    def inner():
    print("logging....")
    func()
    return inner

    @outer
    def b1():
    print("b1.......")


    def b2():
    print("b2.......")


    def b3():
    print("b3.......")

    b1()
     

    执行结果如下:

    logging....
    b1.......

    代码剖析:装饰器的用法:@ + 函数名;装饰器的功能:

    1.自动执行outer函数,并且将其下面的函数名b1作为参数。

    2.将outer函数的返回值,重新赋值给b1,上述代码outer的返回值就是inner()函数体,这个是重点!也就相当于print "logging...."  + func(),而func() == 老b1(),故,新的b1()就是print "logging......"  +  print "b1......"

    3.装饰器的用途就是可以在不改变原函数的情况下给函数增加功能。

    2.被装饰函数有返回值

    def outer(func):
        def inner():
            print("logging....")
    #        func()
            ret = func()
            return ret
        return inner
    
    @outer
    def b1():
        return "I love Python"
    
    
    def b2():
        print("b2.......")
    
    
    def b3():
        print("b3.......")
    
    a = b1()
    print(a)

    执行结果如下:

    logging....
    I love Python

    代码剖析:装饰器的用法不多说,上述例子已说明,详细说明一下和上个例子的不同之处

    当函数有返回值时,同样inner()方法就相当于b1(),也就是说inner()函数的返回值就是老b1()的返回值。inner()函数的返回值就是ret,也就是老b1()的返回值,也就是"I love Python"

    3.被装饰的函数有参数

    def outer(func):
        def inner(number):
            print("logging....")
    #        func()
            ret = func(number)
            return ret
        return inner
    
    @outer
    def b1(num):
        return num * num
    
    
    def b2():
        print("b2.......")
    
    
    def b3():
        print("b3.......")
    
    a = b1(9)
    print(a)

    执行结果如下

    logging....
    81

    代码剖析:当被装饰的函数有参数时,一定要铭记一点,装饰器函数的内层函数就相当于被装饰的函数。那么如例子:b1()函数就相当于inner()函数,因为b1()在调用时有参数,并返回参数的平方。这里就需要在inner()函数增加参数,如题是写成inner(number)。而在这里,同样可以写成inner(*args,**kwargs)的万能参数的形式。

    4.场景举例

    LOGIN = False
    
    def outer(func):
        def inner():
            if LOGIN:
                func()
            else:
                print("请登录!!!!!")
        return inner
    
    @outer
    def message():
        print("欢迎登陆")
        exit()
    
    def login(user,pwd):
        if user == "liukai" and pwd == "123":
            global LOGIN
            LOGIN = True
            message()
    
    
    def main():
        while True:
            print("1:管理,2:登陆")
            inp = input("请输入: ")
            if inp == "1":
                message()
            elif inp == "2":
                userinput = input("请输入用户名: ")
                passwdinput = input("请输入密码: ")
                login(userinput,passwdinput)
    
    
    main()

    执行结果如下:

    1:管理,2:登陆
    请输入: 1
    请登录!!!!!
    1:管理,2:登陆
    请输入: 1
    请登录!!!!!
    1:管理,2:登陆
    请输入: 2
    请输入用户名: liukai
    请输入密码: 123
    欢迎登陆

    代码剖析:当首次选择管理后,会因为LOGIN = False 而无限循环,当选择登陆并用户密码输入正确后,会调用message()函数,全局变量LOGIN变为True。而message()函数被outer装饰了,当LOGIN为True时,执行message()函数,当LOGIN为False时,打印重新登陆。

    2.进阶

    1.装饰器带参数

    def base(num):
        def outer(func):
            def inner(number):
                print("logging....")
                print("--- [%s] ---" % num)
        #        func()
                ret = func(number)
                return ret
            return inner
        return outer
    
    @base("123")
    def b1(num):
        return num * num
    
    
    def b2():
        print("b2.......")
    
    
    def b3():
        print("b3.......")
    
    a = b1(9)
    print(a)

    执行结果如下

    logging....
    --- [123] ---
    81

    代码剖析:对于无参数的装饰器,其装饰器函数的参数是要被装饰的函数名,对于有参数的装饰器在调用时使用的是传入的参数,所以必须在内部再定义一个函数outer()来接收要被装饰的函数对象。

  • 相关阅读:
    centos 6,7 上cgroup资源限制使用举例
    redis sentinel哨兵的使用
    redis发布-订阅
    Golang cpu的使用设置--GOMAXPROCS
    Golang 端口复用测试
    Golang client绑定本地IP和端口
    Go并发控制--context的使用
    Go 并发控制--WaitGroup的使用
    go thrift报错问题--WriteStructEnd
    secureCRT上传本地文件到虚拟机
  • 原文地址:https://www.cnblogs.com/Caesary/p/5544245.html
Copyright © 2011-2022 走看看