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()
    
    
    
     
     
     
  • 相关阅读:
    ABAP 程序中的类 沧海
    ABAP类的方法(转载) 沧海
    More than 100 ABAP Interview Faq's(2) 沧海
    SAP and ABAP Memory总结 沧海
    ABAP Frequently Asked Question 沧海
    ABAP System Reports(Additional functions) 沧海
    ABAP Questions Commonly Asked 1 沧海
    ABAP Tips and Tricks 沧海
    ABAP System Fields 沧海
    ABAP 面试问题及答案(一):数据库更新及更改 SAP Standard (转) 沧海
  • 原文地址:https://www.cnblogs.com/liweijing/p/7194956.html
Copyright © 2011-2022 走看看