day11 函数的简介

昨日内容回顾

文件的基本操作

三个步骤
1.打开文件
2.操作文件(读与写)
3.关闭文件
​
​
关键字:open
语法格式:
    f=open('文件路径','读写模式','字符编码') | with open('文件路径','读写模式','字符编码') as f:
    
    文件路径:
        1.相对路径
        2.绝对路径

今日内容概要

  • 作业

  • 二进制模式下读写操作

  • 控制文件内指针的移动

  • 文件的修改(了解)

  • 函数

    • 函数的简介

    • 函数的语法结构

    • 函数的返回值

    • 如何调用函数

今日内容详细

作业

# 编写一个拷贝工具
    1.输入被拷贝的文件
    2。输入即将要拷贝的文件路径
    3.以读的模式打开源文件,以写的模式打开目标文件
    

# 1.先有源文件路径
source_file_path = input('待拷贝文件路径:').strip()
​
# 2.写一个目标文件的路径
dst_file_path = input('待输入文件路径:').strip()
​
# 3.以r模式打开源文件,以写模式打开目标文件
with open(r'%s' % source_file_path, 'rb') as read_f:
    with open(r'%s' % dst_file_path, 'wb') as write_f:
        for line in read_f:
            write_f.write(line)

二进制模式下读写操作

with open('a.txt', 'r', encoding='utf-8') as f:
    print(f.read(3))  # hello world------->hel
​
with open('a.txt', 'rb') as f:  # 一个中文三个字符编码
    print(f.read(14).decode('utf-8'))  # 解码中文字符
​
'''
t模式下:
    f.read() 不指定参数就是全读,指定就读取相应数量字符
    
b模式下:
    f.read(3) 如果指定了参数返回的就是字节的个数
    如果有中文的字符一定要指定三的倍数;如果有中文也有英文就需要计算,不然会报错
'''
​

控制文件内指针的移动

指针:可以理解为光标的意思

with open('a.txt', 'r', encoding='utf-8') as f:
    print(f.read(3))  # 你好hello world你好
    f.seek(3, 0)  # 好hello world你好------光标以字节为准移动,从开头开始移动,中文为三个字节
    print(f.read())
​
with open('a.txt', 'rb') as f:  # 1模式只能用在b模式
    print(f.read(3))  # 你好hello world你好
    f.seek(3, 1)  # hello world你好------光标以字节为准移动,中文为三个字节,从当前开始移动
    print(f.read().decode('utf-8'))
​
with open('a.txt', 'rb') as f:  # 1模式只能用在b模式
    print(f.read(2))  # 你好hello world你好
    f.seek(-3, 2)  # hello world你好------光标以字节为准移动,中文为三个字节,从当前开始移动
    print(f.read().decode('utf-8'))
​
'''
f.seek()
    offset: int
        移动的偏移量
        如果是正数就往右边移,负数就往左边移(左边要可移动)
        
    whence: int = 0
        模式控制
        0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的:能够使用在t和b模式
        1: 该模式代表指针移动的字节数是以当前所在的位置为参照的
        2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的:偏移量要写负数,因为光标从末尾开始,无法向右
'''
​
​
# 小练习:实现动态查看最新一条动态的查看

import time  # 导入了一个时间模块
​
with open('a.txt', mode='rb') as f:
    f.seek(0, 2)
    while True:
        line = f.readline()
        if len(line) == 0:
            # 没有内容
            time.sleep(0.5)  # 睡眠
        else:
            print(line.decode('utf-8'), end='')

文件的修改

with open('a.txt',mode='r+t',encoding='utf-8') as f:
    
mode='r+'
mode='w+'
mode='a+'
# 既可读也可写
​
1.硬盘中的数据是不能直接修改的
2.内存中的数据可以直接修改
​
方式一:
    # 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
    # 优点: 在文件修改过程中同一份数据只有一份
    # 缺点: 会过多地占用内存
    with open('db.txt',mode='rt',encoding='utf-8') as f:
        data=f.read()------>先打开读取入内存
​
    with open('db.txt',mode='wt',encoding='utf-8') as f:
        f.write(data.replace('kevin','SB')) # 将Kevin替换为SB
方式二:
    # 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
    # 优点: 不会占用过多的内存
    # 缺点: 在文件修改过程中同一份数据存了两份
    
    import os # 还没学先做了解
​
    with open('db.txt',mode='rt',encoding='utf-8') as read_f,\
            open('.db.txt.swap',mode='wt',encoding='utf-8') as write_f:
        #  =with open('db.txt',mode='rt',encoding='utf-8') as read_f,open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f:---->不需要再加with
        for line in read_f:
            wrife_f.write(line.replace('SB','kevin'))
​
    os.remove('db.txt') # 删除该文件
    os.rename('.db.txt.swap','db.txt') # 重命名

函数简介

l = [1, 2, 3, 4, 5]
​
def my_len():
    n = 0
    for i in l:
        n += 1
    # print(n)
    return n
​
print(my_len())
​
'''
1.我们现在所用的代码方式冗余过多(需要写许多重复代码)
2.所写代码的兼容性太差
​
函数:函数就像个工具箱,什么时候用什么时候取
'''

函数的语法结构

def my_len(a, b):
    '''函数注释'''
    # 函数体
    return '123'
​
​
'''
1.def 就是定义函数的关键字,他不能够省略
2.my_len() 函数名:遵循变量名的命名标准,必须写
3.a,b是函数的参数,可选,可有可无
    参数是执行函数的一些前提条件
4.‘’‘函数注释‘’‘
    不参与函数的执行,只用来解释函数的具体作用和各个参数的作用,可有可无,最好加上
5.#函数体
    函数的核心,是函数所具备的核心功能,应该是必须有的,pass的话是没有意义的函数
6.返回值 return+函数的返回值
    也是可选的,可有可无,但是一般情况下都要有函数返回值
    而且一个函数只能有一个返回值
'''

函数的定义与调用

****************************************************************************************************
1.函数必须先定义后调用,没有定义无法使用
2.函数在定义阶段,只检测语法是否错误,不检测逻辑是否有问题
3.逻辑上的错误只会在调用阶段检测
4.函数一定是被调用之后才会执行函数内部的代码块,不调用函数一定不会执行函数
    # 如何调用函数
    函数名()# 只要函数名加括号,一定会执行函数体代码
    如果在定义阶段有参数,那么在调用的时候,连参数一块写上
    ***************************************************************************************************
​
函数调用的内部原理:
1.现在内存空间中申请一块空间地址来存储函数体代码
2.把函数名和函数体所在的空间地址绑定在一起
3.以后只需要通过函数名()来访问函数代码即可

函数的分类

1.内置的函数
    # python解释器中原本就存在的,可以直接拿来使用,无需定义直接使用
    len print input等
    
2.自定义函数
    # 就是程序员自己写的函数,这个就必须先定义后调用
    1.无参函数:函数在定义阶段没有参数
        def my_len():
            pass
        
        my_len()
        
    2.有参函数:函数在定义阶段有参数的参加
        def my_len(a , b):
                pass
​
            my_len(1,2)
        
    3.空函数----->作用在于梳理业务逻辑
        def my_len(a , b):
                pass
             

你可能感兴趣的:(python,开发语言)