一、文件处理
二、函数知识结构
三、初级函数
四、命名空间,作用域
一、文件处理
1.文件操作的过程:
1. 打开文件,得到文件句柄并赋值给一个变量
2. 通过句柄对文件进行操作
3. 关闭文件
实际操作:
1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r (一般选择字符集是根据,文件保存时的字符集而定的)
2. 通过句柄对文件进行操作
data=f.read()
3. 关闭文件
f.close()
注意:
一般打开文件时,会调用系统的文件资源以及内存中的变量资源,所以在执行完文件后一定要执行f.close()和del f,而且删除变量一定要在文件关闭之后执行,否则丢失变量会导致文件一直打开,白白占用系统的资源。
SO建议使用with上下文来处理文件,在with执行结束后,系统会自动回收打开的相应资源
with open('a.txt','w') as f:
pass
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data=read_f.read()
write_f.write(data)
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,那么打开文件的默认编码很明显是操作系统决定,在windows下是gbk,在linux下是utf-8。更具需要改变打开文件的字符集防止乱码
在python2中的file与python3中的open()的用法是一至的。
2.打开文件的方式有哪些种
‘r’ 默认的方式,已读的方式打开文件
‘w’以写的方式,打开文件。在文件不存在时创建文件,但是在文件存在时,会覆盖文件中的内容
‘a’以写的方式,打开文件。在文件不存在时创建文件,在文件存在时,会追加到文件的末尾
3.打开非文本文件时的打开方式(用法同上述用法,不过想在打开的文件默认是以字节为单位,这样就可以使用类似.mp3,.gpt的文件了)
‘rb’
‘wb’
'ab'
4.X代表可以写的方法
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+, 写读【可读,可写】
x, 只写模式【不可读;不存在则创建,存在则报错】
x+ ,写读【可读,可写】
5.文件处理的使用方式
#掌握
f.read() #读取所有内容,光标移动到文件末尾
f.readline() #读取一行内容,光标移动到第二行首部
f.readlines() #读取每一行内容,存放于列表中
f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符
f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符
f.writelines(['333\n','444\n']) #文件模式
f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式
#了解
f.readable() #文件是否可读
f.writable() #文件是否可读
f.closed #文件是否关闭
f.encoding #如果文件打开模式为b,则没有该属性
f.flush() #立刻将文件内容从内存刷到硬盘
f.name
练习,利用b模式,编写一个cp工具,要求如下:
1. 既可以拷贝文本又可以拷贝视频,图片等文件
2. 用户一旦参数错误,打印命令的正确使用方法,如usage: cp source_file target_file
提示:可以用import sys,然后用sys.argv获取脚本后面跟的参数
import sys
source,dest=sys.argv[1],sys.argv[2]
if len(sys.argv) != 3:
print("uasge bad"
sys.exit()
with open(source,'rb') as read_f,open(dest,'wb') as wirte_f:
for line in read_f: #在打开文件时已近将读完的值交给了read_f了,所以不用再read一次了
wirte_f.write(line)
5.文件内光标移到
read(3)
在打开的是文本文件时,读取3个字符,当打开的文件模式为b时,代表读取3个字符
文件内光标移动用法有seek,tell,truncate
seek有三种模式:
0代表从文件开头时
1代表从当前位置开始
2 代表从文件末尾开始
with open('test.txt','rb') as f:
f.seek(0,2)#0表示从文件开头开始,2代表移动两个字符
truncate代表截取文件
6.文件修改
在修改文件时,我们理所当然的以为修改文件就是直接从硬盘中调取文件,直接修改。但其实是将文件调用到内存中修改后生成交换文件。删除硬盘上的老文件,替换新文件。
重点.在我们修改文件时要是有较大的文件会将内存沾满,so我们可以一行行的读
import os
with open('userout.txt','r') as f,open('a.txt','w') as a:
for line in f:
line=line.replace("a",'b')
a.write(line)
os.remove('userout.txt')
os.rename('a.txt','userout.exe')
二、函数知识结构
#1、内置函数
为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数即内置函数。对于内置函数,我们可以拿来就用而无需事先定义,如len(),sum(),max()
ps:我们将会在最后详细介绍常用的内置函数。
#2、自定义函数
很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,以后,在遇到应用场景时,调用自定义的函数即可。
如何设置函数
#语法
def 函数名(参数1,参数2,参数3,...):
'''注释'''
函数体
return 返回的值
理论:
函数的使用原则是先定义后调用,函数在定义阶段,会检查函数体的语法问题。但不会出来逻辑上的问题;
定义函数一般有三中形式无参、有参、空函数,更具用户的需要制定。一般空函数用来 构造框架。函数五return
值时返回NONE,多个值时用,隔开。最后会以元组的形式展现
三、函数基础
调用函数的方法:
函数名()
参数的使用方式:
#1、位置参数:按照从左到右的顺序定义的参数
位置形参:必选参数
位置实参:按照位置给形参传值
#2、关键字参数:按照key=value的形式定义的实参
无需按照位置为形参传值
注意的问题:
1. 关键字实参必须在位置实参右面
2. 对同一个形参不能重复传值
#3、默认参数:形参在定义时就已经为其赋值
可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)
注意的问题:
1. 只在定义时赋值一次
2. 默认参数的定义应该在位置形参右面
3. 默认参数通常应该定义成不可变类型
#4、可变长参数:
可变长指的是实参值的个数不固定
而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs
===========*args===========
def foo(x,y,*args):
print(x,y)
print(args)
foo(1,2,3,4,5)
def foo(x,y,*args):
print(x,y)
print(args)
foo(1,2,*[3,4,5])
def foo(x,y,z):
print(x,y,z)
foo(*[1,2,3])
===========**kwargs===========
def foo(x,y,**kwargs):
print(x,y)
print(kwargs)
foo(1,y=2,a=1,b=2,c=3)
def foo(x,y,**kwargs):
print(x,y)
print(kwargs)
foo(1,y=2,**{'a':1,'b':2,'c':3})
def foo(x,y,z):
print(x,y,z)
foo(**{'z':1,'x':2,'y':3})
===========*args+**kwargs===========
def foo(x,y):
print(x,y)
def wrapper(*args,**kwargs):
print('====>')
foo(*args,**kwargs)
#5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递
可以保证,传入的参数中一定包含某些关键字
def foo(x,y,*args,a=1,b,**kwargs):
print(x,y)
print(args)
print(a)
print(b)
print(kwargs)
foo(1,2,3,4,5,b=3,c=4,d=5)
结果:
2
(3, 4, 5)
3
{'c': 4, 'd': 5}
四、名称空间和作用域
名称空间:存放名字的地方,三种名称空间,(之前遗留的问题x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方)
名称空间的加载顺序
#1、python解释器先启动,因而首先加载的是:内置名称空间
#2、执行test.py文件,然后以文件为基础,加载全局名称空间
#3、在执行文件的过程中如果调用函数,则临时产生局部名称空间
名称空间的查找顺序与加载顺序刚好相反
1.函数内部定义
2.基于文件基础定义
3.python内置
作用域即范
- 全局范围(内置名称空间与全局名称空间属于该范围):全局存活,全局有
- 局部范围(局部名称空间属于该范围):临时存活,局部有效
global和nonlocal关键字
global可以将函数中的自定义的变量定义为全局变量
nonlocal可以将嵌套函数中的上级函数中定义的变量申明到本层函数中使用