Python基础学习笔记(二)
第五章
函数的初体验
- 函数: 是组织好的,可重复使用的,用来实现特定功能的代码段。
1 | # 需求:统计字符申的长度,不使用内置函数Len() |
案例 函数基础定义
1 | 函数的定义: |
1 | # 定义一个函数,输出相关信息 |
函数的传入参数
- 传入参数的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据
1
2
3
4
5
6#定义2个数相加的函数,通过参数接收被计算的2个数字
def add(x,y):
result = x + y
print(f"{x} + {y} 的计算结果是: {result}")
# 调用函数,传入被计算的2个数字
add(5,6) - 练习案例: 升级版自动查核酸
定义一个函数,名称任意,并接受一个参数传入(数字类型,表示体温)
在函数内进行体温判断(正常范围:小于等于37.5度),并输出如下内容:1
2
3
4
5
6
7
8
9
10# 定义函数,接收1个形式参数,数字类型,表示体温
def check(num):
# 在函数体内进行判断体温
print("欢迎来到python! 请出示您的健康码以及72小时核酸证明,并配合测量体温!")
if num <= 37.5:
print(f"体温测量中,您的体温是: {num}度,体温正常请进!")
else:
print(f"体温测量中,您的体温是: {num}度,需要隔离!")
# 调用函数,传入实际参数
check(37.1)
函数的返回值定义语法
- 函数在执行完成后,返回给调用者的结果(使用关键字:
return
来返回结果)1
2
3
4
5
6
7
8
9
10# 定义一个函数,完成2数相加功能
def add(a,b):
result = a + b
# 通过返回值,将相加的结果返回给调用者
return result
# 返回结果后,还想输出一句话
print("我完事了")
# 函数的返回值,可以通过变量去接收并
r = add(5,6)
print(r)
函数返回值之None类型
Python中有一个特殊的字面量: None,其类型是:<class’NoneType’>:无返回值的函数,实际上就是返回了: None这个字面量
1 | # 无return语句的函数返回值 |
函数的说明文档
- 我们可以给函数添加说明文档,辅助理解函数的作用
语法如下:1
2
3
4
5
6
7
8
9def func(x,y) :
"""
函数说明
:param x:形参x的说明
:param y: 形参y的说明
:return: 返回值的说明
"""
函数体
return 返回值 - 通过多行注释的形式,对函数进行说明解释
1
2
3
4
5
6
7
8
9
10
11
12
13# 定义函数,进行文档说明
def add(x, y):
"""
add函数可以接收2个参数,进行2数相加的功能
:param x:形参x表示相加的其中一个数宁
:param y:形参y表示相加的另一个数宇
:return: 返回值是2数相加的结果
"""
result = x + y
print(f"2数相加的结果是:{result}")
return result
add (5,6)
函数的嵌套使用
- 所谓函数嵌套调用指的是一个函数里面又调用了另外一个函数
1
2
3
4
5
6
7
8
9
10
11
12
13# 定义函数func_b
def func_b():
print("---2---")
# 定义函数func_a,并在内部调用func_b
def func_a():
print("---1---")
# 嵌套用func_b
func_b()
print("---3---")
# 调用函数func_a
func_a()
变量在函数中的作用域
- 变量作用域指的是变量的作用范围(变量在哪里可用,在哪里不可用)主要分为两类: 局部变量和全局变量
- 所谓局部变量是定义在函数体内部的变量,即只在函数体内部生效
1
2
3
4
5
6
7
8
9
10
11
12
13# global关键字,在函数内声明交量为全局变属
num = 200
def test_a():
print(f"test_a: {num}")
def test_b():
global num # 设置内部定义的交量为全局交眉
num = 500
print(f"test_b: {num}")
test_a()
test_b()
print(num) - 综合案例 函数
- 定义一个全局变量:money,用来记录银行卡余额(默认5000000)
- 定义一个全局变量:name,用来记录客户姓名 (启动程序时输入),定义如下的函数:
查询余额函数, 存款函数, 取款函数, 主菜单函数
要求:
- 程序启动后要求输入客户姓名
- 查询余额、存款、取款后都会返回主菜单
- 存款、取款后,都应显示一下当前余额
- 客户选择退出或输入错误,程序会退出,否则一直运行
1 | # 定义全局交量money name |
第六章
数据容器入门
- Python中的数据容器
一种可以容纳多份数据的数据类型 - Python有哪些数据容器?
list(列表)、tuple(元组)、str(字符串)、set(集合)、dict(字典)
它们各有特点,但都满足可容纳多个元素的特性
列表的定义语法
1 | # 演示数据容器之:List 列表 |
列表的下表索引
1 | # 通过下标素引取出对应位置的数据 |
列表的常用操作方法
列表除了可以:
- 定义
- 使用下标索引获取值
列表也提供了一系列功能:插入元素,删除元素,清空列表,修改元素,统计元素个数等等功能,这些功能我们都称之为:列表的方法
1 | # 语法:列表.index(元素) |
- 案例
- 有一个列表,内容是:[21,25,21,23,22,20],记录的是一批学生的年龄,进行练习
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# 1. 定义这个列表,并用变量接收它,内容是:[21,25,21,23,22,20]
mylist =[21,25,21,23,22,20]
# 2.追加一个数字31,到列表的尾部
mylist.append(31)
# 3,追加一个新列表[29,33,30],到列表的尾部
mylist.extend([29,33,30])
# 4.取出第一个元素(应是:21)
num1 = mylist[0]
print(f"从列表中取出来第一个元素,应该是21,实际上是: {num1}")
# 5,取出最后一个元素(应是:30)
num2 = mylist[-1]
print(f"从列表中取出来最后一个元素,应该是30,实际上是: {num2}")
# 6.查找元清31,在列表中的下标位置
index = mylist.index(31)
print(f"元素31在列表的下标位置是: {index}")
print(f"最后列表的内容是: {mylist}")
列表的循环遍历
- 使用while,对List列表的循环
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19def list_while_func():
# 使用while循环遍历列表的演示函数
# :return: None
my_list = ["教育", "程序员", "Python"]
# 循环控制变量通过下标索引来控制,默认0
# 每一次循环将下标索引变量+1
# 循环条件:下标索引变量 < 列表的元素数量
# 定义一个变量用来标记列表的下标
index =0 # 初始值为0
while index < len(my_list):
# 通过index变量取出对应下标的元素
element = my_list[index]
print(f"列表的元素: {element}")
# 至关重要 将循环变量(index)每一次循环都+1
index += 1
list_while_func() - for循环对列表数据容器进行遍历
1
2
3
4
5
6
7
8
9def list_for_func():
# 使用for循环遍历列表的演示函数
# :return: None
my_list = [1, 2, 3, 4, 5]
# for 临时变量 in 数据容器:
for element in my_list:
print(f"列表的元素有: {element}")
list_for_func()
元组的定义和操作
- 元组同列表一样,都是可以封装多个、不同类型的元素在内。但最大的不同点在于:
元组一旦定义完成,就不可修改,所以,当我们需要在程序内封装数据,又不希望封装的数据被篡改,那么元组就非常合适了
1 | # 定义元组 |
字符串的定义和操作
1 | # 演示以数据容器的角色,学习字符申的相关操作 |
数据容器(序列)的切片
- 切片: 从一个序列中,取出一个子序列
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# List进行切片,从1开始,4结束,步长1
my_list = [0,1,2,3,4,5,6]
result1 = my_list[1:4] # 步长默认是1,所以可以省略不写
print(f"结果1: {result1}")
# tuple进行切片,从头开始,到最后结束,步长1
my_tuple = (0,1,2,3,4,5,6)
result2 = my_tuple[:] # 起始和结束不写表示从头到尾,步长为1可以省略
print(f"结果2: {result2}")
# str进行切片,从头开始,到最后结束,步长2
my_str = "01234567"
result3 = my_str[::2]
print(f"结果3: {result3}")
# str进行切片,从头开始,到最后结束,步长-1
my_str ="01234567"
result4 = my_str[::-1] # 等同于将序列反转了
print(f"结果4:{result4}")
# 对列表进行切片,从3开始,到1结束,步长-1
my_list = [0,1,2,3,4,5,6]
result5 = my_list[3:1:-1]
print(f"结果5: {result5}")
# 对元组进行切片,从头开始,到尾结束,步长-2
my_tuple = (0,1,2,3,4,5,6)
result6 = my_tuple[::-2]
print(f"结果6:{result6}")
集合的定义和操作
1 | # 定义集合 |
字典的定义
- 字典的定义,同样使用{},不过存储的元素是一个个的:键值对
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# 定义字典{key: value,key: value,...}
my_dict1 = {"王力鸿": 99,"周杰轮": 88,"林俊节": 77}
# 定义空宇典
my_dict2 = {}
my_dict3 = dict()
print(f"字典1的内容是: {my_dict1},类型:{type(my_dict1)}")
print(f"字典2的内容是: {my_dict2},类型:{type(my_dict2)}")
print(f"字典3的内容是: {my_dict3},类型:{type(my_dict3)}")
# 定义重复Key的宇典,新的会覆盖老的
my_dict1 = {"王力鸿": 99,"王力鸿": 88,"林俊节": 77}
print(f"重复key的字典的内容是: {my_dict1}")
# 从字典中基于Key获取Value[]
my_dict1 = {"王力鸿": 99,"周杰轮": 88,"林俊节": 77}
score = my_dict1["王力鸿"]
print(f"王力鸿的考试分数是:{score}")
# 定义嵌套宇典
# 记录学生各科的考试信息
stu_score_dict = {
"王力鸿": {
"语文": 77,
"数学": 66,
"英语": 33
},"周杰轮":{
"语文": 88,
"数学": 86,
"英语": 55
},"林俊节": {
"语文": 99,
"数学": 96,
"英语": 66
}
}
print(f"学生的考试信息是: {stu_score_dict}")
# 从套字典中获取数据
# 看一下周杰轮的语文信息
score = stu_score_dict["周杰轮"]["语文"]
print(f"周杰轮的语文分数是:{score}")
字典的常用操作
1 | # 语法:字典[Key] = Value,结果:字典被修改,新增了元素 |
- 案例
- 有如下员工信息,请使用字典完成数据的记录。
并通过for循环,对所有级别为1级的员工,级别上升1级,薪水增加1000元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# 演示宇典的课后练习:升职加薪,对所有级别为1级的员工,级别上升1级,薪水增加1000元
# 组织宇典记录数据
info_dict = {
"王力鸿":{
"部门":"科技部",
"工资": 3000,
"级别": 1
},
"周杰轮":{
"部门":"市场部",
"工资": 5000,
"级别": 2
},
"林俊节":{
"部门":"市场部",
"工资": 7000,
"级别":3
},
"张学油":{
"部门":"科技部",
"工资": 4000,
"级别":1
},
"刘德滑":{
"部门":"市场部",
"工资": 6000,
"级别": 2
}
}
print(f"员工在升值加薪之前的结果: {info_dict}")
# for循环遍历字典
for name in info_dict:
# if条件判断符合条件员工
if info_dict[name]["级别"] == 1:
# 升职加薪操作
# 获取到员工的信息宇典
employee_info_dict = info_dict[name]
# 修改员工的信息
employee_info_dict["级别"] = 2 # 级别+1
employee_info_dict["工资"] += 1000 # 工资+1000
# 将员工的信息更新回info_dict
info_dict[name] = employee_info_dict
# 输出结果
print(f"对员工进行升级加薪后的结果是: {info_dict}")
类数据容器的总结对比
- 基于各类数据容器的特点,它们的应用场景如下:
- 列表:一批数据,可修改、可重复的存储场景
- 元组:一批数据,不可修改、可重复的存储场景
- 字符串:一串字符串的存储场景
- 集合:一批数据,去重存储场景
- 字典:一批数据,可用Key检索Value的存储场景
数据容器的通用操作
- 首先,在遍历上:
5类数据容器都支持for循环遍历
列表、元组、字符串支持while循环,集合、字典不支持 (无法下标索引)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# 演示数据容器的通用功能
my_list = [1,2,3,4,5]
my_tuple = (1,2,3,4,5)
my_str ="abcdefg"
my_set = {1,2,3,4,5}
my_dict = {"key1": 1,"key2": 2,"key3": 3,"key4": 4,"key5": 5}
# Len元素个数
print(f"列表 元素个数有:{len(my_list)}")
print(f"元组 元素个数有:{len(my_tuple)}")
print(f"字符串元素个数有:{len(my_str)}")
print(f"集合 元素个数有:{len(my_set)}")
print(f"字典 元素个数有:{len(my_dict)}")
# max最大/最小元素
print(f"列表 最大的元素是:{max(my_list)}")
print(f"元组 最大的元素是:{max(my_tuple)}")
print(f"字符串最大的元素是:{max(my_str)}")
print(f"集合 最大的元素是:{max(my_set)}")
print(f"字典 最大的元素是:{max(my_dict)}")
# 类型转换: 容器转列表/元组(tuple)/字符串(str)/集合(set)
print(f"列表转列表的结果是:{list(my_list)}")
print(f"元组转列表的结果是:{list(my_tuple)}")
print(f"字符串转列表结果是:{list(my_str)}")
print(f"集合转列表的结果是:{list(my_set)}")
print(f"字典转列表的结果是:{list(my_dict)}")
# 进行容器的排序
my_list = [3,1,2,5,4]
my_tuple = (3,1,2,5,4)
my_str ="bdcefga"
my_set = {3,1,2,5,4}
my_dict = {"key3": 1,"key1": 2,"key2": 3,"key5": 4,"key4": 5}
print(f"列表对象的排序结果: {sorted(my_list)}")
print(f"元组对象的排序结果: {sorted(my_tuple)}")
print(f"字符串对象的排序结果: {sorted(my_str)}")
print(f"集合对象的排序结果: {sorted(my_set)}")
print(f"字典对象的排序结果: {sorted(my_dict)}")
print(f"列表对象的反向排序结果: {sorted(my_list,reverse=True)}")
print(f"元组对象的反向排序结果: {sorted(my_tuple,reverse=True)}")
print(f"字符串对象反向的排序结果: {sorted(my_str,reverse=True)}")
print(f"集合对象的反向排序结果: {sorted(my_set,reverse=True)}")
print(f"字典对象的反向排序结果::{sorted(my_dict,reverse=True)}")
拓展-字符串大小比较的方式
- 字符串是按位比较,也就是一位位进行对比,只要有一位大,那么整体就大
1
2
3
4
5
6
7
8# abc 比较 abd
print(f"abd大于abc,结果: {'abd'> 'abc'}")
# a比较 ab
print(f"ab大于a,结果: {'ab'> 'a'}")
# a比较A
print(f"a 大于 A,结果: {'a'> 'A'}")
# key1 比较 key2
print(f"key2 > key1,结果: {'key2'> 'key'}")
第七章
函数的多返回值
- 按照返回值的顺序,写对应顺序的多个变量接收即可
- 变量之间用逗号隔开,支持不同类型的数据return
1
2
3
4
5
6
7# 演示使用多个变量,接收多个返回值
def test_return():
return 1,"hello",True
x,y,z=test_return()
print(x)
print(y)
print(z)
函数的多种参数使用形式
- 位置参数:调用函数时根据函数定义的参数位置来传递参数
- 关键字参数:函数调用时通过“键=值”形式传递参数
作用: 可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求. - 缺省参数:缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用).
作用:当调用函数时没有传递参数,就会使用默认是用缺省参数对应的值. - 不定长参数也叫可变参数.用于不确定调用的时候会传递多少个参数(不传参也可以)的场景
作用:当调用函数时不确定参数个数时,可以使用不定长参数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# 演示多种传参的形式
# 注意:传递的参数和定义的参数的顺序及个数必须一致
def user_info(name,age,gender):
print(f"姓名是:{name},年龄是:{age},性别是:{gender}")
# 位置参数 - 默认使用形式
user_info('小明',20,'男')
# 关键字参数
# 注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序
user_info(name='小王',age=11,gender='女')
user_info(age=10,gender='女',name='潇潇') # 可以不按照参数的定义顺序传参
user_info('甜甜',gender='女',age=9)
# 缺省参数(默认值)
# 注意:函数调用时,如果为缺省参数传值则修改默认参数值,否则使用这个默认值
def user_info(name,age,gender):
print(f"姓名是:{name},年龄是:{age},性别是:{gender}")
user_info('小天',13,'男')
# 不定长- 位置不定长,*号
# 不定长定义的形式参数会作为元组存在,接收不定长数量的参数传入
# 位置不定长传递以*号标记一个形式参数,以元组的形式接受参数形式参数一般命名为args
def user_info(*args):
print(f"args参数的类型是: {type(args)},内容是:{args}")
user_info(1,2,3,'小明','男孩')
# 不定长 - 关键字不定长,** 号
# 关键字不定长传递以**号标记一个形式参数,以字典的形式接受参数,形式参数一般命名为kwargs
def user_info(**kwargs):
print(f"args参数的类型是: {type(kwargs)},内容是:{kwargs}")
user_info(name='小王',age=11,gender='男孩')
函数作为参数传递
- 函数本身,也可以作为参数传入另一个函数内
1
2
3
4
5
6
7
8
9
10
11# 定义一个函数,接收另一个函数作为传入参数
def test_func(compute):
result = compute(1,2) # 确定cmpute是函数
print(f"compute参数的类型是:{type(compute)}")
print(f"计算结果: {result}")
# 定义一个函数,准备作为参数传入另一个函数
def compute(x,y):
return x + y
# 调用,并传入函数
test_func(compute) - 将函数传入的作用在于:传入计算逻辑,而非传入数据。
lambda匿名函数
- 函数的定义中
def关键字,可以定义带有名称的函数,有名称的函数,可以基于名称重复使用
lambda关键字,可以定义匿名函数 (无名称),无名称的匿名函数,只可临时使用一次1
2
3
4
5
6
7
8
9
10# 演示Lambda匿名函数 lambda 传入参数: 函数体(一行代码)
# 定义一个函数,接受其它函数输入
def test_func(compute):
result = compute(1,2)
print(f"结果是:{result}")
# 通过Lambda匿名函数的形式,将匿名函数作为参数传入
def add(x,y):
return x + y
test_func(add)
test_func(lambda x,y: x + y)
第八章
文件编码概念
什么是编码?
编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑编码有许多中,我们最常用的是UTF-8编码(UTF-8是目前全球通用的编码格式,除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。)为什么需要使用编码?
计算机只认识0和1,所以需要将内容翻译成0和1才能保存在计算机中同时也需要编码,将计算机保存的0和1,反向翻译回可以识别的内容
文件的读取操作
- 内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、I 盘等设备。为了便于数据的管理和检索,引入了“文件”的概念。
- open函数,可以打开一个已经存在的文件,或者创建一个新文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# 语法如下 open(name,,mode,encoding)
# name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)
# mode: 设置打开文件的模式(访问模式): 只读、写入、追加等。
# encoding: 编码格式(推荐使用UTF-8)
# 打开文件
f = open("F:\Code\测试.txt","r",encoding="UTF-8")
print(type(f))
# 读取文件 - read()
print(f"读取10个字节的结果: {f.read(10)}")
print(f"read方法读取全部内容的结果是: {f.read()}")
print("------------------------")
# 读取文件 - readLines()
lines = f.readlines() # 读取文件的全部行,封装到列表中
print(f"lines对象的类型: {type(lines)}")
print(f" ines对象的内容是: {lines}")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# 打开文件
import time
f = open("F:\Code\测试.txt","r",encoding="UTF-8")
print(type(f))
print("---------------")
# 读取文件- readline()
line1 = f.readline()
line2 = f.readline()
line3 = f.readline()
print(f"第一行数据是: {line1}")
print(f"第二行数据是: {line2}")
print(f"第三行数据是: {line3}")
# for循坏读取文件行
for line in f:
print(f"每一行数据是:{line}")
# 文件的关闭
f.close()
time.sleep(500000)
# with open 语法操作文件
# import.time
# with open("F:\Code\测试.txt","r",encoding="UTF-8") as f:
# for line in f:
# print(f"每一行数据是: {line}")
# time.sleep(500000)
文件的写出操作
- 直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
- 当调用flush的时候,内容会真正写入文件
- 这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
1 | # 打开文件,不存在的文件,r,w,a |
- 写入文件使用open函数的”w”模式进行写入
- 写入的方法有:
wirte(),写入内容
flush(),刷新内容到硬盘中 - 注意事项
w模式,文件不存在,会创建新文件
w模式,文件存在,会清空原有内容
close()方法,带有flush()方法的功能
文件的追加写入操作
- a模式,文件不存在会创建文件
- 文件存在会在最后,追加写入文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14# 打开文件,不存在的文件
# f= open("F:\Code\text.txt","a",encoding="UTF-8")
# write写入
# f.write("黑马程序员")
# # flush刷新
# f.flush()
# # close关闭
# f.close()
# 打开一个存在的文件
f = open("F:\Code\text.txt","a",encoding="UTF-8")
# write写入,fLush刷新
f.write("学Python最佳选择")
# cLose关闭
f.close()