函数篇:函数简介、函数语法结构、文件内光标的移动和修改

2022.3.15笔记总结

  • 文件内光标的移动
  • 文件的修改
  • 函数简介
  • 函数的语法结构

一、文件内光标的移动

1、read()后光标的移动

(1)文本模式

with open(r'a.txt', 'r', encoding= 'utf8') as f:
	print(f.read())  # 执行完后光标移动到末尾
    f.read(3)  # 表示在当前光标位置向后读三个字符

(2)二进制模式

with open(r'a.txt', 'rb') as f:
    print(f.read(9).decode('utf8'))  # 读取9个字节并解码
注意:二进制模式下read加数字表示读取指定的字节数

结合之前所学的知识,我们知道,unicode所有的字符是用2bytes起步表示字符,而utf8中文用3bytes英文是用1bytes表示...

2、控制光标的移动

f.seek(offset(位移量),whence(模式))

offset:正数是控制光标向右移动,负数是控制光标向左移动,移动的最小单位是字节

whence:

(1)0模式:表示光标以开头为参考系,即光标直接移动到开头

注意:0模式支持t和b两种模式,而1、2模式仅支持b模式

(2)1模式:表示光标停留在当前位置

(3)2模式:表示光标以文件结尾为参考系,即光标直接移动到结尾

f.seek(3,0)  # 即光标在开头位置向后移动3个bytes
f.seek(3,1)  # 即在b模式下光标在当前位置向后移动3个bytes.
f.seek(-3,2)  # 即在b模式下光标在文件结尾向前移动3个bytes

注意:seek括号内不写模式 默认是0模式 基于文件开头 并且兼容文本和二进制

二、文件的修改

了解知识:

'''
数据在普通硬盘上是通过类似于光刻的方式记录在硬盘上,当你需要修改的时候可能是将原来的一块内容删除然后重新记录,另外删除完文件后,原来文件的位置相当于成为自由态,但是如果没有新的数据写入,那么这块位置的数据有可能可以通过技术手段复原
'''

1、replace()

那么文件的内容如何修改呢,这里我们也可以使用之前学过的修改命令replace():

with open(r'path', 'r', encoding='utf8') as f:
    data = f.read()  # 将读取的内容赋值给变量data
with open(r'path', 'w', encoding='utf8') as f:
    f.write(data.replace('原来数据', '修改后数据'))  

这种方式其实是将原来文件数据读入内存,然后修改完之后再返回原文件,但是这种方法会过多占用内存

2、创建临时文件替换

import os
with open('a.txt', 'r', encoding='utf8') as f,\
		open('.a.txt.swap', 'w', encoding='utf8') as f2:
    for line in f:
        f2.write(line.replace('原来数据', '修改后数据'))
os.remove('a.txt')  # 删除文件
os.remove('.a.txt.swap', 'a.txt')  # 重命名文件 

这种方式虽然没有过多占用内存,但是修改过程中存了两份文件

三、函数简介

1、函数概念

函数其实是python语言中一个功能模块,包括自有函数和自定义函数,函数可以看成程序员自己定义好的功能,可以随时拿来使用,像是工程人员的工具箱

2、函数与循环的区别

循环:只能在一个地方反复执行相同的代码

函数:可以在多处位置反复执行相同的代码

3、函数的定义与调用

def 函数名():
    pass  # 函数必须先定义然后才能调用
'''
注意:
1.定义阶段函数只检测语法不执行代码,关键字语法错误才会报错
2.如果定义时括号内有参数,那么调用也需要有参数
'''

四、函数的语法结构

def 函数名(参数1,参数2):
    '''关于该函数的注释'''
    函数体代码  # 函数的灵魂所在,相当于函数的内部逻辑
    return  #返回值

(1)def:定义函数的关键字,必须写def才能定义函数

(2)函数名:函数名类似于变量名,函数的命名风格与规范和变量名是一样的

(3)括号:定义函数时,函数名后面必须写括号,括号里可以没有内容,也可以写上单个或者多个参数

(4)参数:在使用定义好的函数时需要使用函数的人向函数内部传递数据来达成某种条件,才能正常使用函数,参数是选写的内容

(5)冒号:定义函数也需要有缩进的代码块

(6)函数注释:对函数功能以及使用方法的解释说明

(7)函数体代码:函数的核心功能,决定函数的运行逻辑和结果

(8)return:返回值,后面跟什么,执行完函数后就会返回什么

注意:定义函数时只会检测语法,并不会报错,但是在使用函数时就会报错,另外如果在定义函数时有关键字语法错误也会报错。

五、作业

练习注册登录功能代码,也可以尝试使用函数

def storge(path1, name, path2, pwd):
    '''将文本数据存储数据到指定路径中,若此路径不存在则新建文件用于存储
    path1/path2;路径,必须是字符串类型
    '''
    with open(r'%s' % path1, 'a', encoding='utf8') as f:
        f.write(f'{name}\n')
    with open(r'%s' % path2, 'a', encoding='utf8') as f:
        f.write(f'{pwd}\n')
    return print('存储成功!')


def take(path, ):
    '''从某个文件取相关数据并组成一个列表
    path:文件路径
    list:表格变量名
    '''
    list = []
    with open(r'%s' % path, 'r+t', encoding='utf8') as f:
        for line in f:
            list.append(line)
    return list


storge('user_name.txt', '', 'user_pwd.txt', '')
print(take('user_name.txt'))
a = take('user_name.txt')  # 调用函数,创造一个列表
b = take('user_pwd.txt',)
tag = True
while tag:
    print('''
    用户登录系统
    ------------------------------
    1.注册
    2.登录
    ------------------------------
    ''')
    choice = input('请输入功能编号>>>:')
    if choice == '1':
        print('请按照提示输入注册信息')
        username = input('输入用户名>>>:')
        for k in 'i':
            if username == k.strip('\n'):
                print('用户名已存在')
        else:
            password = input('输入密码>>>:')
            storge('user_name.txt', username, 'user_pwd.txt', password)  # 分别存储用户名和密码到两个文件
    elif choice == '2':
        username = input('输入用户名>>>:')
        password = input('输入密码>>>:')
        for k in a:  # 在函数生成的列表里面循环
            if username == k.strip('\n'):
                for l in b:
                    if password == l.strip('\n'):
                        print('登陆成功')
                        tag = False
                else:
                    print('用户名或密码错误')

    else:
        print('指令错误,请重新输入!')

posted @ 2022-03-15 18:44  马氵寿  阅读(283)  评论(0)    收藏  举报