zoukankan      html  css  js  c++  java
  • 8.8(文件的高级应用,修改文件的两种方式,函数的定义,定义函数的三种形式,函数的返回值,函数的调用,函数的参数)

    复习

    字符编码:

    二进制和字符之间的转换过程 --> 字符编码

    ascii,gbk,shit,fuck 每个国家都有自己的编码方式

    美国电脑内存中的编码方式为ascii ; 中国电脑内存中的编码方式为gbk , 美国电脑无法识别中国电脑写的程序 , 中国电脑无法识别美国电脑写的程序

    现在硬盘中躺着 ascii/gbk/shit/fuck 编码的文件, 他们的编码格式已经无法修改了, 所以内存中出现unicode编码, 内存中的unicode编码方式可以识别 ascii/gbk/shit/fuck 编码的文件

    用unicode编码方式运行了 ascii/gbk/shit/fuck 编码的文件, 最后还是要装入硬盘, 装入硬盘早期用unicode存进去,但是 他在识别ascii的时候, 会把8位数字转换成16位数字存入硬盘, 浪费空间, 所以出现了utf8(与unicode对应,并且压缩unicode编码的字符)

    utf8 能识别其他国家的编码,只识别unicode, utf8目前还不能放在内存,. 但是现在写的代码都是utf8, 历史遗留ascii/gbk/shit/fuck 编码的文件迟早消失/淘汰,要么被转换成utf8格式.所以迟早有一天内存中也是utf8.

    python2和3字符编码的区别:

    1. 打开python解释器
    2. python解释器相当于文本编辑器,读取二进制转化为普通字符 a = 1
    3. 对转化后的普通字符进行解释(定义变量就要新开辟内存空间存放变量)
      python2
      用文件指定的编码方式存储定义后的变量
      如果文件指定编码为'gbk' ,那就会以gbk的形式存储变量, 本来打印的是0和1,但是终端会自动对你的0和1安装终端默认的编码转换成字符 ,如果终端的默认编码是utf8 ,乱码; 如果终端默认编码是gbk,不乱吗
      如果定义变量前加上u,coding:xxx不会对他造成任何影响, 因为会用unicode编码存储变量, 终端是任何类型的编码都可以识别
      python3
      用unicode编码方式存储定义后的变量
      以后写文件以什么格式存储,就以什么格式读取

    文件的三种打开方式

    r:只读

    f.read()

    w.清空后写入(文件不存在自动创建)

    f.write()

    a.追加(文件不存在是自动创建)

    f.write()

    文本模式:t 二进制模式:b

    t/b无法单独使用,只能和r/w/a一起使用

    with管理文件上下

    with open() as f: #可自动关闭

    pyinstallerde的使用

    pip instlal pyinstaller

    切换路径到文件夹(文件夹包含img.ico和test.py这两个文件)
    pyinstaller -i img.ico -F test.py

    文件的高级应用

    r+t:可读可写
    with open('test.py','r+',encoding='utf8') as fr:
    #     data = fr.read()
    #     print(fr.writable())
    #     fr.write('x = 10')
    #     print(data)
    #   r+既可读又可写
    w+t:可写可读
    w会清空文件,w+尽量不要使用  可写可读
    # with open('test.py','w+',encoding='utf8') as fw:
    #    print(fw.readable())
    #    fw.write('x = 10')
    #    data = fw.read()
    #    print(data)
    a+t:可追加可读
    with open('test.py','a+',encoding='utf8') as fa:
    #     fa.seek(1,0)
    #     data = fa.read()
    #     print(data)
    #
    #     fa.write('x = 10')
    #     fa.flush()刷新缓冲区的,即将缓冲区中的数据立刻写入文件,同时清空缓冲区
    #    指针的应用
    指针使用
    seek(按字节位移)
    # with open('test.py','r+',encoding='utf8') as fr:
        # fr.seek(1)   #1表示位移一位,默认从文件头开始
        # fr.seek(1,0) #0表示从头开始
        # fr.seek(4,1) #1表示从当前位置开始
        # fr.seek(0,2) #2表示从文件末尾开始
        # print(fr.read())
    #    tell(字节)当前指针位置
    # with open('test.py','r+',encoding='utf8') as fr:
    #     fr.seek(2,0)
    #     print(fr.tell())
    #    read(n)字符读多少个字符
    # with open('test.py','r+',encoding='utf8') as fr:
    #     print(fr.read(9))
    #    truncate()截断,字节
    # with open('test.py','r+',encoding='utf8') as fr:
        # fr.truncate(5)   清空后面的
    
    

    文件修改的两种方式

    将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘

    with open('test.py', 'r+', encoding='utf8') as fr:
    #     data = fr.read()
    #     fr.truncate(0)
    #     data = '中中中下下下中中水电费中'
    #     print(data)
    
    # import os
    # #
    # # # 文件没有修改这一说,只有覆盖这一说
    # # with open('test.py', 'r', encoding='utf8') as fr, 
    # #         open('test_swap.py', 'w', encoding='utf8') as fw:
    # #     data = fr.read()
    # #     data = data.replace('sb', 'dsb')
    # #
    # #     fw.write(data)
    # #
    # # import time
    # # time.sleep(5)
    # # os.remove('test.py')  # 删除文件
    # # os.rename('test_swap.py', 'test.py')  # 重命名文件
    

    将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件(边读变写)

    import os
    
    # 文件没有修改这一说,只有覆盖这一说
    with open('test.py', 'r', encoding='utf8') as fr, 
            open('test_swap.py', 'w', encoding='utf8') as fw:
        for i in fr:
            i = i.replace('sb', 'dsb')
            fw.write(i)
    
    os.remove('test.py')  # 删除文件
    os.rename('test_swap.py', 'test.py')  # 重命名文件
    
    

    函数的定义

    # 定义函数的方式
    '''
    def 函数名():  # 定义阶段
        """函数注释写在这里""" 
        <代码块>
    # 使用  # 调用阶段(开车阶段)
    函数名()
    '''
    # 定义阶段不执行函数体代码,只检测语法错误
    def func():
        """func函数的注释撒地方撒地方撒地方"""
        # todo:未来写一个开车函数
        pass
    print(login.__doc__)  # 记住   可以输出注释
    # 字符串:split   列表:append   字典:get  集合:add
    # read(), wirte()
    

    函数三种定义方式

    参数:未知量,变数

    无参函数:单独使用

    def add():
        """无参函数"""
        x = input('num1:')
        y = input('num2:')
        print(int(x) + int(y))
    

    有参函数:

    def add(x, y):  # 我这个工具不能单独使用,必须得加个配件,才能使用
        """有参函数"""
        print(int(x) + int(y))
    print(1)
    x = input('num1:')
    y = input('num2:')
    add(x, y)
    

    空函数:只定义了一个函数

    def func():
        pass
    

    函数的调用

    def add(x, y):
        return x+y
    
    
    add()
    res = add()
    print(res)  
    

    函数的返回值

    return  返回函数值,跳出函数
    可以返回任意数据类型   无个数限制
    0   返回None
    1   返回该值本身
    多个   返回值是元组
    

    函数的参数

    形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名

    实参:在函数调用阶段括号内传入的参数,称之为实际参数,简称实参,本质就是变量的值

    位置形参:

    在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参。
    def func(x, y):
        print(x)
        print(y)
    特点:按照位置定义的形参,都必须被传值,多一个不行,少一个也不行
    

    位置实参:

    在函数调用阶段,按照从左到右的顺序依次定义的实参,称之为位置实参。
    func(1, 2)
    特点:按照位置为对应的形参依次传值
    

    关键字实参:

    调用函数时,按照键值对的方式指定参数传值,

    可以打破位置限制,能为指定的形参赋值

    注意事项:

    1. 可以混用位置实参和关键字实参,但是位置实参必须在关键字实参的左边。
    2. 可以混用位置实参和关键字实参,但不能对一个形参重复赋值。

    默认形参:

    定义的时候就被赋值,调用时可以不用为其赋值

    注意事项:

    1. 位置形参必须放在默认形参的左边。
    2. 默认形参的值只在定义阶段赋值一次,也就是说默认参数的值在函数定义阶段就已经固定了
  • 相关阅读:
    docker常规操作——启动、停止、重启容器实例
    docker同时删除多个容器
    ubuntu中使用docker部署.netcore2.1
    .NET中RabbitMQ的使用
    Java开发环境Jave EE 和 jdk 下载
    WebApi用户登录验证及服务器端用户状态存取
    MVC中使用Ninject依赖注入
    起步:SpringBoot
    ML-对偶(Duality)问题 KKT 条件
    pandas 之 多层索引
  • 原文地址:https://www.cnblogs.com/jiann/p/11323765.html
Copyright © 2011-2022 走看看