zoukankan      html  css  js  c++  java
  • python_day03 文件处理复习和函数定义调用参数对象

    一、字符编码和文件处理复习

    字符编码:把人类的字符翻译成计算机能识别的数字
    字符编码表:就是一张字符与数字对应关系的表 ASCII GBK UTF-8 UNICODE
    内存默认字符编码格式UNICODE
    硬盘存入数据以bytes存储数据
    UNICODE------>encode('utf-8')------>bytes
    bytes-------->decode('utf-8')------>unicode
    原则:字符是以什么格式编码的,就要以什么格式解码
    PS:
    python3中的字符串分为两种:
    x='egon' 存成UNICODE
    y=x.encode('utf-8') 存成bytes
    python2中的字符串也分为两种:
    x=u'egon' 与python3中的字符串一样
    y='alex' 与python3中的bytes一样

    文件处理的常用操作
    #r文本模式的读,在文件不存在,不会创建新文件
    f=open('a.txt','r',encoding='utf-8')  #不指定encode模式会以os默认方式打开,windows默认是GBK。
    print(f.read())         #文件内容全部列出。不推荐此方式,占用内存空间较大。
    print(f.readable())     #判断文件是否可读或可写
    print(f.writable())
    print(f.readline())     #读单行和多行
    print(f.readlines())
    f.close()          #不做f.close() os会占用资源
    #w文本模式的写,文件存在则清空,不存在则创建
    # f=open('a.txt','w',encoding='utf-8')
    f=open('b.txt','w',encoding='utf-8')
    print(f.writable())
    print(f.readable())
    f.write('哈哈哈哈
    ')   # 
    为换行符
    f.write('哈哈哈哈
    ')
    f.writelines(['1111
    ','222
    '])
    #a文本模式的追加,文件存在光标跳到文件末尾,文件不存在创建
    f=open('b.txt','a',encoding='utf-8')
    print(f.writable())
    print(f.tell())     #tell告知光标所在字节位置,相对于文件头而言。
    f.write('3333
    ')
    f.write('44444
    ')
    #r+,w+,a+  #r+读时可写 w+写时可读 a+最加时可读
    
    #rb模式即直接从硬盘中读取bytes  bytes不是最终的二进制
    f=open('a.txt','rb')  #b模式不需要指定encoding方式,否则会有报错
    print(f.read())
    #wb模式
    f=open('a.txt','wb')
    f.write('你好啊'.encode('utf-8'))    #写入的是字节码,需要encode过程
    print(f)
    f.close()
    print(f)
    print(f.read)
    print(f.readable)
    f.read()
    #ab模式
    
    with open('file.txt','w',encoding='utf-8') as f:      #不需要执行f.clost(),运行完成后会自动关闭f
        f.write('1111
    ')
    
    f=open('test.jpg','rb')   #图片格式或其他任意格式文件都可以通过二进制方式读取到
    print(f.read())
    #图片格式或其他任意格式文件都可以通过下列二进制方式复制
    with open('test.jpg','rb') as read_f,open('test1.jpg','wb') as write_f:
        # write_f.write(read_f.read())
        for line in read_f:
            write_f.write(line)
    
    
    文件处理的其他了解操作:
    f=open('a.txt','r',encoding='utf-8')
    print(f.read(3))        #3为读取字符个数 r模式
    f.close()
    f=open('a.txt','rb')
    #unicode模式 1个字符时3个字节butes 解码时需3个的倍数
    print(f.read(7).decode('utf-8')) #6为读取字节个数 rb模式
    # print(f.read(3).decode('utf-8'))
    f.close()
    f=open('a.txt','rb')
    print(f.read(3))
    print(f.tell())
    f.seek(3,0) #光标回到字节位置,相对于文件开头
    print(f.tell())
    print(f.read(3).decode('utf-8'))
    f=open('a.txt','rb')
    print(f.read(3))
    print(f.tell())
    f.seek(3,1) #1模式(当前光标为参照物) 向后移动几个字节
    print(f.tell())
    print(f.read().decode('utf-8'))
    f=open('a.txt','rb')
    f.seek(0,2) #2模式(结尾光标为参照物)
    print(f.tell())
    print(f.read())
    #f.seek() 1和2模式必须要在b模式下进行
    #windows cmd命令行下执行tail
    #python3 tail.py -f access.log
    import time
    import sys
    with open(r'%s' %sys.argv[2],'rb') as f: #%s windows路径直接写可能在cmd下报错
    f.seek(0,2)
    while True:
    line=f.readline()
    if line:
    print(line)
    else:
    time.sleep(0.2)
    with open('acess.log','a') as f:
    f.write('1111 ')
    with open('a.txt','r+',encoding='utf-8') as f:
    f.truncate(2) #从文件开头开始截取2个字节 a.txt只剩下2个字节
    
    
    with open('a.txt','r',encoding='utf-8') as f:
    # l=f.readlines()
    # print(l)
    # for line in l:
    # print(line,end='')
    # res=f.read()
    # print(type(res))
    for line in f.read():
    print(line)
    l=[1,2,3,4,5]
    # for index in range(len(l)):
    # # print(index)
    # print(l[index])

    for item in l:
    # print(index)
    print(item)
    #windows cmd下调用脚本
    import sys
    #python3 copy.py source.file target.file
    if len(sys.argv) < 3:
    print('Usage:python3 copy.py source.file target.file')
    sys.exit()
    #r'C:UsersAdministratorPycharmProjectspython18期周末班day3 est.jpg'
    with open(r'%s' %sys.argv[1],'rb') as read_f,
    open(r'%s' %sys.argv[2],'wb') as write_f:
    for line in read_f:
    write_f.write(line)


    # python3 tail.py -f access.log
    import time
    import sys
    with open(r'%s' % sys.argv[2], 'rb') as f:
    f.seek(0, 2)
    while True:
    line = f.readline()
    if line:
    print(line.decode('utf-8'),end='')
    else:
    time.sleep(0.2)
     

    二、函数定义调用参数对象

    问题:
    复杂度增大
    组织结构不清晰
    可读性差
    代码冗余
    可扩展性和可维护性差
    解决问题:
    工具就是具备某一种功能的物件,就是程序中的函数的概念
    事先准备工具的过程称为函数的定义
    遇到特定的场景拿来就用称为函数调用
    函数的使用:
    1 先定义
    2 再调用
    函数的定义与变量的定义类似,没有事先定义变量,而直接引用变量,会报错
    没有事先定义函数,而直接调用,就相当于在引用一个不存在的变量名
    函数在定义阶段发生了什么事情???
    只检测语法,不执行代码
    函数的定义语法

    def 函数名(arg1,arg2,arg3):
    "注释"
    函数体
    return 返回值

    函数名一般是动词
    参数、、、
    return:函数内部可以有多个return,但只能执行一次,函数就结束调用,
    并且会把return后的值作为函数执行的结果返回
    #定义的三种形式
    '''
    无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
    有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
    空函数:设计代码结构

    '''
    '''
    **********************
    hello egon
    **********************
    '''
    def print_star():
        print('*'*10)
    def print_msg():
        print('hello egon')
    print_star()
    print_star()
    print_msg()
    print_star()
    print_star()
    def func():
    asdf #asdf=111111

    #定义阶段
    def foo():
    print('from foo')
    bar()
    # print(foo)
    def bar():
    print('from bar')
    #调用阶段
    foo()
    def my_max(x,y):
    if x > y:
    # print(x)
    return x
    else:
    # print(y)
    return y

    res=my_max(1,2)
    print(res)

    res=max(1,2)
    print(res)

    def foo():
    print('-=----')
    return 123
    print('-=----')
    print('-=----')
    print('-=----')
    foo()
    def select(sql):
    '''select function'''
    print(sql)
    #sql=['select', '*', 'from', 'mysql.user;']


    def insert(sql):
    '''insert function'''
    pass

    def update(sql):
    '''update function'''
    pass

    def delete(sql):
    '''delete function'''
    pass


    #select * from mysql.user;
    def main():
    while True:
    sql=input('>>: ').strip()
    if not sql:continue
    cmd_info=sql.split()
    cmd=cmd_info[0]

    if cmd == 'select':
    select(cmd_info)
    main()

    函数的返回值:

    
    
    #函数的返回值
    #函数内部可以有多个return,但是只能执行一次,函数就结束调用,并且会把return后的值作为函数执行的结果返回
    def func():
        print('from func')
        return [1,2,3],'a',1,{'a':3}
    res=func()
    print(res)
    '''
    大前提:return的返回值没有类型限制
        1. 没有return:返回None,等同于return None
        2. return 一个值:返回该值
        3. return val1,val2,val3:返回(val1,val2,val3)
    '''
    def my_max(x,y):
        if x > y:
            return x
        else:
            return y
    my_max(1,2) #语句形式
    res=my_max(1,2)*10 #表达式形式
    # res1=my_max(1,2)
    # res2=my_max(res1,3)
    res2=my_max(my_max(1,2),3) #函数调用可以当做另外一个函数的参数
    print(res2)
    
    
    函数的参数:
    #形参:在定义函数时,括号内的参数成为形参
    #特点:形参就是变量名
    def foo(x,y): #x=1,y=2
        print(x)
        print(y)
    #实参:在调用函数时,括号内的参数成为实参
    #特点:实参就是变量值
    foo(1,2)
    #在调用阶段实参(变量值)才会绑定形参(变量名)
    #调用结束后,解除绑定
    #参数的分类
    #位置参数:按照从左到右的顺序依次定义的参数
        #位置形参:必须被传值,并且多一个不行,少一个也不行
        #位置实参:与形参按照位置一一对应
    # def foo(x,y):
    #     print(x)
    #     print(y)
    # foo('egon',1,2)
    #关键字实参:指的是按照name=value的形式,指名道姓地给name传值
    # def foo(name,age):
    #     print(name)
    #     print(age)
    # foo('egon',18)
    # foo(age=18,name='egon')
    #关键字实参需要注意的问题是:
    # def foo(name,age,sex):
    #     print(name)
    #     print(age)
    #     print(sex)
    # foo('egon',18,'male')
    # print('======>')
    # foo(sex='male',age=18,name='egon')
    # foo('egon',sex='male',age=18)
    #问题一:语法规定位置实参必须在关键字实参的前面
    # foo('egon',sex='male',age=18)
    #问题二:一定不要对同一个形参传多次值
    # foo('egon',sex='male',age=18,name='egon1')
    # foo('male',age=18,name='egon1')
    #默认形参:在定义阶段,就已经为形参赋值,意味在调用阶段可以不用传值
    # def foo(x,y=1111111):
    #     print(x)
    #     print(y)
    # foo(1,'a')
    # def register(name,age,sex='male'):
    #     print(name,age,sex)
    # register('asb',73)
    # register('wsb',38)
    # register('ysb',84)
    # register('yaya',28,'female')
    #默认参数需要注意的问题
    #问题一:默认参数必须放在位置参数之后
    # def foo(y=1,x):
    #     print(x,y)
    #问题二:默认参数只在定义阶段赋值一次,而且仅一次
    # x=100
    # def foo(a,b=x):
    #     print(a,b)
    # x=111111111111111111111111111111
    # foo('egon')
    #问题三:默认参数的值应该定义成不可变类型
    可变长参数:
    
    
    #可变长参数指的是实参的个数多了
    #实参无非位置实参和关键字实参两种
    #形参必须要两种机制来分别处理按照位置定义的实参溢出的情况:*
    #跟按照关键字定义的实参溢出的情况:**
    # def foo(x,y,*args): #nums=(3,4,5,6,7)
    #     print(x)
    #     print(y)
    #     print(args)
    # foo(1,2,3,4,5,6,7) #*
    # foo(1,2) #*
    #*args的扩展用法
    # def foo(x,y,*args): #*args=*(3,4,5,6,7)
    #     print(x)
    #     print(y)
    #     print(args)
    # # foo(1,2,3,4,5,6,7) #*
    # foo(1,2,*(3,4,5,6,7)) #foo(1,2,3,4,5,6,7)
    # def foo(x,y=1,*args): #
    #     print(x)
    #     print(y)
    #     print(args)
    # # foo('a','b',*(1,2,3,4,5,6,7)) #foo('a','b',1,2,3,4,5,6,7)
    # # foo('egon',10,2,3,4,5,6,9,y=2) #报错
    # foo('egon',10,2,3,4,5,6,9)
    # def foo(x,y,**kwargs): #nums={'z':3,'b':2,'a':1}
    #     print(x)
    #     print(y)
    #     print(kwargs)
    # foo(1,2,z=3,a=1,b=2) #**
    # def foo(x,y,**kwargs): #kwargs={'z':3,'b':2,'a':1}
    #     print(x)
    #     print(y)
    #     print(kwargs)
    # foo(1,2,**{'z':3,'b':2,'a':1}) #foo(1,2,a=1,z=3,b=2)
    # def foo(x, y):  #
    #     print(x)
    #     print(y)
    #
    # foo(**{'y':1,'x':2})  # foo(y=1,x=2)
    # def foo(x,*args,**kwargs):#args=(2,3,4,5) kwargs={'b':1,'a':2}
    #     print(x)
    #     print(args)
    #     print(kwargs)
    # foo(1,2,3,4,5,b=1,a=2)
    #这俩东西*args,**kwargs干甚用???
    def register(name,age,sex='male'):
        print(name)
        print(age)
        print(sex)
    # def wrapper(*args,**kwargs): #args=(1,2,3) kwargs={'a':1,'b':2}
    #     # print(args)
    #     # print(kwargs)
    #     register(*args,**kwargs)
    #     # register(*(1, 2, 3),**{'a': 1, 'b': 2})
    #     # register(1, 2, 3,a=1,b=2)
    # wrapper(1,2,3,a=1,b=2)
    import time
    # def register(name,age,sex='male'):
    #     # start_time=time.time()
    #     print(name)
    #     print(age)
    #     print(sex)
    #     time.sleep(3)
        # stop_time=time.time()
        # print('run time is %s' %(stop_time-start_time))
    # def wrapper(*args, **kwargs): #args=('egon',) kwargs={'age':18}
    #     start_time=time.time()
    #     register(*args, **kwargs)
    #     stop_time=time.time()
    #     print('run time is %s' %(stop_time-start_time))
    # wrapper('egon',age=18)
    # register('egon',18)
    #命名关键字参数:  在*后面定义的形参称为命名关键字参数,必须是被以关键字实参的形式传值
    # def foo(name,age,*args,sex='male',group):
    #     print(name)
    #     print(age)
    #     print(args)
    #     print(sex)
    #     print(group)
    #
    # foo('alex',18,19,20,300,group='group1')
    def foo(name,age=18,*args,sex='male',group,**kwargs):
        pass
    
    
    函数的对象:
    
    
    #函数是第一类的对象:指的是函数可以被当做数据传递
    def foo():
        print('from foo')
    #1 被赋值
    # f=foo
    # print(f)
    # f()
    #2 可以当做参数传入
    # def wrapper(func):
    #     # print(func)
    #     func()
    # wrapper(foo)
    #3 可以当做函数的返回
    def wrapper(func):
        return func
    # res=wrapper(foo)
    # print(res)
    #4 可以当做容器类型的元素
    # cmd_dic={
    #     'func':foo
    # }
    #
    # print(cmd_dic)
    # cmd_dic['func']()
    def select(sql):
        '''select function'''
        print('select----->',sql)
        #sql=['select', '*', 'from', 'mysql.user;']
    def insert(sql):
        '''insert function'''
        print('insert---->',sql)
    def update(sql):
        '''update function'''
        print('update----->',sql)
    def delete(sql):
        '''delete function'''
        print('delete---->',sql)
    def alter(sql):
        print('alter===>',sql)
    cmd_dic = {
        'insert': insert,
        'update': update,
        'delete': delete,
        'select': select,
        'alter':alter,
    }
    #select  * from mysql.user;
    def main():
        while True:
            sql=input('>>: ').strip()
            if not sql:continue
            cmd_info=sql.split()
            cmd=cmd_info[0]
            if cmd in cmd_dic:
                cmd_dic[cmd](cmd_info)
            else:
                print('cmd not exists')
    main()
    
    
    
     
     
     
  • 相关阅读:
    Python3字典中items()和python2.x中iteritems()有什么区别
    python中使用zip函数出现<zip object at 0x02A9E418>
    python中字符串连接的四种方式
    Python如何规定对方输入的数字必须是整数?
    C# 自定义控件VS用户控件
    c#使用Split分割换行符
    C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案
    安装MySql for Visual Studio的坑
    MySql Access denied for user 'root'@'localhost' (using password:YES) 解决方案
    VS2010 VS2012 VS2013 VS2015启动调试时老是提示正在下载公共符号
  • 原文地址:https://www.cnblogs.com/liweijing/p/7194956.html
Copyright © 2011-2022 走看看