Python day12:文件处理3+函数基础

一、文件修改的两种方法:


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')

'''
由上例得出结论:硬盘都是用新内容覆盖旧内容,没有修改的概念,但是内存是可以修改的

如何修改文件:
思路:把硬盘的内容先读入内存,然后在内存中修改完毕后,再覆盖到硬盘

方式一:如我们常使用的word,notpad++都是此方法
步骤:
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 sayhi():
    print('*'*10)
    print('hello')
    print('*'*10)

print(sayhi)

'''2、调用函数: 函数名()=> 函数的内存地址(),会触发函数体代码的运行'''
sayhi()
sayhi()
sayhi()

'''二:定义函数的三种格式
2.1: 无参函数'''
def login():
    inp_name=input("your name: ").strip()
    inp_pwd=input("your pwd: ").strip()
    if inp_name == "yang" and inp_pwd == "123":
        print('login successful')
    else:
        print('login error')

login()


def sayhi():
    print('='*100)
    print('hello')
    print('='*100)

sayhi()

'''2.2: 有参函数'''
def sayhi(s,n):
    print(s*n)
    print('hello')
    print(s*n)

sayhi('-',20)
sayhi('*',10)

def max2(x,y):
    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 bar():
    print('from bar')

def foo():
    print('from foo')
    bar()

foo()

'''示范2:'''
def foo():
    print('from foo')
    bar()

def bar():
    print('from bar')

foo()

三、函数参数

'''一:函数的参数分为两大类:
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)位置实参:在函数调用阶段按照从左到右的顺序依次定义实参(传入的变量值),称之为位置实参
特点:按照位置传值,一一对应
'''
def func(x1,x2,x3,x4,x5,x6):
    print(x1,x2,x3,x4,x5,x6)

func(1,2,3,4,5,6)

'''
2、关键字实参:在函数调用阶段按照key=value的形式为指定的形参名传值,该形式称之为关键字实参
特点:在传值时可以完全打乱顺序,但是仍然能够指名道姓地为指定的形参传值
'''
def func(name, age, ):
    print(name, age, )


func("yang",18)
func(18,"yang")

func(age=18,name="yang")
'''
注意:可以混用位置实参与关键字实参,但是
1 位置实参必须放在关键字实参的前面
2 不能为同一个形参重复赋值
'''
def func(name, age, salary):
    print(name)
    print(age)
    print(salary)


func('yang',salary=3.1,age=18)
func('yang',salary=3.1,18) # 错误
func('yang', 18, salary=3.1)  # 错误

func('yang',18,age=19,salary=3.3)

'''
3、默认形参:在函数定义阶段就已经为某个形参赋值,该形参称之为有默认值的形参,简称默认形参
特点: 定义阶段就已经被赋值意味着在函数调用阶段可以不用为其赋值
'''
def func(x,y=2):
    print(x,y)

func(1)
func(1,33333)
'''
注意:
1 默认形参应该放在位置形参的后面
'''
def func(y=2,x): # 错误
    pass
'''
2 默认形参的值通常应该是不可变类型,因为若值是可变类型,我们获取到的是一个id地址,传入值的时候也是通过id,就会导致传的每个值都通过这个id存值,使得所有值都放在了一起
'''
def func(name,hobby,hobbies=[]):
    hobbies.append(hobby)
    print("%s 的爱好是:%s" %(name,hobbies))

func("yang",'play')
func('yang','music')
func("tank",'read')
---------------------------------------
yang 的爱好是:['play']
yang 的爱好是:['play', 'music']
tank 的爱好是:['play', 'music', 'read']
'''
要实现以上单独存的功能,应该把hobbies放到函数里面定义
'''
def func(name,hobby,hobbies=None):
    if hobbies is None:
        hobbies=[]
    hobbies.append(hobby)
    print("%s 的爱好是:%s" %(name,hobbies))

func("yang",'play')
func('yang','music')
func("tank",'read')
------------------------------------
yang 的爱好是:['play']
yang 的爱好是:['music']
tank 的爱好是:['read']
'''
3 默认形参的值只在函数定义阶段被赋值一次,函数定义之后的改变对默认形参没有影响
'''
m=333
def func(x,y=m): # y=333
    print(x,y)

m=444
func(1)


def register(name,age,gender='male'):
    print(name)
    print(age)
    print(gender)

register('yang',18,)
register('jack',20,)
register('mary',18,'female')

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容