美文网首页
Python ☞ day 5

Python ☞ day 5

作者: 浪子彦卿L | 来源:发表于2018-05-05 22:28 被阅读0次

    Python学习笔记之 装饰器& 偏函数 & 异常处理 & 断言 & 文件读写 &编码与解码

    装饰器
    • 概念:是一个闭包,把一个函数当做参数,返回一个替代版的函数,本质上就是一个返回函数的函数。
    #   简单的装饰器
    def function1():
        print("lee is a good man!")
    
    def function3(func):
        def inner():
            print("******************")
            func()
        return inner
    #   f是函数function1的加强版本
    f = function3(function1)
    f()
    
    #   复杂一点的装饰器
    def outer(func):
        def inner(age):
            if age < 0:
                age = 0
            func(age)
        return inner
    
    #   使用@函数将装饰器应用到函数
    #   python2.4开始支持使用@符号
    @outer
    def say(age):
        print("lee is %d years old" % (age))
    say(-15)
    
    #   通用装饰器
    
    '''
    #   固定格式
    def outer(func):
        def inner(*args,**kwargs):
            #添加修改的功能
            pass
            func(*args,**kwargs)
        return inner
    '''
    import time
    def outer(func):
        def inner(*args,**kwargs):
            #添加修改的功能
            startTime = time.time()
            time.sleep(1)
            print("&&&&&&&&&&&&&&")
            func(*args,**kwargs)
            endTime = time.time()
            print("执行该函数总共花了 %f" %(endTime - startTime))
        return inner
    
    @outer
    def say(name,age):  #函数的参数理论上是无限制的,但实际上最好不要超过6~7个
        print("my name is %s, I am %d years old" %( name,age))
    say("lee", 18)
    
    偏函数
    import functools
    #   print(int("123", base = 10))
    #   偏函数
    def int2(str, base = 2):
        return int(str,base)
    
    print(int2("1010"))
    
    #   把一个参数固定住,形成一个新的函数
    int3 = functools.partial(int, base = 2)
    print(int3("1010"))
    
    异常处理
    • try…… except ……else
    '''
    格式:
    try:
        语句t
    except 错误码 as e:
        语句1
    except 错误码 as e:
        语句2
    ……
    except 错误码 as e:
        语句n
    else:
        语句e
        
    注意:else语句可有可无
    
    作用:用来检测try语句块中的错误,从而让except语句捕获错误信息并处理
    
    逻辑:当程序执行到try-except-else语句时
    1、如果当try“语句t”执行出现错误,会匹配第一个错误码,如果匹配上就执行对呀的“语句”
    2、如果当try“语句t”执行出现错误,没有匹配的异常,错误将会被提交到上一层的try语句。或者到程序的最上层。
    3、如果当try“语句t”执行没有出现错误,执行else下的“语句e”(你得有)
    
    '''
    
    try:
        #print(3 / 0)
        #print(num)
        print(4 / 2)
    except NameError as e:
        print("没有该变量")
    except ZeroDivisionError as e:
        print("除数为0了")
    else:
        print("代码没有问题")
    
    #   使用except而不使用任何的错误类型
    try:
        #print(4 / 0)
        print(num)
    except:
        print("程序出现了异常")
    
    #   使用except带着多种异常
    try:
        print(5 / 0)
    except (NameError,ZeroDivisionError):
        print("出现了NameError或ZeroDivisionError")
    
    #   特殊
    #1、错误其实是class(类),所以的错误都继承自BaseException,所以捕获的时候,它捕获了该类型的错误,还把子类一网打尽
    
    try:
        print(5 / 0)
    except BaseException as e:
        print("异常1")
    except ZeroDivisionError as e:
        print("异常2")
    
    #2、跨越多层调用,main调用了func2,func2调用了func1,func1出现了错误,这时只要main捕获到了就可以处理
    def func1(num):
        print(1 / num)
    def func2(num):
        func1(num)
    def main():
        func2(0)
    
    try:
        main()
    except ZeroDivisionError as e:
        print("****")
    
    • try……except……finally
    格式:
    try:
        语句t
    except 错误码 as e:
        语句1
    except 错误码 as e:
        语句2
    ……
    except 错误码 as e:
        语句n
    finally:
        语句f
    
    作用:语句t无论是否有错误都将执行最后的语句f
    
    try:
        print(1 / 0)
    except ZeroDivisionError as e:
        print("为0了")
    finally:
        print("必须执行我")
    
    print("*****")
    
    • 断言
    # 断言
    def func(num,dev):
        assert (dev != 0), "dev 不能为0"
        return num / dev
    
    print(func(10,0))
    
    文件读写
    • 读文件
      过程:
      1、打开文件
      2、读文件内容
      3、关闭文件
    • 打开文件
    打开文件
    open(path, flag[, encoding][, errors])
    path:要打开文件的路径
    flag:打开文件的方式
    r   以只读的方式打开文件,文件的描述符放在文件的开头   
    rb  以二进制格式打开一个文件用于只读,文件的描述符放在文件的开头
    r+  打开一个文件用于读写,文件的描述符放在文件的开头
    w   打开一个文件只用于写入,如果该文件已经存在会覆盖,如果不存在则创建一个新文件
    wb  打开一个文件只用于写入二进制,如果该文件已经存在会覆盖,如果不存在则创建一个新文件
    w+  打开一个文件用于读写,如果该文件已经存在会覆盖,如果不存在则创建一个新文件
    a   打开一个文件用于追加,如果文件存在,文件描述符将会放在文件末尾
    a+  
    encoding:编码格式
    errors:错误处理
    
    path = r"C:\Users\yanji\Desktop\day7\file1.txt"
    
    #ignore  忽略错误
    f = open(path, "r",encoding="gbk")
    
    • 读文件内容
    读文件内容
    # 1、读取文件全部内容
    str1 = f.read()
    print(str1)
    
    # 2、读取指定字符数
    str2 = f.read(10)
    print("*"+str2+"*")
    str3 = f.read(10)
    print("*"+str3+"*")
    
    # 3、读取整行,包括"\n"字符
    str4 = f.readline()
    print(str4)
    str5 = f.readline()
    print(str5)
    
    # 4、读取指定字符数
    str6 = f.readline(10)
    print(str6)
    
    # 5、读取所有行并返回列表
    list7 = f.readlines()
    print(list7)
    
    # 6、若给定的数字大于0,返回实际size字节的行数
    list8 = f.readlines(20)
    print(list8)
    
    # 7、修改描述符的位置
    f.seek(10)
    str9 = f.read()
    print(str9)
    
    • 关闭文件
      f.close()
    #   一个完整的过程
    try:
        f1 = open(path,"r", encoding="gbk")
        print(f1.read())
    finally:
        if f1:
            f1.close()
    
    with open(path,"r",encoding="gbk") as f2:
        print(f2.read())
    
    • 写文件
    path = r"C:\Users\yanji\Desktop\day7\file4.txt"
    f = open(path,"w")
    
    #   1、将信息写入缓冲区
    f.write("lee is a good man")
    
    #   2、刷新缓冲区
    #   直接把内部缓冲区的数据立刻写入文件,而不是被动的等待自动刷新缓冲区写入
    f.flush()
    f.write("lee is a good man\n")
    f.close()
    
    with open(path,"a") as f:
        f.write("good man")
    
    • 编码与解码
    #   编码
    path = r"C:\Users\yanji\Desktop\day7\test1"
    with open(path,"wb") as f3:
        str = "lee is a good man"
        f3.write(str.encode("utf-8"))
    with open(path,"rb") as f2:
        data = f2.read()
        print(data)
        print(type(data))
        newDate = data.decode("utf-8")
        print(newDate)
        print(type(newDate))
    

    相关文章

      网友评论

          本文标题:Python ☞ day 5

          本文链接:https://www.haomeiwen.com/subject/wxzerftx.html