复习
文件的高级应用
打开的高级模式
- r+: 可读可写,指针文件末
- w+: 可读可写,清空文件(极力不推荐)
- a+: 可读可写
文件的高级方法
- seek: 单位字节
- tell: 单位字节
- read(n): 单位字符
- truancate: 单位字节
# with open('test.py', 'rb') as fr:
# fr.seek(1, 0) # 0是从文件头开始,走1个字节
# fr.seek(1, 1) # 1是从当前位置开始,走1个字节
# fr.seek(1, 2) # 2是从文件末开始,走1个字节
# fr.seek(0, 2) # 2是从文件末开始,走1个字节 # 定位到文件末尾
# print(f'fr.tell():{fr.tell()}') # 告诉你当前指针的位置
# print(fr.read()) # 中 --> xe4xb8xad
# with open('test.py', 'a+b') as fa:
# fa.truncate(1)
with open('test.py', 'rt',encoding='utf8') as fr:
print(fr.read(3)) # 3个字符
修改文件的两种方式
# 文件没有修改这一说,只有覆盖
# with open('test.py','r+',encoding='utf8') as fr:
# fr.seek(3)
# fr.write('中')
# fr.flush() # 如果不加flush短暂的停留在内存中,然后再输入硬盘.如果加了会更快速刷入硬盘
with open('test.py', 'r', encoding='utf8') as fr,
open('test_swap.py', 'w', encoding='utf8') as fw:
data = fr.read()
data = data.replace('sb', 'dsb')
fw.write(data)
import os
os.remove('test.py')
os.rename('test_swap.py', 'test.py')
函数的定义
函数定义阶段只检测语法,不执行代码
def 函数名(<参数1,参数2...>):
<代码块>
return <返回值>
函数的调用
def 函数名(<参数1,参数2...>):
<代码块>
return <返回值>
函数名() # 调用阶段才会执行函数体代码
定义函数的三种方式
有参函数
有参数的函数
无参函数
没有参数的函数
空函数
函数体代码是pass
函数的返回值
return
返回返回值, 终止函数, 返回可以是多个(元组的形式返回)
默认返回值是None
def func():
return 1
res = func() # 1
函数的参数
def func(name, age):
print(name, age)
return 1
res = func('nick',18) # 1
形参
具有描述意义
实参
真实存在的一个值
位置形参
从左到右一个一个的写下去
位置实参
从左到右一个一个的传给形参
默认形参
位置形参会有一个默认值, 默认形参必须得写在位置形参后面
关键字实参
按照形参名传值,关键字实参必须得写在位置实参后面
可变长参数
- *
- *args: 接收多余的位置实参
- *(): 打散元组内的元素当做位置实参传给形参
- **
- **kwargs: 接收多余的关键字实参
- **{}:打散字典的元素作为关键字实参传给形参
函数对象
函数名和变量名是等同的
- 引用
- 函数的参数
- 函数的返回值
- 容器类元素
函数的嵌套
def f1():
def f2():
pass
函数的调用
def f1():
pass
f1()
def f2():
f1()
# 函数必须得先定义后调用
名称空间与作用域
内置名称空间
Python解释器的内置方法,如 len/int/float, python解释器启动的时候就有了
全局名称空间
python文件执行的时候生成
局部名称空间
函数调用的时候生成
执行顺序 内置-->全局-->局部
查找顺序 当前位置开始 局部-->全局-->内置
全局作用域
内置+全局
局部作用域
局部
- 全局作用域内的变量(x=1)和局部作用域内的变量(x=1),两个x没有任何关系,只针对不可变类型
- 局部作用域1内变量(x=1)和局部作用域2内变量(x=1),两个x也没有任何关系,只针对不可变类型