今日内容:*****
1、文件修改的两种方式
2、函数基本的使用
先定义
后使用
3、定义函数的三种形式
4、调用函数的三种形式
5、函数的参数
# 文件修改的方式
# with open('a.txt',mode='r+t',encoding='utf-8') as f:
# print(f.writable())
# f.seek(7,0)
# f.write('SB')
# with open('a.txt',mode='r+t',encoding='utf-8') as f:
# f.seek(3,0)
# f.write('h')
# 由上例得出结论:硬盘都是用新内容覆盖旧内容,没有修改的概念,但是内存是可以修改的
# 如何修改文件:
# 思路:把硬盘的内容先读入内存,然后在内存中修改完毕后,再覆盖会硬盘
# 方式一:
# 步骤:
# 1、先将硬盘中文件的内容全部读入内存,然后在内存中修改完毕得到一个修改好的结果
# 2、将修改的结果覆盖回原文件
# 优点: 不耗费硬盘
# 缺点:耗费内存
# with open('a.txt',mode='rt',encoding='utf-8') as f1:
# data=f1.read()
# res=data.replace('lxx','SB')
#
# with open('a.txt',mode='wt',encoding='utf-8') as f2:
# f2.write(res)
# 方式二:
# 步骤:
#1、循环读取源文件内容,一行行修改一行行写入一个新的临时文件
#2、删除源文件
#3、将临时文件重命名为源文件名
# 优点:节省内存
# 缺点:耗费硬盘空间
# import os
# with open('a.txt',mode='rt',encoding='utf-8') as f1,\
# open('.a.txt.swp',mode='wt',encoding='utf-8') as f2:
# for line in f1:
# res=line.replace('SB','lxx')
# f2.write(res)
#
# os.remove('a.txt')
# os.rename('.a.txt.swp','a.txt')
'''
1、什么是函数
具备某一功能的工具===》函数
工具的使用:
事先准备好工具==========》函数的定义
遇到应用场景拿来就用====》函数的调用
2、为何要有函数
1、程序的组织结构不清晰,可读性差
2、如果要用到重复的功能,只能拷贝功能的实现代码=》代码冗余
3、可扩展性差
3、如何用函数
函数的使用原则:先定义,后调用
定义函数:
def 函数名(参数1,参数2,参数3,...):
"""文档注释"""
代码1
代码2
代码3
...
return 返回值
调用函数:
函数名(值1,值2,值3,...)
'''
# 一:函数的基本使用
# 1、定义函数:申请内存空间把函数体代码保存下来,然后把内存地址绑定给函数名-》函数名=函数的内存地址
#
# def fun(): ## print函数时,不加括号则输出函数地址,加括号则是调用
# print(3)
# # return
# # print(fun) # <function fun at 0x0000015CC4CA51F0> (地址)
# # print(fun()) # None (返回值)
# 2、调用函数: 函数名()=> 函数的内存地址(),会触发函数体代码的运行
# fun()
# 二:定义函数的三种格式
# 2.1: 无参函数
# def login():
# inp_name=input("your name: ").strip()
# inp_pwd=input("your pwd: ").strip()
# if inp_name == "egon" and inp_pwd == "123":
# print('login successful')
# else:
# print('login error')
#
# login()
# 2.2: 有参函数
# def sayhi(s,n):
# # s = '-'
# # n = 20
# print(s*n)
# print('hello')
# print(s*n)
#
# sayhi('-',20)
# sayhi('*',10)
# def max2(x,y):
# # x=10
# # y=20
# if x > y:
# print(x)
# else:
# print(y)
#
# max2(10,20)
# max2(11,22)
# 2.3: 空函数
# def func():
# pass
# 三:函数的调用
# return:
# 函数内可以有多个return,但只要执行一次函数就立刻结束,并会把return后的值当作本次调用的结果返回
# 函数可以有三种形式的返回值
# 1、return 值:返回的就是该值本身
# 2、return 值1,值2,值3:返回一个元组
# 3、没有return:默认返回None
# def max2(x, y):
# if x > y:
# return x
# else:
# return y
#
#
# res=max2(1.1,3.3)
# print(res * 12 )
# 四:函数调用的三种格式
# 4.1 语句形式:单纯地调用一下函数就完了
# def sayhi(s, n):
# print(s*n)
# print('hello')
# print(s*n)
#
# sayhi('*',30)
# 4.2 表达式形式:
# def max2(x,y):
# if x > y:
# return x
# else:
# return y
#
# res=max2(11,22) * 12
# print(res)
# 4.3 可以把函数的调用当作值传给另外一个函数
# print(max2(11,22))
# 总结:
# 函数的使用一定要分两个阶段去看:
# 1、定义阶段:只检测语法,不执行代码
# 2、调用阶段:执行函数体代码
# 如果发生的语法错误,定义阶段就会立马检测出来
# def func():
# print("hello"
# 如果发生的不是语法错误,而是逻辑错误,只能在调用阶段检测到
# def func():
# xxx
#
# func()
# 一:函数的参数分为两大类:
# 1、形参:在'定义'函数时,括号内定义的变量名,称之为形式参数,简称形参=》变量名
# def func(x,y):
# x=1
# y=2
# print(x)
# print(y)
# 2、实参:在'调用'函数时,括号内传入的值,称之为实际参数,简称实参=》变量值
# func(1,2)
# 二:在python中参数的种类
# 1、位置参数:
# (1)位置形参:在函数定义阶段按照从左到右的顺序依次定义形参(变量名),称之为位置形参
# 特点:必须被传值,有几个参数就要传几个值,多一个或少一个都不行
# def func(x,y):
# print(x,y)
# func(1,2)
# func(1) # 少一个不行
# func(1,2,3) # 多一个也不行
# (2)位置实参:在函数调用阶段按照从左到右的顺序依次定义实参(传入的变量值),称之为位置实参
# 特点:按照位置传值,一一对应
# func(1,2,3,4,5,6)
# 2、关键字实参:
# 在函数调用阶段按照key=value的形式为指定的形参名传值,该形式称之为关键字实参
# 特点:在传值时可以完全打乱顺序,但是仍然能够指名道姓地为指定的形参传值
# def func(name, age, ):
# print(name, age, )
# func(age=18,name="egon")
# 注意:可以混用位置实参与关键字实参,但是
# 1 位置实参 必须放在 关键字实参 的 前面 <-----
# 2 不能为同一个形参重复赋值
# def func(name, age, salary):
# print(name)
# print(age)
# print(salary)
# func('egon',salary=3.1,age=18)
# func('egon',salary=3.1,18) # 错误
# func('egon', 18, salary=3.1)
# func('egon',18,age=19,salary=3.3)
# 3、默认形参:
# 在函数定义阶段就已经为某个形参赋值,该形参称之为有默认值的形参,简称默认形参
# 特点: 定义阶段就已经被赋值,在函数调用阶段'可以'不用为其赋值,也可以重新赋值
# def func(x,y=2):
# print(x,y)
# func(1) # 1 2
# func(1,33333) # 1 33333
# 注意:
# 1 默认形参应该放在位置形参的后面
# def func(y=2,x): # 错误
# pass
# 2 默认形参的值通常应该是不可变类型
# def func(name,hobby,hobbies=[]):
# hobbies.append(hobby)
# print("%s 的爱好是:%s" %(name,hobbies))
# func("egon",'play')
# func('lili','music')
# func("jack",'read')
# def func(name,hobby,hobbies=None):
# if hobbies is None:
# hobbies=[]
# hobbies.append(hobby)
# print("%s 的爱好是:%s" %(name,hobbies))
# func("egon",'play')
# func('lili','music')
# func("jack",'read')
#3 默认形参的值只在函数定义阶段被赋值一次,函数定义之后的改变对默认形参没有影响
# m = 333
# def func(x, y = m): # y=333
# print(x, y)
#
# m=44444
# func(1) # 1 333
# def register(name,age,gender='male'):
# print(name,age,gender)
#
# register('egon',18,)
# register('jack',20,)
# register('tom',21,)
# register('aabb',18,'female')
# 作业
# def change(filepath, old, new):
# import os
# with open(r'%s' % filepath, mode='rt', encoding='utf-8') as f1, \
# open(r'.%s.swp' % filepath, mode='wt', encoding='utf-8') as f2:
# for line in f1:
# s = line.replace('%s' % old, '%s' % new)
# f2.write(s)
# os.remove('%s' % filepath)
# os.rename('.%s.swp' % filepath, '%s' % filepath)
#
#
# change('xxx.txt', 666, 777)
# import time
#
# with open(r'F:\notepad\2020.7.01\day11\access.log', mode='rb') as f:
# f.seek(0, 2)
# while True:
# line = f.readline()
# if len(line) == 0:
# time.sleep(1)
# else:
# print(line.decode('utf-8'), end='')
"""
# 登录功能
def login():
inp_username = input('请输入用户名:')
inp_password = input('请输入密码:')
with open('users.txt', mode='rt') as f:
for line in f:
username, password = line.strip('\n').split(':')
if inp_username == username and inp_password == password:
print('登录成功')
break
else:
print('用户名或密码错误')
# login()
# 注册功能
def register():
l = [] # 存放已注册的用户名
with open(r'users.txt', mode='rt') as f:
for line in f:
username, password = line.strip().split(':')
l.append(username)
flag = True
while flag:
inp_username = input('请输入你想注册的用户名:').strip()
if inp_username in l: # 判断用户名是否重复
print('用户名已存在,请重新输入')
continue
else:
inp_password = input('请设置密码:').strip()
with open(r'users.txt', mode='at', encoding='utf-8') as f1:
writeline = '%s:%s\n' % (inp_username, inp_password)
f1.write(writeline)
print('注册成功')
break
# register()
while True:
operation = int(input('''
请输入要进行的操作:
1、注册
2、登录
0、退出
'''
))
if operation == 1:
register()
elif operation == 2:
login()
elif operation == 0:
print('再见')
break
else:
print('输入错误,请重新输入')
continue
"""