文件修改的两种方式,函数,函数的参数

一.文件修改的两种方式

错误示范:

with open('a.txt',mode='r+t',encoding='utf-8')as f:
	print(f.writable())
	f.seek(7,0)
	f.write('bb')

with open('a.txt','r+t',encoding='utf-8')as f:
	f.seek(3,0)
	f.write('h')

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

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

方式一:

步骤:
1.先将硬盘中文件的内容全部读入内存,然后在内存中修改完毕
2.将修改的结果覆盖回原文件

优点:不耗费硬盘
缺点:耗费内存

with open('b.txt',mode='rt',encoding='utf-8')as f:
	data=f.read()
	res=data.replace('bbb','aaa')
with open('b.txt',mode='wt',encoding='utf-8')as f2:
	f2.write(res)

方式二:

步骤:
1.循环读取原文件内容,一行行修改写入一个新的临时文件
2.删除原文件
3.将临时文件重命名为原文件名

优点:节省内存
缺点:耗费硬盘空间

import os
with open('b.txt',mode='rt',encoding='utf-8')as f1,\
	open('.b.txt.swap',mode='wt',encoding='utf-8')as f2:
	for line in f1:
		res = line.replace('aaa','bbb')
		f2.write(res)
os.remove('b.txt')
os.rename('.b.txt.swap','b.txt')

二.函数

(1).什么是函数

具备某一功能的工具-------->函数

工具的使用:
事先准备好工具—>函数的定义
遇到应用场景拿来就用---->函数的调用

(2).为何要有函数

①程序的组织结构不清晰,可读性差
②如果要用到重复的功能,只能拷贝功能的实现代码—>代码冗余
③可扩展性差

(3).如何用函数

函数的使用原则:先定义,后调用

基本语法:

# 定义函数:
def 函数名(参数1,参数2,参数3,...):
	'''文档注释'''
	代码1
	代码2
	代码3
	...
	return 返回值
# 调用函数:
函数名(1,2,3,...)

1.函数的基本使用

定义函数:申请内存空间把函数体代码保存下来,然后把内存地址绑定给函数名–>函数名=函数的内存地址

def sayhi():
	print('*'*10)
	print('hello')
	print('*'*10)
print(sayhi)  # <function sayhi at 0x0000020D660351F0>

调用函数:函数名() --> 函数的内存地址(),会触发函数体代码的运行

sayhi()
sayhi()
sayhi()

2.定义函数的三种格式

无参函数

def login():
	name=input('your name: ').strip()
	pwd=input('your pwd: ').strip()
	if name == 'juanfu' and pwd == '123':
		print('login successful')
	else:
		print('login error')

login()

def sayhi():
	print('*'*10)
	print('hello')
	print('*'*10)
sayhi()

有参函数

def sayhi(s,n):
	# s = '-'
	# n = 20
	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)

空函数

def func():
	pass

3.函数的调用

return:
函数内可以有多个return,但只要执行一次函数就立刻结束,并会把return后的值当做本次调用的结果返回

函数内可以有三种形式的返回值
①return 值:返回的就是该值本身
②return 值1,值2,值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.函数调用的三种格式

语句形式:单纯地调用一下函数就完了

def sayhi(s,n):
	print(s*n)
	print('hello')
	print(s*n)
sayhi('*',30)

表达式形式

def max2(x,y):
	if x > y:
		return x
	else:
		return y
res = max2(11,22) * 12
print(res)

可以把函数的调用当做值传给另外一个函数

print(max(11,22))

总结:

函数的使用一定要分两个阶段去看:
①定义阶段:只检测语法,不执行代码
②调用阶段:执行函数体代码

如果发生语法错误,定义阶段就会立马检测出来

def func():
	print('hello'

如果发生的不是语法错误,而是逻辑错误,只能在调用阶段检测到

def func():
	xxx
func()

示范一:

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

示范二:

def foo():
	print('from foo')
	bar()  
# bar()在foo定义处,bar函数定义之后,才调用foo,接着调用函数bar,因此可以正常运行
def bar():
	print('from bar')
foo()

三.函数的参数

(1).函数的参数分为2大类:

形参:在定义函数时,括号内定义的变量名,称之为形式参数,简称形参==>变量名

def func(x,y):
	# x = 1
	# y = 2
	print(x)
	print(y)

实参:在调用函数式时,括号内传入的值,称之为实际参数,简称实参==>变量值

func(1,2)

(2).在python中参数的种类

1.位置参数:

①位置形参:在函数定义阶段按照从左到右的顺序依次定义形参(变量名),称之为位置形参
特点:必须被传值

def func(x,y):
	print(x,y)
# func(1,2)
# func(1)  # 少一个不行
# func(1,2,3)  # 多一个也不行

②位置实参:在函数调用阶段按照从左到右的顺序依次定义实参(传入的变量值),称之为位置实参
特点:按照位置传值,一一对应

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

2.关键字实参:

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

def func(name,age):
	print(name,age)
	
# func('egon',18)
# func(18,'egon')

func(age=18,name='egon')

注意:可以混用位置实参与关键字实参,但是:
①位置实参必须放在关键字实参的前面
②不能为同一个形参重复赋值

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)
func(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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值