前言
本系列课程仅供 Python 初学者参考,目的是让各位的 Python 期末考试能够如履薄冰。
因本人水平有限,加之编写时间紧张匆忙,难免有疏漏之处,敬请指正。
总目录
- 第一课
- 第二课
本节目录
上次更新时间:2023-11-30 10:43
(点击可直接跳转)
- 1.1 Python 语言基础
1.1.1 注释规则
1.1.2 代码缩进
1.1.3 编码规范
1.1.4 基本输入和输出 - 1.2 变量
1.2.1 保留字
1.2.2 标识符
1.2.3 定义变量 - 1.3 数据类型
1.3.1 整型
1.3.2 浮点型
1.3.3 文本型
1.3.4 布尔型
1.3.5 列表
1.3.6 元组
1.3.7 字典
1.3.8 数据类型转换
第一课
1.1 Python 语言基础
学习 Python 需要了解它的语法特点,如注释规则、代码缩进、编码规范等。下面将展开详细介绍。
1.1.1 注释规则
Python 中的注释类似于语文中的文言文注释。所谓注释,就是在代码中添加标注性的文字,进而帮助更好地阅读代码。
单行注释
在 Python 中,使用 # 作为单行注释的符号。从符号 # 开始到换行为止,其后面的所有内容都被解释器忽略。
用法:
# 注释内容
多行注释
Python 中并没有单独的多行注释标记,而是将包含在一对三引号 (""" """
或 ''' '''
),并且不属于任何语句的内容视为多行注释。
用法:
"""
注释内容 1
注释内容 2
"""
文件编码声明注释
在 Python 3 中,默认采用 UTF-8 编码。这种编码支持世界上绝大多数语言的字符。
用法:
# -*- coding: 编码 -*-
或者
# coding=编码
例如,指定 GBK 编码:
# -*- coding: gbk -*-
例程
1.大杂烩
# 指定 UTF-8 编码
# -*- coding: utf-8 -*-
# 添加版权信息
"""
@ 版权所有:沧笙踏歌
@ 文件名:demo.py
@ 创建日期:2023年11月23日
@ 创建人:沧笙踏歌
"""
# 输出多行内容
print("""
众水,众方,众民与众律法的女王
成为人类,就意味着隐藏秘密,经历痛苦,与孤独相伴......
即便如此你也愿意吗?
"即便承受了许多痛苦与孤独,她也不曾质疑世界的美好"
""")
# 注释代码
"""
req = self.session.get(url, headers = get_header(referer_url, Config.User.sessdata, chunk_list), stream = True, proxies = get_proxy(), auth = get_auth())
with open(path, "rb+") as f:
f.seek(chunk_list[0])
for chunk in req.iter_content(chunk_size = 1024):
if chunk:
f.write(chunk)
f.flush()
self.completed_size += len(chunk)
self.thread_info[thread_id]["chunk_list"][0] += len(chunk)
if self.completed_size >= self.total_size:
self.flag = True
"""
1.1.2 代码缩进
在 Python 中,对于类定义、函数定义、流程控制语句,以及异常处理语句等,行尾的冒号和下一行的缩进表示一个代码块的开始,而缩进结束,则表示一个代码块的结束。
缩进可以使用空格或 Tab 键实现。若使用空格,通常情况下采用 4 个空格作为一个缩进量;而使用 Tab 键,则采用一个 Tab 键作为一个缩进量。
示例:
score = int(input("请输入分数:"))
if score < 60:
grade = "D"
elif score < 70:
grade = "C"
elif score < 85:
grade = "B"
elif score <= 100:
grade = "A"
print("评级:" + grade)
1.1.3 编码规范
在 Python 中采用 PEP8 作为编码规范,其中 PEP 是 Python Enhancement Proposal 的缩写,翻译过来是 Python 增强建议书,而 PEP8 表示版本,它是 Python 代码的样式指南。
以下给出 PEP8 编码规范中的一些应该严格遵守的条目:
- 每个 import 语句只导入一个模块,尽量避免一次导入多个模块
- 不要在行尾添加分号
;
- 建议每行不超过 80 个字符
- 使用必要的空行可以增加代码的可读性
- 通常情况下,运算符两侧、函数参数之间、逗号
,
两侧建议使用空格进行分隔 - 适当使用异常处理结构提高程序容错性
1.1.4 基本输入和输出
使用 input() 函数输入
在 Python 中,使用 input() 函数接收用户通过键盘输入的内容。
用法:
variable = input("提示文字")
其中,variable 为保存输入结果的变量,双引号内的文字是用于提示用户要输入的内容的。
示例:
tip = input("请输入文字:")
如果想要接收数值,需要把接收的字符串进行类型转换。
示例:
age = int(input("请输入数字:"))
例程
1.复读机
a = input("输入:")
print("你刚才输入的是:", a)
使用 print() 函数输出
在 Python 中,使用 print() 函数可将结果输出到控制台中。
用法:
print(输出内容)
其中,输出内容可以是数字和字符串,此类内容将直接输出;也可以是包含运算符的表达式,此类内容将计算结果输出。
示例:
a = 10 # 变量 a,值为 10
b = 20 # 变量 b,值为 20
print(10) # 输出数字 10
print(a + b) # 输出 a + b 的结果 30
print(a if a > b else b) # 输出条件表达式的结果 20
print("La vaguelette") # 输出字符串 "La vaguelette"
例程
1.输出 Hello, world
print("Hello, world")
2.输出《唐多令·芦叶满汀洲》
print("唐多令·芦叶满汀洲")
print("宋·刘过")
print("芦叶满汀洲,寒沙带浅流。二十年重过南楼。柳下系船犹未稳,能几日,又中秋。")
print("黄鹤断矶头,故人今在否?旧江山浑是新愁。欲买桂花同载酒,终不似,少年游。")
1.2 变量
在学习变量之前,先来了解什么是保留字和标识符。
1.2.1 保留字
保留字是 Python 中已经被赋予特定意义的单词,在开发时,不可以将保留字作为函数、类、模块和其他对象的名称来使用。
Python 中的保留字如下表所示:
and | as | assert | break | class | continue | def | del |
elif | else | except | finally | for | from | False | global |
if | import | in | is | lambda | nonlocal | not | None |
or | pass | raise | return | try | True | while | with |
yield |
Python 中的保留字也可通过运行以下两行代码查看:
import keyboard
keyborad.kwlist()
1.2.2 标识符
标识符可以简单地理解为一个名字,它主要用来标识变量、函数、类、模块和其它对象名称。
标识符命名原则:
- 以字母、下划线
_
和数字组成,但不能以数字开头 - 不能使用 Python 中的保留字
- 区分大小写,例如 name 和 Name 是两个不同的标识符
- 不含特殊字符(
?
/
!
等符号)
示例:
name # √
value123456 # √
12345 # ×,不能以数字开头
123age # ×,同上
name56_ # √
_address # √
1.2.3 定义变量
在 Python 中,不需要先声明变量名和类型,直接赋值即可创建变量。
为变量赋值可以通过等号实现:
用法:
变量名 = value
示例:
# 创建一个整型变量,并赋值 1024
number = 1024
# 创建一个字符串变量
weapon = "静水流涌之辉"
另外,Python 是一种动态类型的语言,也就是说变量的类型可以随时变化。
示例:
# 字符串类型的变量
name = "芙卡洛斯"
# 查看变量类型
print(type(name))
# 修改为整数型
name = 1024
# 查看变量类型
print(type(name))
输出:
<class 'str'>
<class 'int'>
1.3 数据类型
在 Python 中,数据类型主要有以下几种:
1.3.1 整型
整型包括十进制整数、八进制整数、十六进制整数和二进制整数。
十进制整数
十进制整数大家都很熟悉,此处略过。
八进制整数
由 0-7 组成,进位规则“逢八进一”,且以 0o / 0O 开头的数。
例如:0o2000 (十进制的 1024)
十六进制整数
由 0-9、A-F 组成,进位规则“逢十六进一”,且以 0x / 0X 开头的数。
例如:0x29A (十进制的 666)
二进制整数
只有 0 和 1 两个基数,进位规则“逢二进一”。
例如:10000000 (十进制的 128)
例程
1.大杂烩 2.0
# 十进制整数
123
0
-666
-123456789
655365152465492162534245252422152
# 八进制整数,十进制的 83
0o123
# 十六进制整数,十进制的 45086
0xB01E
# 二进制整数,十进制的 10
1010
1.3.2 浮点型
浮点数由整数部分和小数部分组成,主要用于包括小数的数。此外,浮点数也可以使用科学计数法表示。
例如:
1.0
3.1415926535897
1.000000000005
-2.053
-5.66666666666666
# 科学计数法表示
1.5e2
-3.14e5
8.2e-9
1.3.3 字符串型
字符串就是连续的字符串序列,可以是计算机所能表示的一切字符的集合。
在 Python 中,字符串属于不可变序列,通常使用单引号 ''
,双引号 ""
,或者三引号 ''' '''
,""" """
括起来。
其中,单引号和双引号中的字符必须在一行上,而三引号中的字符可以分布在连续的多行上。
示例:
'我要学树穴'
"树穴猪要烤岩"
"""风与牧歌之城"""
# 跨行书写
"""
我
可
以
跨
行
书
写
[酷]
"""
'但我不可以跨行 [哭哭]'
Python 中的字符串还支持转义字符。所谓转义字符,是指使用反斜杠 \
对一些特殊字符进行转义。
常用的转义字符如下表所示:
转义字符 | 说明 | 转义字符 | 说明 |
---|---|---|---|
\ | 续行符 | \' | 单引号 |
\n | 换行符 | \\ | 一个反斜杠 |
\0 | 空 | \f | 换页 |
\t | 水平制表符 | \0dd | 八进制数,dd 代表字符 |
\" | 双引号 | \xhh | 十六进制数,hh 代表字符 |
拓展
Python 支持引号的嵌套,规则如下:
- 字符串开始和结尾使用的引号形式必须是一致的,例如 ' 和 '," 和 ",不可以是 ' 和 "
- 单引号
''
只能和 双引号""
交叉嵌套
示例:
# 单引号中嵌套双引号
'"东去长安万里余,故人何惜一行书。"'
# 双引号中嵌套单引号
"'愿此行,终抵群星'"
# 只能交叉嵌套,以下两种用法均是错误的
''应急食品''
""规则,就是用来打破的!""
# 可以进行多级嵌套,但仍需注意交叉嵌套
"'"'"""TECH OTAKUS SAVE THE WORLD"""'"'"
1.3.4 布尔型
布尔值是表示真和假的值,即 True 和 False。
在 Python 中,所有对象都可以进行真值测试,只有以下列出的情况得到的值为假,其余都为真。
- False
- None
- 数值里的 0,包括 0、0.0、复数 0
- 空序列,包括空字符串、空列表、空元组、空字典
拓展
在 Python 中,布尔值可以转换为数值,其中 True 表示 1,False 表示 0。
示例:
print(True + True) # 1 + 1
print(True + False) # 1 + 0
print(1 + False + True) # 1 + 0 + 1
输出:
2
1
2
1.3.5 列表
序列
首先介绍一下序列的概念。
序列是一块用于存储多个值的内存空间,并且按照一定的顺序排列,每个值(元素)都分配一个数字,称为下标(索引)。通过下标可以取出相应的值。
在 Python 中,序列结构主要有列表、元组、集合、字符串和字典。其中集合和字典不支持下标、切片、相加和相乘操作。
下标
序列中的每个元素都有一个编号,这个编号叫下标,也被称为索引 (index)。
在 Python 中,下标从 0 开始编号,即下标为 0 表示第一个元素,下标为 1 表示第二个元素,以此类推。
例如:
[元素 1, 元素 2, 元素 3, 元素 4, 元素 ..., 元素 n]
0 1 2 3 ... n-1 # 下标
Python 比较神奇,它的下标还可以是负数。此时表示从右向左计数,即下标为 -1 表示最后一个元素,下标为 -2 表示倒数第二个元素。
例如:
[元素 1, 元素 2, 元素 3, 元素 ..., 元素 n-1, 元素 n]
-n -(n-1) -(n-2) ... -2 -1 # 下标
通过下标可以访问列表中任意元素。
示例:
# 现有仙舟罗浮部分地点组成的一个列表
a = ["神策府", "地衡司", "丹鼎司", "工造司", "太卜司"]
print(a[0]) # 输出第一个元素
print(a[1]) # 输出第二个元素
print(a[-1]) # 输出最后一个元素
输出:
神策府
地衡司
太卜司
切片
切片操作是访问序列中元素的另一种方法,它可以访问一定范围内的元素。通过切片操作可以生成一个新的序列。
用法:
sequence[start: end: step]
参数说明如下:
- sequence:表示序列的名称
- start:表示切片开始的位置(包含该位置,闭区间),如果省略,默认值为 0
- end:表示切片结束的位置(不包含该位置,开区间),如果省略,默认值为序列的长度
- step:表示切片的步长,如果省略,默认值为 1
示例:
verse = ["真名,渡厄真君", "此刻,寂灭之时", "稻光,亦是永恒", "可叹,落叶飘零", "坚冰,断绝深仇", "欢唱,以我之名", "破绽,稍纵即逝", "且尝,苦尽甘来", "知识,与你分享"]
# 输出第 2-6 个元素
print(verse[1:6])
# 输出第 2 个、第 4 个、第 6 个元素
print(verse[1:6:2])
输出:
['此刻,寂灭之时', '稻光,亦是永恒', '可叹,落叶飘零', '坚冰,断绝深仇', '欢唱,以我之名']
['此刻,寂灭之时', '可叹,落叶飘零', '欢唱,以我之名']
序列相加
在 Python 中,支持两种相同类型的序列相加操作,即将两个序列进行连接,不会去除重复的元素,使用加 +
运算符实现。
示例:
verse1 = ["不动鸣神,恒常乐土", "千手百眼,天下人间", "无念无想,泡影断灭", "虚空鼓动,劫火高杨"]
verse2 = ["仿若无因飘落的轻雨", "向深水中的晨星", "罪人舞步旋"]
print(verse1 + verse2)
输出:
['不动鸣神,恒常乐土', '千手百眼,天下人间', '无念无想,泡影断灭', '虚空鼓动,劫火高杨', '仿若无因飘落的轻雨', '向深水中的晨星', '罪人舞步旋']
乘法
在 Python 中,使用数字 n 乘以一个序列会生成新的序列。新序列的内容为原来序列被重复 n 次的结果。
示例:
verse = ["我将,扭转万象", "这一击,贯穿星辰"]
print(verse * 3)
输出:
['我将,扭转万象', '这一击,贯穿星辰', '我将,扭转万象', '这一击,贯穿星辰', '我将,扭转万象', '这一击,贯穿星辰']
检查某个元素是否是序列的成员
在 Python 中,可以使用 in 关键字检查某个元素是否是序列的成员,即检查某个元素是否包含在该序列中。
用法:
element in sequence
其中, element 表示要检查的元素,sequence 表示指定的序列。
例如,要检查名称为 verse 的序列中,是否包含元素 "欢唱,以我之名",可以使用以下代码:
verse = ["真名,渡厄真君", "此刻,寂灭之时", "稻光,亦是永恒", "可叹,落叶飘零", "坚冰,断绝深仇", "欢唱,以我之名", "破绽,稍纵即逝", "且尝,苦尽甘来", "知识,与你分享"]
print("欢唱,以我之名" in verse)
输出:
True
True 表示在序列中存在指定的元素。
此外,也可以使用 not in 关键字检查某个元素是否不包含在指定的序列中。
示例:
verse = ["真名,渡厄真君", "此刻,寂灭之时", "稻光,亦是永恒", "可叹,落叶飘零", "坚冰,断绝深仇", "欢唱,以我之名", "破绽,稍纵即逝", "且尝,苦尽甘来", "知识,与你分享"]
print("欢唱,以我之名" not in verse)
输出:
False
计算序列的长度、最大值和最小值
在 Python 中,提供了内置函数计算序列的长度、最大值和最小值。接下来将分别介绍。
len() 函数用于计算序列的长度。
示例:
verse = ["真名,渡厄真君", "此刻,寂灭之时", "稻光,亦是永恒", "可叹,落叶飘零", "坚冰,断绝深仇", "欢唱,以我之名", "破绽,稍纵即逝", "且尝,苦尽甘来", "知识,与你分享"]
print("序列 verse 的长度为", len(verse))
输出:
序列 verse 的长度为 9
max() 函数用于计算序列中的最大元素。
示例:
verse = [6, 30, 98, 198, 328, 648]
print("序列 verse 中最大值为", max(verse))
输出:
序列 verse 中最大值为 648
min() 函数用于计算序列中的最小元素。
示例:
verse = [6, 30, 98, 198, 328, 648]
print("序列 verse 中最小值为", min(verse))
输出:
序列 verse 中最小值为 6
除上述的 3 个函数外,Python 还提供了如下表所示的内置函数。
函数 | 说明 | 函数 | 说明 |
---|---|---|---|
list() | 将序列转换为列表 | sorted() | 对元素进行排序 |
str() | 将序列转换为字符串 | reversed() | 颠倒序列中的元素 |
sum() | 计算元素的和 | enumerate() | 将序列组合为一个下标序列 |
列表
Python 中的列表是由一系列按特定顺序排列的元素组成的。它是 Python 中内置的可变序列。
在形式上,列表的所有元素都放在一对中括号 []
中,两个相邻的元素使用逗号 ,
分隔。在内容上,可以将任何类型的内容放入列表中,并且在一个列表中,元素的类型可以不同。
列表的创建和删除
在 Python 中提供了多种创建列表的方法,下面将分别进行介绍。
1.使用赋值运算符直接创建列表
用法:
listname = [元素1, 元素2, 元素3, ......, 元素n]
其中,listname
表示列表的名称;元素1、元素2、元素3、元素n 表示列表中的元素,个数没有限制。
示例:
num = [1, 2, 3, 4, 5, 6]
slogan = ["遥遥领先", "我们继续领先", "领先同行超过 50%"]
i = [198, 328, 648, "以月色为剑", ["沫芒宫", "欧庇克莱歌剧院", "枫丹科学院"]]
python = ["人生苦短", '我用 Python', True, 0x2c3]
2.创建空列表
示例:
empty = []
3.创建数值列表
在 Python 中,可以使用 list() 函数直接将 range() 函数循环出来的结果转换为列表。
list() 函数的基本语法如下:
list(data)
其中,data 表示可以转换为列表的数据,其类型可以是 range 对象、字符串、元组或者其他可迭代类型的数据。
示例:
# 创建一个 1 - 20(左闭右开,不包括 20)的奇数列表
a = list(range(1, 20, 2))
print(a)
输出:
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
4.删除列表
对于已经创建的列表,当不再使用时,可以使用 del 语句将其删除。
用法:
del listname
其中,listname 为要删除的列表名称。
访问列表元素
在 Python 中,输出列表的内容可以直接使用 print() 函数。
示例:
a = ["神策府", "地衡司", "丹鼎司", "工造司", "太卜司"]
print(a)
输出:
['神策府', '地衡司', '丹鼎司', '工造司', '太卜司']
从上述执行结果可以看出,在输出列表时,是包括左右两侧的中括号的。如果不想输出全部元素,也可以通过列表的下标获取指定的元素。
例如,要获取列表 a 中下标为 3 的元素,可以使用下列代码:
print(a[3])
输出:
工造司
从上述执行结果可以看出,在输出单个列表元素时,不包括中括号,如果是字符串,还不包括左右的引号。
例程
1.每日一贴
# 导入日期时间类
import datetime
days = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]
sentences = [
"山重水复疑无路,柳暗花明又一村",
"攀登时节动群英,奋发日夜向前行",
"古之立大事者,不惟有超世之才,亦必有坚忍不拔之志",
"路漫漫其修远兮,吾将上下而求索",
"非学无以广才,非志无以成学",
"不经一番寒彻骨,怎得梅花扑鼻香",
"人生自是有情痴,此恨不关风与月"
]
# 获取当前星期
day = datetime.datetime.now().weekday()
# 输出每日一贴
print("今天是" + days[day] + ",继续努力哦!\n")
print(sentences[day])
输出:
今天是星期五,继续努力哦!
非学无以广才,非志无以成学
在上述代码中,datetime.datetime.now() 用于获取当前日期,而 weekday() 方法则是从时间对象中获取星期,其值为 0-6,0 代表星期一,1 代表星期二,以此类推,6 代表星期日。
遍历列表
遍历列表中的所有元素是常用的一种操作,在遍历的过程中可以完成查询,处理等功能。在 Python 中,遍历列表的方法有很多种,下面介绍常用的两种方法。
1.使用 for 循环实现
使用 for 循环遍历列表,只能输出元素的值。
用法:
for item in listname:
# 代码块
其中,item 用于保存获取到的元素值,要输出元素的内容时,直接输出该变量即可;listname 为列表名称。
示例:
verse = ["真名,渡厄真君", "此刻,寂灭之时", "稻光,亦是永恒", "可叹,落叶飘零", "坚冰,断绝深仇", "欢唱,以我之名", "破绽,稍纵即逝", "且尝,苦尽甘来", "知识,与你分享"]
# 输出各个元素的内容
for item in verse:
print(item)
输出:
真名,渡厄真君
此刻,寂灭之时
稻光,亦是永恒
可叹,落叶飘零
坚冰,断绝深仇
欢唱,以我之名
破绽,稍纵即逝
且尝,苦尽甘来
知识,与你分享
2.使用 for 循环和 enumerate() 函数实现
使用 for 循环和 enumerate() 函数可以实现同时输出下标和元素内容。
用法:
for index, value in enumerate(listname):
# 代码块
参数说明如下:
- index:用于保存元素的下标
- value: 用于保存获取到的元素值
- listname:列表名称
示例:
verse = ["真名,渡厄真君", "此刻,寂灭之时", "稻光,亦是永恒", "可叹,落叶飘零", "坚冰,断绝深仇", "欢唱,以我之名", "破绽,稍纵即逝", "且尝,苦尽甘来", "知识,与你分享"]
# 输出各个元素的下标和内容
for index, value in enumerate(verse):
print(index, value)
输出:
0 真名,渡厄真君
1 此刻,寂灭之时
2 稻光,亦是永恒
3 可叹,落叶飘零
4 坚冰,断绝深仇
5 欢唱,以我之名
6 破绽,稍纵即逝
7 且尝,苦尽甘来
8 知识,与你分享
添加、修改和删除列表元素
1.添加元素
列表对象的 append() 方法用于在列表的末尾添加一个元素。
用法:
listname.append(obj)
其中,listname 为要添加元素的列表名称;obj 为要添加到列表末尾的对象。
示例:
a = [1, 2, 3, 4, 5]
# 添加一个元素 6
a.append(6)
# 输出
print(a)
输出:
[1, 2, 3, 4, 5, 6]
若想要将一个列表中的全部元素添加到另一个列表中,可以使用列表对象的 extend() 方法实现。
用法:
listname.extend(seq)
其中,listname 为原列表;seq 为要添加的列表。执行后,seq 的内容将追加到 listname 的末尾。
示例:
a = [1, 2, 3]
b = ['a', 'b', 'c']
# 合并列表
a.extend(b)
# 输出
print(a)
输出:
[1, 2, 3, 'a', 'b', 'c']
2.修改元素
修改列表中的元素只需要通过下标获取该元素,然后重新为其赋值即可。
示例:
a = [1, 2, 3]
# 将下标为 0 的元素修改为 1000
a[0] = 1000
# 输出
print(a)
输出:
[1000, 2, 3]
3.删除元素
(1)根据下标删除
删除列表中的指定元素和删除列表类似,也可以使用 del 语句实现。不同的是在指定列表名称时,换成列表元素。
示例:
a = [1, 2, 3, 4, 5, 888]
# 删除元素 888,其下标为 5
del a[5]
# 输出
print(a)
输出:
[1, 2, 3, 4, 5]
(2)根据元素值删除
使用列表对象的 remove() 方法可以根据元素值删除元素。
示例:
a = [1, 2, 3, 666]
# 删除元素 666
a.remove(666)
# 输出
print(a)
输出:
[1, 2, 3]
当指定的元素不存在时,将会抛出 ValueError 异常。所以在使用 remove() 方法删除元素前,最好先判断该元素是否存在。
示例:
a = [1, 2, 3, 666]
value = 888
# 判断要删除的元素是否存在
if value in a:
# 删除指定元素
a.remove(value)
# 输出
print(a)
输出:
[1, 2, 3, 666]
对列表进行统计计算
1.获取指定元素出现的次数
使用列表对象的 count() 方法可以获取指定元素在列表中出现的次数。
用法:
listname.count(obj)
其中,listname 表示列表的名称;obj 表示要获取出现次数的对象。
示例:
# 某人跃迁了十次,获得:
verse = [
"平平无奇的垃圾",
"乏善可陈的垃圾",
"普普通通的垃圾",
"中规中矩的垃圾",
"朴实无华的垃圾",
"不值一提的垃圾",
"平平无奇的垃圾",
"稀松平常的垃圾",
"平平无奇的垃圾",
"百里挑一的垃圾"
]
# 请问一共获得了多少个 "平平无奇的垃圾" ?
print(verse.count("平平无奇的垃圾"))
输出:
3
2.获取指定元素首次出现的下标
使用列表对象的 index() 方法可以获取指定元素在列表中首次出现的位置(下标)。
用法:
listname.index(obj)
参数说明如下:
- listname:表示列表名称
- obj:表示要查找的对象
- 返回值:首次出现的下标位置
示例:
# 某人跃迁了十次,获得:
verse = [
"平平无奇的垃圾",
"乏善可陈的垃圾",
"普普通通的垃圾",
"中规中矩的垃圾",
"朴实无华的垃圾",
"不值一提的垃圾",
"平平无奇的垃圾",
"稀松平常的垃圾",
"平平无奇的垃圾",
"百里挑一的垃圾"
]
# 请问首次获得 "平平无奇的垃圾" 是在第几次?
index = verse.index("平平无奇的垃圾")
print("下标位置:" + str(index))
print("实际次数:第", index + 1, "次")
输出:
下标位置:0
实际次数:第 1 次
3.统计数值列表的元素和
在 Python 中,提供了 sum() 函数用于统计数值列表中各元素的和。
用法:
sum(iterable[, start])
参数说明如下:
- iterable:表示要统计的列表
- start:从指定下标的元素开始统计,默认为 0
示例:
# 某人最近的账单
bill = [6, 30, 98, 198, 328, 648]
# 计算账单总金额
total = sum(bill)
# 输出
print("账单金额为", total)
输出:
账单金额为 1308
对列表进行排序
1.使用列表对象的 sort() 方法实现
列表对象提供了 sort() 方法用于对原列表中的元素进行排序。排序后,原列表的元素顺序将发生改变。
用法:
listname.sort(key = None, reverse = False)
参数说明如下:
- listname:表示要排序的列表
- key:用于指定一个函数,根据该函数的返回值对列表进行排序。默认值为 None,表示使用列表元素自身的值进行排序
- reverse:排序方式,True 表示降序排列,False 表示升序排列,默认为 False
示例:
# 某人最近的账单
bill = [648, 98, 328, 328, 60, 648, 6]
print("原列表", bill)
# 进行升序排列
bill.sort(reverse = False)
print("升序", bill)
# 进行降序排列
bill.sort(reverse = True)
print("降序", bill)
输出:
原列表 [648, 98, 328, 328, 60, 648, 6]
升序 [6, 60, 98, 328, 328, 648, 648]
降序 [648, 648, 328, 328, 98, 60, 6]
如果想要对字符串列表进行排序,则需要指定其 key 参数。
示例:
characters = ["Furina", "Neuvillette", "navia", "Wriothesley","charlotte", "Lyney", "lynette", "freminet", "Chevreuse"]
# 区分字母大小写
characters.sort()
print("区分字母大小写", characters)
# 不区分字母大小写
characters.sort(key = str.lower)
print("不区分字母大小写", characters)
输出:
区分字母大小写 ['Chevreuse', 'Furina', 'Lyney', 'Neuvillette', 'Wriothesley', 'charlotte', 'freminet', 'lynette', 'navia']
不区分字母大小写 ['charlotte', 'Chevreuse', 'freminet', 'Furina', 'lynette', 'Lyney', 'navia', 'Neuvillette', 'Wriothesley']
2.使用内置的 sorted() 函数实现
在 Python 中,提供了一个内置的 sorted() 函数,用于对列表进行排序。与列表对象的 sort() 方法不同的是,排序后原列表的元素排列顺序不变。
用法:
sorted(lsitname, key = None, reverse = False)
参数说明如下:
- listname:表示要排序的列表
- key:用于指定一个函数,根据该函数的返回值对列表进行排序。默认值为 None,表示使用列表元素自身的值进行排序
- reverse:排序方式,True 表示降序排列,False 表示升序排列,默认为 False
示例:
# 某人最近的账单
bill = [648, 98, 328, 328, 60, 648, 6]
print("原列表", bill)
# 进行升序排列
bill_as = sorted(bill)
print("升序", bill_as)
# 进行降序排列
bill_des = sorted(bill, reverse = True)
print("降序", bill_des)
输出:
原列表 [648, 98, 328, 328, 60, 648, 6]
升序 [6, 60, 98, 328, 328, 648, 648]
降序 [648, 648, 328, 328, 98, 60, 6]
列表推导式
使用列表推导式可以快速生成一个列表,或根据某个列表生成满足指定需求的列表。列表推导式通常有以下几种常用的语法格式:
(1)根据序列生成新的列表
用法:
list = [Expression for var in sequence]
参数说明如下:
- list:表示生成的列表名称
- Expression:表达式
- var:循环变量
- sequence:用于生成新列表的原序列
示例:
# 商品价格列表
price = [1999, 2499, 3299, 4299, 6999]
# 输出打五折价格
sale = [int(i * 0.5) for i in price]
print("原价", price)
print("打五折后", sale)
输出:
原价 [1999, 2499, 3299, 4299, 6999]
打五折后 [999, 1249, 1649, 2149, 3499]
(2)根据序列生成新的符合指定条件的列表
用法:
list = [Expression for var in sequence if condition]
参数说明如下:
- list:表示生成的列表名称
- Expression:表达式
- var:循环变量
- sequence:用于生成新列表的原序列
- condition:条件表达式
示例:
# 生成 1-20 以内的合数
prime_number = [i for i in range(1, 21) if (i % 2 == 0 and i != 2) or (i % 3 == 0 and i != 3) or (i % 5 == 0 and i != 5)]
print(prime_number)
输出:
[4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20]
二维列表
顾名思义,二维列表就是包含列表的列表。也就是一个列表中的元素又都是一个列表。
示例:
# 下列列表就是二维列表
[
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
创建二维列表后,可以通过以下格式访问列表中的元素:
listname[下标1][下标2]
参数说明如下:
- listname:表示列表名称
- 下标1:表示列表的第几行
- 下标2:表示列表的第几列
例如,可将下表表示为二维列表:
列/行 | 0 列 | 1 列 | 2 列 | 3 列 | 4 列 |
---|---|---|---|---|---|
0 行 | 101 | 102 | 103 | 104 | 105 |
1 行 | 201 | 202 | 203 | 204 | 205 |
2 行 | 301 | 302 | 303 | 304 | 305 |
代码如下:
a = [
[101, 102, 103, 104, 105],
[201, 202, 203, 204, 205],
[301, 302, 303, 304, 305]
]
访问二维列表的元素:
print(a[0][1])
print(a[1][2])
print(a[2][4])
输出:
102
203
305
1.3.6 元组
元组是 Python 中另一个重要的序列结构。与列表类似,也是由一系列按特定顺序排列的元素组成。但是,它为不可变序列。因此,元组也称不可变列表。
在形式上,元组的所有元素都放在一对小括号 ()
中,两个相邻元素使用逗号 ,
分隔。在内容上,可以将任何类型的内容放入元组中,并且在一个元组中,元素的类型可以不同。
元组的创建和删除
1.使用赋值运算符直接创建元组
用法:
tuplename = (元素1, 元素2, 元素3, ......)
其中,listname 表示元组的名称;元素1、元素2、元素3、元素n 表示元组中的元素,个数没有限制。
示例:
num = (1, 2, 3, 4, 5, 6)
slogan = ("遥遥领先", "我们继续领先", "领先同行超过 50%")
i = (198, 328, 648, "以月色为剑", ["沫芒宫", "欧庇克莱歌剧院", "枫丹科学院"])
python = ("人生苦短", '我用 Python', True, 0x2c3)
在 Python 中,虽然元组是使用一对小括号将所有元素括起来,但实际上,小括号并不是必须的,只要将一组值用逗号分隔开,Python 就可以认为它是元组。
示例:
verse = "Non, le grand amour ne suffit pas.", "Seul un adieu fleurira.", "C'est notre histoire de vie, douce et amère."
输出该元组后,将显示以下内容:
('Non, le grand amour ne suffit pas.', 'Seul un adieu fleurira.', "C'est notre histoire de vie, douce et amère.")
如果要创建的元组只包括一个元素,则需要在定义元组时,在元组后面加一个逗号 ,
。
示例:
verse = ("Moi, je suis et serai toujours là,",)
输出 verse,将显示以下内容:
('Moi, je suis et serai toujours là,',)
而下述代码,则表示定义一个字符串:
verse = ("Moi, je suis et serai toujours là,")
输出 verse,将显示以下内容:
'Moi, je suis et serai toujours là,'
2.创建空元组
示例:
empty = ()
3.创建数值元组
在 Python 中,可以使用 tuple() 函数直接将 range() 函数循环出来的结果转换为元组。
tuple() 函数的基本语法如下:
tuple(data)
其中,data 表示可以转换为元组的数据,其类型可以是 range 对象、字符串、列表或者其他可迭代类型的数据。
示例:
# 创建一个 1 - 20(左闭右开,不包括 20)的奇数元组
a = tuple(range(1, 20, 2))
print(a)
输出:
(1, 3, 5, 7, 9, 11, 13, 15, 17, 19)
4.删除元组
对于已经创建的元组,当不再使用时,可以使用 del 语句将其删除。
用法:
del tuplename
其中,tuplename 为要删除的元组名称。
访问元组元素
类比列表的元素访问,其原理是完全一样的,这里不再过多赘述。
修改元组
由于元组是不可变序列,无法对它的单个元素值修改,但我们可以通过给元组重新赋值来修改元组。
示例:
language = ("C", "C++", "Java", "Python")
language = ("C", "C++", "C#", "Java")
print(language)
输出:
('C', 'C++', 'C#', 'Java')
元组推导式
使用元组推导式可以快速生成一个元组,它的表现形式和列表推导式类似,只是将列表推导式中的中括号 []
修改为小括号 ()
。
示例:
verse = (i for i in range(10))
print("生成的元组为", verse)
输出:
生成的元组为 <generator object <genexpr> at 0x000001F9C377F2A0>
从上述执行结果可以看出,使用元组推导式生成的结果并不是一个元组或者列表,而是一个生成器对象。要使用生成器对象,可以将其转换为元组或者列表。
示例:
verse = (i for i in range(10))
print("转换后", tuple(verse))
输出:
转换后 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
要使用生成器对象,还可以直接通过 for 循环遍历,或者直接使用 __next__() 方法进行遍历。
示例:
number = (i for i in range(3))
print(number.__init__())
print(number.__init__())
print(number.__init__())
print("转换后", tuple(number))
输出:
0
1
2
转换后 ()
再如,使用 for 循环遍历生成器对象,输出每个元素的值:
number = (i for i in range(3))
for i in number:
print(i)
print(tuple(number))
输出:
0
1
2
()
从上述两个示例可以看出,无论通过哪种方法遍历,遍历后的原生成器对象都已经不存在。
1.3.7 字典
字典是无序、可变的,保存的内容是以“键—值对”的形式存储的。类似于词典,它可以把单词和释义关联起来。通过单词就可以快速找到它的释义。其中,单词相当于键(key),而对应的释义相当于值 (value)。键是唯一的,而值可以有多个。
字典的主要特征如下:
- 通过键而不是下标存取数据
- 字典是任意对象的无序集合
- 字典是可变的,并且可以任意嵌套
- 字典的键必须唯一,不允许出现两个相同的键,如果出现两次,后者将会覆盖前者
- 字典的键必须不可变,所以可以使用数字、字符串或元组,但不能使用列表
字典的创建和删除
定义字典时,每个元素都包含两个部分—“键”和“值”,并且在“键”和“值”之间使用冒号分隔,相邻两个元素使用逗号分隔,所有元素放在一个大括号“{}”中。
用法:
dictionary = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3', ......, 'keyn': 'valuen'}
参数说明如下:
- dictionary:表示字典的名称
- key:表示键,必须是唯一的
- value:表示值,可以是任何数据类型
示例:
# 我们将尘世七执政中部分神明放进一个名叫 characters 的字典
characters = {"风神": "温迪", "岩神": "钟离", "雷神": "雷电将军", "草神": "纳西妲", "水神": "芙宁娜"}
同列表或元组一样,也可以创建空字典。在 Python 中,可以使用下列两种方法创建空字典:
dictionary = {}
或者:
dictionary = dict()
Python 的 dict() 方法除了可以创建一个空字典,还可以通过已有数据快速创建字典。
1.通过映射函数创建字典
用法:
dictionary = dict(zip(list1, list2))
参数说明如下:
- dictionary:表示字典的名称
- zip() 函数:用于将多个列表或元组对应位置的元素组合为元组,并返回包含这些内容的 zip 对象。如果想得到元组,可以使用 tuple() 函数将 zip 对象转换为元组;如果想得到列表,可以使用 list() 函数将其转换为列表。
- list1:表示一个列表,用于指定字典的键
- list2:表示一个列表,用于指定字典的值
如果 list1 和 list2 的长度不同,则与最短的列表长度相同。
示例:
key = ["风神", "岩神", "雷神", "草神", "水神"]
value = ["温迪", "钟离", "雷电将军", "纳西妲", "芙宁娜"]
characters = dict(zip(key, value))
print(characters)
输出:
{'风神': '温迪', '岩神': '钟离', '雷神': '雷电将军', '草神': '纳西妲', '水神': '芙宁娜'}
2.通过给定的“键—值对”创建字典
用法:
dictionary = dict(key1 = value1, key2 = value2, ......, keyn = valuen)
参数说明如下:
- dictionary:表示字典的名称
- key:表示键,必须是唯一的
- value:表示值,可以是任何数据类型
示例:
characters = dict("风神" = "温迪", "岩神" = "钟离", "雷神" = "雷电将军", "草神" = "纳西妲", "水神" = "芙宁娜")
print(characters)
在 Python 中,还可以使用 dict 对象的 fromkeys() 方法创建值为空的字典。
示例:
dictionary = dict.fromkeys(list1)
参数说明如下:
- dictionary:表示字典的名称
- list1:作为字典的键的列表
示例:
key = ["风神", "岩神", "雷神", "草神", "水神"]
characters = dict.fromkeys(key)
print(characters)
输出:
{'风神': None, '岩神': None, '雷神': None, '草神': None, '水神': None}
同列表和元组一样,对于不再需要的字典,也可以使用 del 语句将其删除。
示例:
del dictionary
另外,如果只是想删除字典的全部元素,可以使用字典对象的 clear() 方法。执行 clear() 方法后,原字典将变为空字典。
示例:
dictionary.clear()
除上述介绍的方法外,还可以使用字典对象的 pop() 方法删除并返回指定“键”的元素,以及使用字典对象的 popitem() 方法删除并返回字典中的一个元素。
访问字典
在 Python 中,如果想将字典的内容输出也比较简单,可以直接使用 print() 函数。
示例:
# 打印之前的 characters 字典
print(characters)
输出:
{'风神': '温迪', '岩神': '钟离', '雷神': '雷电将军', '草神': '纳西妲', '水神': '芙宁娜'}
然而,在使用字典时,很少会直接输出它的内容。一般需要根据指定的键得到相应的值。在 Python 中,访问字典的元素可以通过下标的方式实现,与列表和元组不同,这里的下标不是索引,而是键。
例如,想要获取“水神”的名字,可以使用下列代码:
print(characters["水神"])
输出:
芙宁娜
在上述方法获取指定键的值时,如果指定的键不存在,将抛出如下异常:
Traceback (most recent call last):
File "d:\Projects\Python\lesson\example.py", line 2, in <module>
print(characters["水神"])
~~~~~~~~~~^^^^^^
KeyError: '水神'
在实际开发中,很可能我们不知道当前存在什么键,所以要避免上述异常的产生。具体的解决方法是使用条件表达式对不存在的情况进行处理,即给一个默认值。
例如,可以将上述代码修改为:
print(characters["水神"] if "水神" in characters else "无")
当“水神”不存在时,将显示以下内容:
无
另外,Python 中推荐的方法是使用字典对象的 get() 方法获取指定键的值。
用法:
dictionary.get(key[,default])
其中,dictionary 为字典对象;key 为指定的键;default 为可选项,用于当指定的键不存在时,返回一个默认值,如果省略,则返回 None。
例如,通过 get() 方法获取“水神”的名字,可以使用下列代码:
print(characters.get("水神"))
输出:
芙宁娜
遍历字典
字典是以“键—值对”的形式存储数据的,所以就可能需要对这些“键—值对”进行获取。Python 提供了遍历字典的方法,通过遍历可以获取字典中的全部“键—值对”。
使用字典对象的 items() 方法可以获取字典的“键—值对”列表。
用法:
dictionary.items()
其中,dictionary 为字典对象;返回值为可遍历的“键—值对”元组列表。想要获取具体的“键—值对”,可以通过 for 循环遍历该元组列表。
示例:
characters = {"风神": "温迪", "岩神": "钟离", "雷神": "雷电将军", "草神": "纳西妲", "水神": "芙宁娜"}
for item in characters.items():
print(item)
输出:
('风神', '温迪')
('岩神', '钟离')
('雷神', '雷电将军')
('草神', '纳西妲')
('水神', '芙宁娜')
上述示例得到的是元组中的各个元素,如果想要获取具体的每个键和值,可以使用下列代码:
characters = {"风神": "温迪", "岩神": "钟离", "雷神": "雷电将军", "草神": "纳西妲", "水神": "芙宁娜"}
for key, value in characters.items():
print(key, "是", value)
输出:
风神 是 温迪
岩神 是 钟离
雷神 是 雷电将军
草神 是 纳西妲
水神 是 芙宁娜
添加、修改和删除字典元素
由于字典是可变序列,因此可以随时在其中添加“键—值对”,这和列表类似。向字典中添加元素的语法格式如下:
dictionary[key] = value
参数说明如下:
- dictionary:表示字典的名称
- key:表示元素的键,必须是唯一的
- value:表示元素的值,可以是任何数据类型
示例:
# 还是之前的场景,现有一个由部分尘世七执政组成的字典
characters = {"风神": "温迪", "岩神": "钟离", "雷神": "雷电将军", "草神": "纳西妲"}
# 添加“水神”芙宁娜
characters["水神"] = "芙宁娜"
# 输出
print(characters)
输出:
{'风神': '温迪', '岩神': '钟离', '雷神': '雷电将军', '草神': '纳西妲', '水神': '芙宁娜'}
由于在字典中,“键”必须是唯一的,因此如果新添加元素的“键”与已经存在的“键”重复,那么将使用新的“值”替换原来的“值”,相当于修改字典的元素。
示例:
characters = {"风神": "温迪", "岩神": "钟离", "雷神": "雷电将军", "草神": "纳西妲", "水神": "芙宁娜"}
# 将岩神的名字修改为摩拉克斯
characters["岩神"] = "摩拉克斯"
# 输出
print(characters)
输出:
{'风神': '温迪', '岩神': '摩拉克斯', '雷神': '雷电将军', '草神': '纳西妲', '水神': '芙宁娜'}
当字典中某个元素不需要时,可以使用 del 语句将其删除。例如,要删除字典 characters 的键为“风神”的元素,可以使用下列代码:
characters = {"风神": "温迪", "岩神": "钟离", "雷神": "雷电将军", "草神": "纳西妲", "水神": "芙宁娜"}
del characters["风神"]
print(characters)
输出:
{'岩神': '钟离', '雷神': '雷电将军', '草神': '纳西妲', '水神': '芙宁娜'}
字典推导式
使用字典推导式可以快速生成一个字典,它的表现形式和列表推导式类似。
示例:
key = ["风神", "岩神", "雷神", "草神", "水神"]
value = ["温迪", "钟离", "雷电将军", "纳西妲", "芙宁娜"]
characters = {key: value for key, value in zip(key, value)}
print(characters)
输出:
{'风神': '温迪', '岩神': '钟离', '雷神': '雷电将军', '草神': '纳西妲', '水神': '芙宁娜'}
二维字典
与二维列表类似,二维字典就是包含字典的字典。也就是一个字典中的元素又都是一个字典。
示例:
# 定义一个 characters_info 字典
characters_info = {
"风神": {
"姓名": "温迪",
"生日": "6月16日",
"所属": "蒙德城",
"神之心": "风",
"命之座": "歌仙座"
},
"岩神": {
"姓名": "钟离",
"生日": "12月31日",
"所属": "璃月港",
"神之心": "岩",
"命之座": "岩王帝君座"
},
"雷神": {
"姓名": "雷电将军",
"生日": "6月26日",
"所属": "稻妻城",
"神之心": "雷",
"命之座": "天下人座"
},
"草神": {
"姓名": "纳西妲",
"生日": "10月27日",
"所属": "须弥城",
"神之心": "草",
"命之座": "智慧主座"
},
"水神": {
"姓名": "芙宁娜",
"生日": "10月13日",
"所属": "枫丹廷",
"神之眼": "水",
"命之座": "司颂座"
}
}
# 输出水神的信息
print("姓名:" + characters_info["水神"]["姓名"])
print("生日:" + characters_info["水神"]["生日"])
print("所属:" + characters_info["水神"]["所属"])
print("神之眼:" + characters_info["水神"]["神之眼"])
print("命之座:" + characters_info["水神"]["命之座"])
输出:
姓名:芙宁娜
生日:10月13日
所属:枫丹廷
神之眼:水
命之座:司颂座
1.3.8 数据类型转换
Python 是动态类型的语言,使用变量时无需声明变量类型。虽然如此,但有时仍然需要用到类型转换。
例如,要想通过 print() 输出提示文字“你的身高:”和浮点型变量 height
的值,就需要将浮点型变量 height
转换为字符串。否则,将显示 TypeError 错误。
height = 175.3
print("你的身高:" + str(height))
在 Python 中,提供了如下表所示的函数进行各数据类型间的转换:
函数 | 作用 |
---|---|
int(x) | 将 x 转换为整型 |
float(x) | 将 x 转换为浮点型 |
complex(real [,imag]) | 创建一个复数 |
str(x) | 将 x 转换为字符串 |
repr(x) | 将 x 转换为表达式字符串 |
eval(str) | 计算在字符串中有效的 Python 表达式,并返回一个对象 |
chr(x) | 将整数 x 转换为一个字符 |
ord(x) | 将一个字符 x 转换为它对应的整数值 |
hex(x) | 将一个整数 x 转换为一个十六进制的字符串 |
oct(x) | 将一个整数 x 转换为一个八进制的字符串 |
bin(x) | 将一个整数 x 转换为一个二进制的字符串 |
例程
1.抹零结账
money = 28.5 + 2.6 + 11.4 + 15.8 + 18.2 # 累加总计金额
money_str = str(money) # 转换为字符串
print("商品总金额为:" + money_str)
money_real = int(money) # 进行抹零处理
money_real_str = str(money_real) # 转换为字符串
print("实收金额为:" + money_real_str)
输出:
商品总金额为:76.5
实收金额为:76
好好好好好,再也不用担心孩子不会写代码啦!(抱