Python编程基础_03

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
'''
基础使用
'''
# 必须先载入函数才能调用
def select_func():
print('test')
select_func()
def trapezoidal_area(a, b, h):
'''第一行一般写说明',养成良好的编程习惯
此函数为计算梯形面积,a b h,上底下底高;
'''
return ((a + b) * h / 2)
print(trapezoidal_area(1, 2, 3))
'''
局部变量和全局变量
'''
a = 100 # 定义一个全局变量
def test(h):
global a # 全局变量在函数里不声明不能修改,但可以调用
a = 50
b = 200 # 此处是局部变量
print(h, a, b)
test(1)
test(trapezoidal_area(1, 2, 3)) # 函数可以进行嵌套
print(a)
'''
返回类型
'''
def return_num():
return 1, 2
print(type(return_num())) # 返回多个值的时候默认是元组类型
print(return_num())
'''
缺省参数
'''
def user_info(name, gender, age=18): # 可以提前定义默认值,这样传参没有该参数的时候不会报错,直接使用默认参数
print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')
user_info('Rose', gender='女') # 有默认值可以不传参
user_info('小明', gender='男', age=16) # 函数调用,通过“键=值”形式加以指定。这样没有顺序需求。
'''
不定长参数
不定长参数也叫可变参数。
用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。
此时,可用包裹(packing)位置参数
或者包裹关键字参数,来进行参数传递,会显得非常方便。
'''
#包裹位置传递
def user_info02(*args):
print(args)
# ('TOM',)
user_info02('TOM')
# ('TOM', 18)
user_info02('TOM', 18)
# 包裹关键字传递
def user_info03(**kwargs):
print(kwargs)
print(type(kwargs)) # 字典类型
# {'name': 'TOM', 'age': 18, 'id': 110}
user_info03(name='TOM', age=18, id=110)
# 以上两个都是组包的过程
def return_num():
return 100, 200
num1, num2 = return_num()
print(num1) # 100
print(num2) # 200
# 拿到数据后可以进行解包
num1, num2 = num2, num1
print(num1) # 200
print(num2) # 100
# python交换数据时除了常用的中间变量法,可以直接进行交换
#斐波那契数列
def fn(n):
if n == 1 or n == 2:
return 1
re = {1: 1, 2: 1}
for i in range(3, n + 1):
re[i] = re[i - 1] + re[i - 2]
return re[n]
print(fn(9))
'''
所谓可变类型与不可变类型是指:数据能够直接进行修改,如果能直接修改那么就是可变,否则是不可变.
可变类型
列表
字典
集合
不可变类型
整型
浮点型
字符串
元组
'''
# lambda函数实现
fn1 = lambda a, b: a + b # 一行写完,不换行
print(fn1(1, 2))

文件操作

  • 打开文件的模式

模式

描述

r

以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。

rb

以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。

r+

打开一个文件用于读写。文件指针将会放在文件的开头。

rb+

以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。

w

打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

wb

以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

w+

打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

wb+

以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

a

打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

ab

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。

a+

打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。

ab+

以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

补充:操作文本文件,如txt用普通方式打开即可。操作图片、音频、视频文件则用带b的二进制模式打开。

  • 基本使用结构
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def demo01():  # 基本操作
# 1. 打开文件
f = open('C:/Users/Administrator/Desktop/test.txt', 'w+') # 可以是相对路径也可以是绝对路径
# 2. 文件写入
f.write('hello world001\nhello world002\nhello world003')
print(f.tell()) # 返回当前读取文件指针所在的位置,以数字返回。
# 4. 移动指针
f.seek(0) # 微调读取文件的指针:第二个参数0表示从开头开始读,第一个参数2表示从头开始跳 2个字节后开始读。
print(f.tell())
# 5. 读入文件
print(f.readline()) # 每次只读一行.
f.seek(0)
print(f.readlines()) # 读取所有文件,按一行读取,以列表形式返回,每一行为列表的一个元素。
f.seek(0)
print(f.read()) # 读取文件的所有内容,以字符串形式返回。
# 6. 关闭文件
f.close()
demo01()
'''
seek() 方法用于移动文件读取指针到指定位置。
fileObject.seek(offset[, whence])
参数
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数,如果是负数表示从倒数第几位开始。
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。
'''

注意:

  1. wa模式:如果文件不存在则创建该文件;如果文件存在,w模式先清空再写入,a模式直接末尾追加。
  2. r模式:如果文件不存在则报错。
  • 例子:备份文件
1
2
3
4
5
6
7
8
9
10
11
12
13
def backup(path):
'在文件所在目录备份一个文件,并在文件头部加上备份二字,文件名后面加上[备份]'
tup01 = path.partition('.')
new_path = tup01[0] + '[backup]' + tup01[1] + tup01[2]
f1 = open(path, 'a+')
f2 = open(new_path, 'w+')
f1.seek(0)
temp = f1.read()
f2.write(temp)
f1.close()
f2.close()
return 'ok'
backup("C:/Users/Administrator/Desktop/test.txt")