文件处理及函数
文件:
f=open('a.txt','r',encoding='utf-8')
一次读一行:
print(f.readline())
消除空格即\n:
print(f.readline(),end='')
print(f.readline(),end='')
读所有:
print(f.readlines())
关闭文件:f.close()
------------------------------------------
动作完成之后可以自动完成关闭操作:
with open('a.txt','r',encoding='utf-8')as f :
pass
================================================
w写操作,文件不存在则新建文件,如果文件存在则覆盖(清空)
f=open('a.txt','w',encoding='utf-8')
f.write('asdf')
-----------------------------------------------------
可以写多行
f=open('a.txt','w',encoding='utf-8')
f.writelines(['a','b','c'])
======================================================
内存用unicode
硬盘用utf-8(保证存储容量用量越小越好),gbk都可以
unicode----》encode(‘utf-8’)-----》bytes
bytes----》decode(‘utf-8’)---》unicode
原则:
字符以什么格式编译的,就要以什么编码解码
PS:
python3中的字符串分为两种
x='egon'存成unicode
y=x.encode('utf-8')存成bytes
python2中字符串也分为两种
x=u'egon'与python3的字符串一样
y='alex' 与python3的bytes一样
---------------------------------------------------
a文本模式的追加,文件存在,不存在则创建
f=open('a.txt','a',encoding='utf-8')
print(f.tell())
查看光标位置tell:
f=open('a.txt','a',encoding='utf-8')
print(f.tell())
52
---------------------------------------------------
拷贝文件方法用b模式读写可以解决视频和文件及图片复制问题
f=open('VN.jpg','rb')
print(f.read())
with open('VN.jpg','rb') as read_f,open('1.jpg','wb') as rewrite_f:
for line in read_f:
rewrite_f.write(line)
--------------------------------------
这是一个拷贝文件的小程序:
import sys
# print(sys.argv)
if len(sys.argv) < 3:
print("Usage:python3 copy.py source.file target.file")
sys.exit()
with open(r'%s'%sys.argv[1],'rb') as read_f,\
open(r'%s'%sys.argv[2],'wb') as write_f:
for line in read_f:
write_f.write(line)
*r代表在windows中把\代表成没有意义
在Windows操作为:python E:\py\课后练习\copy.py E:\py\课后练习\1.jpg E:\py\课后练习\2.jpg
-------------------------------------------------------
都是以字节为参数(文本模式中read会自动解码,只有read可以读字符),seek控制文件中光标移动,tell查看光标位置,truncate从开头到哪一个字节的位置其余位置都除去
seek有三种模式*1模式和2模式只可以在b模式运行(6,0)这个表示从文件开头,(6,1)表示从光标在的字节开始移动6个字节,*(1,2)从文件最后一行切,正数为从文件后面开始,负数为从文件最后往左切
truncate截断文件,
with open('a.txt','r+',encoding='utf-8')as f:
f.truncate(2)
写程序遇到的问题:
1.复杂度增大
2.组织结构不清晰
3.可读性差
代码冗余
可扩展性差
解决问题:
一个函数为了实现一个功能
工具就是具备某一种功能的物件,就是程序中函数的概念
事先准备工具的过程称为函数的定义
遇到特定的场景拿来就用称为函数的调用
函数的分类:
内置函数
自定义函数
函数的使用:
1 先定义阶段(只检测语法错误)
2 在调用阶段
函数的定义语法
def 函数名(参数)
‘注释’
函数体
return 返回值
函数名一般是动词
参数
定义函数的三种模式:
无参:
有参:
空函数:
def bar():
pass
return内部可以有多个return,但是只能执行一次,函数就技术调用,并且会把return后的值作为函数执行的结果返回
return 后面值没有类型限制
函数调用的三种形式:
语句形式:
表达式性形式:
当中另外一个函数的参数:
函数的参数:
形参:在定义函数时,括号内的参数称为形参
特点:形参就是变量名
def foo(x,y): x=1,y=2
print(x)
print(y)
实参:在调用函数时,括号内的参数称为实参
特点:实参就是变量值
foo(1,2)
在调用阶段实参(变量值)才会绑定形参(变量名)
调用结束后,解除绑定
参数的分类:
----------------------------------------------------
位置参数:按照从左到右的顺序依次定义的参数
位置形参:必选参数,多一个不行,少一个不行
位置实参:与形参按照位置一一对应
----------------------------------------------------
def foo(x,y):
print(x)
print(y)
foo(1,2)
----------------------------------------------------
关键字实参:指的是按照x=1的形式,指名道姓的给x
def foo(x,y):
print(x)
print(y)
foo(y=2,x=1)
关键字实参需要注意的问题是:
def foo(x,y,z):
print(x)
print(y)
print(z)
foo(y=2,x=1,z=3)
*位置实参必选在关键字实参的前面
*一定不要对同一个形参传多个值
-------------------------------------------------------
默认形参:在定义阶段就已经为形参赋值,意味在调用阶段就可以形参赋值,可以不用赋值
def foo(x,y=1111):
print(x)
print(y)
foo(1)
效果:
1
1111
def register(name,age,sex='male'):
print(name,age,sex)
register('asb',73)
register('wsb',84)
register('ysb',38)
register('yaya',18,'heihei')
效果:
asb 73 male
wsb 84 male
ysb 38 male
yaya 18 heihei
默认参数需要注意的问题
*默认参数必须放在位置参数之后
*默认参数只在定义阶段赋值!!!一次仅一次
*默认参数的值应该被定义成不可变类型(数字、元祖、字符串)
====================================================================
可变长参数指的是实参的个数不固定
#实参无非位置实参和关键字实参两种
形参必须要有两种机制来分别处理按照位置定义的实参溢出的情况:* 等同于元祖默认*args
def foo(x,y,*args):
print(x)
print(y)
print(meng)
foo(123,456,2344,345,626)
效果:
123
456
(2344, 345, 626)
--------------------------------------------
跟按照关键字定义的实参溢出的情况:**等同于字典 默认kwargs
def foo(x,y,**kwargs):
print(x)
print(y)
print(meng)
foo(x=1,y=2,c=3,r=5)
效果:
1
2
{'c': 3, 'r': 5}
----------------------------------------------
命名关键字参数:在*后面定义的形参称为命名关键字参数,必须是以关键字形式
def foo(name,age,*,sex):
print(name)
print(age)
print(sex)
foo('egon',18,sex='male')
效果:
egon
18
male
----------------------------------------------------------------------------
函数是第一类对象:指的是函数可以被当做数据传递
def foo():
print('from foo')
1.被赋值
f=foo
print(f)
f()
2.可以当做参数传入
def wrapper(func):
print(func)
wrapper(foo())
3.可以当做函数的返回
def wrapper(func):
return func
res=wrapper(foo)
print(res)
*(对本周作业有用)4.可以当做容器类型的元素
cmd_dic={
'func':foo
}
print(cmd_dic)
cmd_dic['func']()
效果:
{'func': <function foo at 0x0000000002023EA0>}
from foo