python基础全部教程
一、python概述
Python 是一门解释型、面向对象、动态类型的高级编程语言,由荷兰程序员吉多・范罗苏姆(Guido van Rossum,又称 “龟叔”)于 1989 年构思,1991 年正式发布。它的核心设计理念是 “优雅、明确、简单”,致力于让开发者用更少的代码实现更强大的功能,如今已成为全球最流行的编程语言之一。
二、python注意事项
1.python以.py为扩展名,但不是必须的
2.python区分大小写
3.语句后面可以不加 ;号
4.字符串内容和数字用,号链接,不是+号
5.在python中,非0属性都为真,0属性(如:” “、())为假
6.在print(end = “”) 代表不换行
7.pass 占位符,在方法或函数中什么都不想写的时候使用,防报错
多行注释和单行注释:
1.# 单行注释
2.””” 内容 “”” 多行注释
3.’’’ 内容 ‘’’ 多行注释
三、基本变量
1.基本概述
无论哪种高级语言程序,变量都是其程序基本组成单位
变量有三个基本要素:类型 名称 值!!!!
python变量在使用的时候必须赋值!!!!!
查看类型的数据: type(object) 如: a =10 print(type(a)) #输出 <class “int”>!!!!
前面加上 f 也可以查询类型: print(f”hello 的类型是{type(“hello”)}”)
查看变量是多少字节:print(sys.getsizeof) 导入 import sys
id(变量名) 可以查询他的地址
1 | a = 1 |
2.数据类型
| 变量类型(数据类型) | 具体说明 | 定义 / 标识 | 示例代码 | 核心特性 | 可变性 |
|---|---|---|---|---|---|
| 整型(int) | 整数(正 / 负 / 零,无大小限制) | 无特殊标识,直接书写整数 | a = 10、b = -5、c = 0、d = 1000000000000 |
1. 支持加减乘除、取模、幂运算等常见数值运算;2. Python 3 无long类型,所有整数统一为int;3. 支持二进制(0b开头)、八进制(0o开头)、十六进制(0x开头)表示 |
不可变 |
| 浮点型(float) | 小数(含科学计数法表示) | 带小数点,或科学计数法标识 | a = 3.14、b = -0.5、c = 2.0、d = 1e5(等价于 100000.0)、e = 2.3e-4(等价于 0.00023) |
1. 基于二进制存储,存在精度误差(如0.1 + 0.2 ≠ 0.3);2. 支持所有数值运算,运算结果可能转为浮点型;3. 无穷大表示为float('inf'),非数字表示为float('nan') |
不可变 |
| 布尔型(bool) | 逻辑判断值(仅两种结果) | 仅True(真)/False(假) |
a = True、b = False、c = 10 > 5(结果为True)、d = (1 == 2)(结果为False) |
1. 本质是特殊整型(True等价于 1,False等价于 0),可参与数值运算;2. 用于条件判断(if、while)、逻辑运算(and、or、not);3. 非 0 数值、非空字符串等会被判定为True,0、空字符串、None会被判定为False |
不可变 |
| 字符串(str) | 字符序列(文本数据) | 单 / 双 / 三引号包裹 | a = "hello"、b = 'Python'、c = """多行字符串"""、d = '123' |
1 | #1.数据类型 |
3.格式化输出
旧版: print(“%d”,变量名) 新版: print(f”{变量名}”) 或 printf(“{}”.format(变量名))
| 占位符 | 对应数据类型 | 核心说明 | 示例代码 | 运行结果 |
|---|---|---|---|---|
%d |
整型(int) | 格式化十进制整数,支持补零、指定宽度 | print("数字:%d,补零到5位:%05d" % (123, 123)) |
数字:123,补零到 5 位:00123 |
%f |
浮点型(float) | 格式化浮点数,默认保留 6 位小数,可指定小数位数 | print("默认:%f,保留2位:%.2f" % (3.1415, 3.1415)) |
默认:3.141500,保留 2 位:3.14 |
%s |
所有类型(万能) | 兼容字符串、整型、浮点型、布尔型等,自动转字符串 | print("姓名:%s,年龄:%s,成绩:%s" % ("小美", 18, 95.5)) |
姓名:小美,年龄:18,成绩:95.5 |
%x/%X |
整型(int) | 格式化十六进制整数,%x小写、%X大写(可选,高频用于进制转换场景) |
print("十六进制小写:%x,大写:%X" % (255, 255)) |
十六进制小写:ff,大写:FF |
1 | 三、格式化输出 |
4.驻留机制
使用id()函数 查看变量的内存地址 python仅支持int string bool类型其他不可以!!!
str = “hello”
str2 = “hello”
str3 = “hello”
当不同的变量取相同类型和内容的值时,python不会在开辟新的空间存放相同的值,而是不同的变量指向一个值
如:str、str2、str3只会指向一个”hello”!!!!!!!!!!!
注:在控制台特殊情况:[-5,256]在控制台的变量超过这个数组数字时,字符串驻留机制会失效!!!!
1 | #字符串驻留机制 使用id()函数 |
5.数据转换
在python中不同数据类型是不可以进行拼接的,这个问题如何解决?
1.隐式转换
在运算的时候低的数据类型会自动转向高的数据类型
1 | #隐式转换 |
2.显式转换 数据类型(变量名)
1 | #显式转换 |
四、运算符
1.算术符时表示一种特殊的运算符,用于表示数据的运算、赋值和比较
2.算数运算符
1 | 1.算数运算符 |
3.比较运算符
1 | 2.比较运算符 |
4.逻辑运算符
1 | 3.逻辑运算符 |
5.赋值运算符
1 | 4.赋值运算符 |
6.三元运算符
1 | 5.三元运算符 |
7.位运算符
1 | 6.位运算符(难点) |
五、键盘输入和随机函数
1.键盘输入
变量名 = input()
注:input接收的都是字符串型!!!!
2.随机数
使用random模块里面的randint()函数随机生成数 导入 import random
语法:random.randint(a,b) 包含a和b
1 | name = input("请输入名字:") |
六、流程控制
1.if语句
if 条件表达式:
需要运行代码块(内容)
elif:
需要运行代码块(内容2)
… 多个elif
else: 注:每个代码块需要有相同的代码块(tab 或 空格)
需要运行代码块(内容3) 最短的缩进对较长的缩进有包含关系,缩进前后没有要求
2.for循环
for 变量 in 范围/列表:
(需要循环的语句)
如果不用列表循环,可以用范围-内置函数range(start,stop,step = 1)(开始,停止,步长)
3.while循环
while 判断条件(为真执行):
(需要循环的语句)
else:
(执行的语句)
else配合break
4.match语句
match语句(python3.10版本以上才有)
和java的switch相似,但没有break;
语句:match (条件语句):
case 条件1:
输出
case 条件2:
输出
5.break
用于在for 和 while 语句当中,它会终结最近的外层循环,如果循环有可选的 else 语句,也会跳过该句子
6.continue
用于在for 和 while 语句当中,用于结束本次循环,继续下一个循环
7.return
return使用在函数,表示跳出当前函数
七、函数
1 | 1.为什么要函数?如果一个页面或其他页面需要执行很多相同或类似的方法,没有函数就会 代码累赘,不利于代码维护! |
1 | 二、系统函数和自定义函数 |
八、数据容器
1.列表
Python 列表是有序、可变的容器类型.
格式: 列表名 = [元素,元素…] 遍历支持倒叙: -1是最后一个
1 | list = [11,33,44,55,66,77] |
常用方法:
| 类别 | 方法 / 操作名称 | 核心语法 | 功能描述 | 示例代码 | 运行结果(基于初始列表 lst = [1, 2, 3, 2, 4]) |
|---|---|---|---|---|---|
| 元素添加相关 | append() |
lst.append(元素) |
在列表末尾添加单个元素(支持任意数据类型),直接修改原列表,无返回值 | lst.append(5)``print(lst) |
[1, 2, 3, 2, 4, 5] |
insert() |
lst.insert(索引, 元素) |
在列表指定索引位置插入单个元素,索引超出范围则插入至末尾 / 开头,直接修改原列表,无返回值 | lst.insert(2, 10)``print(lst) |
[1, 2, 10, 3, 2, 4] |
|
extend() |
lst.extend(可迭代对象) |
将可迭代对象(列表、元组、字符串等)的所有元素追加至列表末尾,直接修改原列表,无返回值 | lst.extend([5, 6])``print(lst) |
[1, 2, 3, 2, 4, 5, 6] |
|
| 元素移除相关 | pop() |
lst.pop(索引)(索引可选,默认 - 1) |
删除列表指定索引对应的元素,返回被删除的元素,直接修改原列表;默认删除末尾元素 | deleted = lst.pop(3)``print(lst, deleted) |
[1, 2, 3, 4] 2 |
remove() |
lst.remove(元素值) |
删除列表中第一个出现的指定元素值,直接修改原列表,无返回值;元素不存在则抛出ValueError |
lst.remove(2)``print(lst) |
[1, 3, 2, 4] |
|
clear() |
lst.clear() |
清空列表内所有元素,直接修改原列表,使其变为空列表,无返回值 | lst.clear()``print(lst) |
[] |
|
| 元素调整相关 | 索引直接赋值 | lst[索引] = 新元素 |
无专用方法,通过索引直接替换对应位置的元素,直接修改原列表 | lst[1] = 20``print(lst) |
[1, 20, 3, 2, 4] |
reverse() |
lst.reverse() |
反转列表内元素的排列顺序,直接修改原列表,无返回值 | lst.reverse()``print(lst) |
[4, 2, 3, 2, 1] |
|
sort() |
lst.sort(key=None, reverse=False) |
对列表元素进行排序,默认升序;key指定排序依据,reverse=True为降序,直接修改原列表,无返回值 |
lst.sort(reverse=True)``print(lst) |
[4, 3, 2, 2, 1] |
|
| 元素查询与统计相关 | index() |
lst.index(元素值, 起始索引, 结束索引) |
查询指定元素值第一次出现的索引,可指定查询范围,返回对应索引值;元素不存在则抛出ValueError |
idx = lst.index(2)``print(idx) |
1 |
count() |
lst.count(元素值) |
统计指定元素值在列表中出现的总次数,返回非负整数;无该元素则返回 0 | cnt = lst.count(2)``print(cnt) |
2 |
|
in(成员运算符) |
元素 in lst |
判断指定元素是否存在于列表中,返回布尔值True/False,高频查询操作 |
print(2 in lst)``print(6 in lst) |
True``False |
|
not in(成员运算符) |
元素 not in lst |
判断指定元素是否不存在于列表中,返回布尔值True/False,与in功能相反 |
print(6 not in lst)``print(2 not in lst) |
True``False |
|
| 列表复制相关 | copy() |
new_lst = lst.copy() |
复制列表内容,返回一个与原列表内容一致的新列表(浅拷贝),不修改原列表 | new_lst = lst.copy()``new_lst.append(5)``print(lst, new_lst) |
[1, 2, 3, 2, 4] [1, 2, 3, 2, 4, 5] |
| 列表长度统计 | len()(内置函数) |
len(lst) |
统计列表的元素总个数(即列表长度),非列表专属但高频用于列表,返回正整数 | length = len(lst)``print(length) |
5 |
| 列表拼接与重复 | +(拼接运算符) |
lst1 + lst2 |
将两个列表拼接为一个新列表,不修改原列表,返回新列表 | lst2 = [5, 6]``print(lst + lst2) |
[1, 2, 3, 2, 4, 5, 6] |
*(重复运算符) |
lst * n(n 为正整数) |
将列表中的元素重复n次,生成一个新列表,不修改原列表,返回新列表 |
print(lst * 2) |
[1, 2, 3, 2, 4, 1, 2, 3, 2, 4] |
|
| 列表转换与遍历辅助 | join()(字符串方法,配合列表) |
"分隔符".join(lst_str) |
将字符串列表拼接为单个字符串,分隔符可选,返回新字符串;非字符串列表需先转换 | lst_str = ["Python", "Java", "C++"]``print("-".join(lst_str)) |
Python-Java-C++ |
2.元组
Python 元组是有序、不可变的容器类型,其操作以 “查询、统计、辅助转换” 为主,无修改原元组的方法(因不可变特性)
格式: 元组名 = (元素,元素…) 注:如果是单个元素必须带逗号: tuple = (11,)
1 | tuple2 = (111,33,4455,666) |
常用方法:
| 元素查询与定位相关 | 索引取值 | tup[索引] |
通过索引获取对应位置的元素,索引支持正索引(从 0 开始)和负索引(从 - 1 开始) | print(tup[2])``print(tup[-1]) |
3``4 |
|---|---|---|---|---|---|
index() |
tup.index(元素值, 起始索引, 结束索引) |
查询指定元素值第一次出现的索引,可指定查询范围,返回对应索引值;元素不存在则抛出ValueError |
idx = tup.index(2)``print(idx) |
1 |
|
| 元素统计与判断相关 | count() |
tup.count(元素值) |
统计指定元素值在元组中出现的总次数,返回非负整数;无该元素则返回 0 | cnt = tup.count(2)``print(cnt) |
2 |
in(成员运算符) |
元素 in tup |
判断指定元素是否存在于元组中,返回布尔值True/False,高频查询操作 |
print(2 in tup)``print(6 in tup) |
True``False |
|
not in(成员运算符) |
元素 not in tup |
判断指定元素是否不存在于元组中,返回布尔值True/False,与in功能相反 |
print(6 not in tup)``print(2 not in tup) |
True``False |
|
| 元组长度与极值统计 | len()(内置函数) |
len(tup) |
统计元组的元素总个数(即元组长度),非元组专属但高频用于元组,返回正整数 | length = len(tup)``print(length) |
5 |
max()(内置函数) |
max(tup) |
统计元组中元素的最大值,要求元组内元素类型可比较(如均为数值、均为字符串) | print(max(tup)) |
4 |
|
min()(内置函数) |
min(tup) |
统计元组中元素的最小值,要求元组内元素类型可比较(如均为数值、均为字符串) | print(min(tup)) |
1 |
|
| 转换为列表 | list(tup) |
将元组转换为可变的列表,便于后续进行元素调整操作,返回新列表 | lst = list(tup)``lst.append(5)``print(lst) |
[1, 2, 3, 2, 4, 5] |
|
拼接为字符串(配合join()) |
"分隔符".join(map(str, tup)) |
先将元组内的元素转换为字符串类型,再拼接为单个字符串,返回新字符串 | print("-".join(map(str, tup))) |
1-2-3-2-4 |
3.字符串
Python 字符串是有序、不可变的字符序列,操作以 “查询、转换、拼接、处理” 为主,无修改原字符串的方法(因不可变特性,所有修改类操作均返回新字符串)。
1 | print(ord("陈"))#38472 使用ord打印ASCLL码值 |
常用方法:
| 字符查询与定位相关 | 索引取值 | s[索引] |
通过索引获取对应位置的字符,支持正索引(从 0 开始)和负索引(从 - 1 开始) | print(s[6])``print(s[-3]) |
P / 1 |
|---|---|---|---|---|---|
index() |
s.index(子串, 起始索引, 结束索引) |
查询子串第一次出现的起始索引,可指定查询范围,返回索引值;子串不存在抛出ValueError |
idx = s.index("Python")``print(idx) |
6 |
|
rindex() |
s.rindex(子串, 起始索引, 结束索引) |
从右往左查询子串第一次出现的起始索引,返回索引值;子串不存在抛出ValueError |
idx = s.rindex("l")``print(idx) |
3 |
|
| 字符统计与判断相关 | count() |
s.count(子串, 起始索引, 结束索引) |
统计子串在字符串中出现的总次数,返回非负整数;无子串则返回 0 | cnt = s.count("l")``print(cnt) |
2 |
in(成员运算符) |
子串 in s |
判断子串是否存在于字符串中,返回布尔值True/False |
print("Python" in s)``print("Java" in s) |
True / False |
|
not in(成员运算符) |
子串 not in s |
判断子串是否不存在于字符串中,返回布尔值True/False |
print("Java" not in s)``print("Python" not in s) |
True / False |
|
len()(内置函数) |
len(s) |
统计字符串的字符总个数(长度),非字符串专属但高频使用,返回正整数 | length = len(s)``print(length) |
15(含空格和数字) |
|
| 字符串大小写转换相关 | upper() |
s.upper() |
将字符串中所有小写字母转为大写,返回新字符串,不修改原字符串 | print(s.upper()) |
HELLO PYTHON 123 |
lower() |
s.lower() |
将字符串中所有大写字母转为小写,返回新字符串,不修改原字符串 | print(s.lower()) |
hello python 123 |
|
capitalize() |
s.capitalize() |
将字符串首字符转为大写,其余字符转为小写,返回新字符串 | print("hello PYTHON".capitalize()) |
Hello python |
|
title() |
s.title() |
将字符串中每个单词的首字符转为大写,其余转为小写,返回新字符串 | print("hello python".title()) |
Hello Python |
|
| 字符串去除空白 / 指定字符相关 | strip() |
s.strip(指定字符) |
去除字符串首尾的空白字符(默认)或指定字符,返回新字符串 | print(" Hello Python ".strip())``print("###Python###".strip("#")) |
Hello Python / Python |
lstrip() |
s.lstrip(指定字符) |
去除字符串左侧的空白字符(默认)或指定字符,返回新字符串 | print(" Hello Python ".lstrip()) |
Hello Python |
|
rstrip() |
s.rstrip(指定字符) |
去除字符串右侧的空白字符(默认)或指定字符,返回新字符串 | print(" Hello Python ".rstrip()) |
Hello Python |
|
| 字符串分割与拼接相关 | split() |
s.split(分隔符, 最大分割次数) |
以指定分隔符分割字符串,返回列表;默认以空白字符分割,最大分割次数可选 | print(s.split())``print(s.split(" ", 1)) |
['Hello', 'Python', '123'] / ['Hello', 'Python 123'] |
rsplit() |
s.rsplit(分隔符, 最大分割次数) |
从右往左以指定分隔符分割字符串,返回列表;最大分割次数可选 | print(s.rsplit(" ", 1)) |
['Hello Python', '123'] |
|
join() |
"分隔符".join(可迭代对象) |
将可迭代对象(字符串、列表等)中的元素用指定分隔符拼接,返回新字符串 | lst = ["Hello", "Python", "123"]``print("-".join(lst)) |
Hello-Python-123 |
|
| 字符串替换与匹配相关 | replace() |
s.replace(旧子串, 新子串, 替换次数) |
将字符串中的旧子串替换为新子串,替换次数可选(默认全部替换),返回新字符串 | print(s.replace("Python", "Java"))``print(s.replace("l", "L", 1)) |
Hello Java 123 / HeLlo Python 123 |
startswith() |
s.startswith(子串, 起始索引, 结束索引) |
判断字符串是否以指定子串开头,返回布尔值True/False |
print(s.startswith("Hello"))``print(s.startswith("Python")) |
True / False |
|
endswith() |
s.endswith(子串, 起始索引, 结束索引) |
判断字符串是否以指定子串结尾,返回布尔值True/False |
print(s.endswith("123"))``print(s.endswith("Python")) |
True / False |
|
| 字符串格式与判断类型相关 | isdigit() |
s.isdigit() |
判断字符串是否全部由数字组成,返回布尔值True/False |
print("123".isdigit())``print(s.isdigit()) |
True / False |
isalpha() |
s.isalpha() |
判断字符串是否全部由字母组成(无数字、空格等),返回布尔值True/False |
print("Python".isalpha())``print(s.isalpha()) |
True / False |
|
isspace() |
s.isspace() |
判断字符串是否全部由空白字符(空格、换行等)组成,返回布尔值True/False |
print(" ".isspace())``print(s.isspace()) |
True / False |
|
| 字符串拼接与重复 | +(拼接运算符) |
s1 + s2 |
将两个字符串拼接为一个新字符串,不修改原字符串,返回新字符串 | s1 = "Hello"``s2 = "Python"``print(s1 + " " + s2) |
Hello Python |
4.切片
Python 切片是一种高效截取有序可迭代对象(列表、元组、字符串等)部分元素的语法,无需循环即可快速获取指定范围的内容,返回一个与原对象类型一致的新对象(不修改原对象),核心适用于所有有序、可索引的容器类型。
格式: 容器名[起始索引:结束索引:步长] 支持负数查询
1 | str = "hello,python" |
5.集合
Python 集合是无序、不重复、可变的容器类型(另有不可变集合frozenset),核心特性是 “元素唯一性” 和 “支持数学集合运算”,操作以 “元素管理、集合间运算、判断校验” 为主.
格式: 集合名 = (元素,元素…) 创建空集合: 集合名 = set()
1 | set_one = {1000,33,44,55,66,77} |
常用方法:
| 元素添加相关 | add() |
s.add(元素) |
向集合中添加单个元素,元素已存在则不执行任何操作,直接修改原集合 | s.add(6)``print(s) |
{1, 2, 3, 4, 5, 6} |
|||
|---|---|---|---|---|---|---|---|---|
update() |
s.update(可迭代对象) |
将可迭代对象中的所有元素批量添加到集合中,自动去重,直接修改原集合 | s.update([6,7,8])``print(s) |
{1, 2, 3, 4, 5, 6, 7, 8} |
||||
| 元素移除相关 | remove() |
s.remove(元素) |
从集合中删除指定元素,元素不存在则抛出KeyError,直接修改原集合 |
s.remove(5)``print(s) |
{1, 2, 3, 4} |
|||
discard() |
s.discard(元素) |
从集合中删除指定元素,元素不存在则不执行任何操作,直接修改原集合(比remove()更安全) |
s.discard(5)``s.discard(10)``print(s) |
{1, 2, 3, 4}(删除 10 无报错) |
||||
pop() |
s.pop() |
随机删除并返回集合中的一个元素(因集合无序,无法指定索引),直接修改原集合;空集合调用抛出KeyError |
deleted = s.pop()``print(s, deleted) |
{2, 3, 4, 5} 1(删除结果随机,仅作示例) |
||||
clear() |
s.clear() |
清空集合中所有元素,直接修改原集合,使其变为空集合 | s.clear()``print(s) |
set() |
||||
| 元素判断与统计相关 | in(成员运算符) |
元素 in s |
判断指定元素是否存在于集合中,返回布尔值True/False,因集合哈希存储,查询效率远高于列表 / 元组 |
print(3 in s)``print(10 in s) |
True / False |
|||
not in(成员运算符) |
元素 not in s |
判断指定元素是否不存在于集合中,返回布尔值True/False |
print(10 not in s)``print(3 not in s) |
True / False |
||||
len()(内置函数) |
len(s) |
统计集合中元素的总个数(长度),非集合专属但高频使用,返回正整数 | length = len(s)``print(length) |
5 |
||||
| 集合间数学运算相关 | union() / ` |
`(并集) | s.union(s2) / `s |
s2` | 求两个集合的并集(包含所有在s或s2中的元素),返回新集合,不修改原集合 |
`print(s.union(s2))``print(s | s2)` | {1, 2, 3, 4, 5, 6, 7, 8}(两种语法结果一致) |
intersection() / &(交集) |
s.intersection(s2) / s & s2 |
求两个集合的交集(包含同时在s和s2中的元素),返回新集合,不修改原集合 |
print(s.intersection(s2))``print(s & s2) |
{4, 5}(两种语法结果一致) |
||||
difference() / -(差集) |
s.difference(s2) / s - s2 |
求两个集合的差集(包含在s中但不在s2中的元素),返回新集合,不修改原集合 |
print(s.difference(s2))``print(s - s2) |
{1, 2, 3}(两种语法结果一致) |
||||
symmetric_difference() / ^(对称差集) |
s.symmetric_difference(s2) / s ^ s2 |
求两个集合的对称差集(包含在s或s2中,但不同时在两个集合中的元素),返回新集合,不修改原集合 |
print(s.symmetric_difference(s2))``print(s ^ s2) |
{1, 2, 3, 6, 7, 8}(两种语法结果一致) |
||||
| 集合间关系判断相关 | issubset() / <=(子集判断) |
s.issubset(s2) / s <= s2 |
判断s是否是s2的子集(s的所有元素都在s2中),返回布尔值True/False |
s3 = {4,5}``print(s3.issubset(s))``print(s3 <= s) |
True(两种语法结果一致) |
|||
issuperset() / >=(超集判断) |
s.issuperset(s2) / s >= s2 |
判断s是否是s2的超集(s2的所有元素都在s中),返回布尔值True/False |
print(s.issuperset(s3))``print(s >= s3) |
True(两种语法结果一致) |
||||
isdisjoint()(不相交判断) |
s.isdisjoint(s2) |
判断两个集合是否没有公共元素,返回布尔值True/False |
s4 = {9,10}``print(s.isdisjoint(s4))``print(s.isdisjoint(s2)) |
True / False |
||||
| 集合辅助操作相关 | 转换为列表 / 元组 | list(s) / tuple(s) |
将集合转换为列表 / 元组(元素无序,因集合本身无序) | print(list(s))``print(tuple(s)) |
[1, 2, 3, 4, 5](顺序随机) / (1, 2, 3, 4, 5)(顺序随机) |
|||
| 批量去重(列表转集合) | list(set(列表)) |
6.字典
Python 字典是无序(Python 3.7 + 默认有序)、键值对映射、可变的容器类型,核心特性是 “通过键快速查找值”(哈希表实现),操作以 “键值对管理、查询匹配、结构调整” 为主。
格式: 字典名 = {键:值,键:值…} 已键值对的形式存储
1 | dict_one = {"小陈": 1001,"小李":1002} |
常用方法:
| 键值对查询与获取相关 | 键索引取值 | d[键] |
通过键获取对应的值,键不存在则抛出KeyError |
print(d["name"])``print(d["age"]) |
小美 / 18 |
|---|---|---|---|---|---|
get() |
d.get(键, 默认值=None) |
通过键获取对应的值,键不存在则返回默认值(默认None,不报错) |
print(d.get("score"))``print(d.get("gender", "未知")) |
95 / 未知 |
|
keys() |
d.keys() |
获取字典中所有的键,返回可迭代的dict_keys对象(可转为列表) |
print(d.keys())``print(list(d.keys())) |
dict_keys(['name', 'age', 'score']) / ['name', 'age', 'score'] |
|
values() |
d.values() |
获取字典中所有的值,返回可迭代的dict_values对象(可转为列表) |
print(d.values())``print(list(d.values())) |
dict_values(['小美', 18, 95]) / ['小美', 18, 95] |
|
items() |
d.items() |
获取字典中所有的键值对(每个元素为(键, 值)元组),返回可迭代的dict_items对象 |
print(d.items())``print(list(d.items())) |
dict_items([('name', '小美'), ('age', 18), ('score', 95)]) / [('name', '小美'), ('age', 18), ('score', 95)] |
|
setdefault() |
d.setdefault(键, 默认值=None) |
获取键对应的值,键不存在则添加该键并赋值为默认值,返回对应的值 | print(d.setdefault("age"))``print(d.setdefault("gender", "女"))``print(d) |
18 / 女 / {'name': '小美', 'age': 18, 'score': 95, 'gender': '女'} |
|
| 键值对添加与更新相关 | 键索引赋值 | d[键] = 值 |
键存在则更新对应的值,键不存在则添加新的键值对,直接修改原字典 | d["score"] = 98``d["gender"] = "女"``print(d) |
{'name': '小美', 'age': 18, 'score': 98, 'gender': '女'} |
update() |
d.update(字典/可迭代对象/关键字参数) |
批量更新 / 添加键值对,键存在则更新,不存在则添加,直接修改原字典 | d.update({"age": 19, "city": "北京"})``d.update(score=100)``print(d) |
{'name': '小美', 'age': 19, 'score': 100, 'gender': '女', 'city': '北京'} |
|
| 键值对移除相关 | pop() |
d.pop(键, 默认值) |
删除指定键对应的键值对,返回对应的值;键不存在时,指定默认值则返回默认值,否则抛出KeyError |
deleted = d.pop("score")``print(d, deleted) |
{'name': '小美', 'age': 18} 95 |
popitem() |
d.popitem() |
删除并返回字典中最后一个插入的键值对(元组形式),空字典调用抛出KeyError(Python 3.7 + 有序) |
item = d.popitem()``print(d, item) |
{'name': '小美', 'age': 18} ('score', 95) |
|
clear() |
d.clear() |
清空字典中所有的键值对,直接修改原字典,使其变为空字典 | d.clear()``print(d) |
{} |
|
| 键的判断与字典统计相关 | in(成员运算符) |
键 in d |
判断指定键是否存在于字典中,返回布尔值True/False(仅判断键,不判断值) |
print("name" in d)``print("gender" in d) |
True / False |
not in(成员运算符) |
键 not in d |
判断指定键是否不存在于字典中,返回布尔值True/False |
print("gender" not in d)``print("name" not in d) |
True / False |
|
len()(内置函数) |
len(d) |
统计字典中键值对的总个数(长度),非字典专属但高频使用,返回正整数 | length = len(d)``print(length) |
3 |
|
| 字典复制与转换相关 | copy() |
new_d = d.copy() |
复制字典,返回一个与原字典内容相同的新字典(浅拷贝),不修改原字典 | new_d = d.copy()``new_d["age"] = 19``print(d, new_d) |
{'name': '小美', 'age': 18, 'score': 95} {'name': '小美', 'age': 19, 'score': 95} |
| 转换为键 / 值列表 | list(d.keys()) / list(d.values()) |
将字典的键 / 值转换为列表,便于后续遍历和处理 | print(list(d.keys()))``print(list(d.values())) |
['name', 'age', 'score'] / ['小美', 18, 95] |
|
| 转换为键值对列表 | list(d.items()) |
将字典的键值对转换为包含元组的列表,便于批量处理 | print(list(d.items())) |
[('name', '小美'), ('age', 18), ('score', 95)] |
|
| 字典遍历辅助相关 | 遍历键(默认) | for 键 in d: |
直接遍历字典,默认遍历所有的键 | for k in d:``print(k) |
依次输出:name、age、score |
| 遍历键值对 | for 键, 值 in d.items(): |
遍历字典的所有键值对,同时获取键和值(最常用) | for k, v in d.items():``print(f"{k}: {v}") |
依次输出:name: 小美、age: 18、score: 95 |
7.容器互相转换
list(x) |
列表 | x 为可迭代对象(元组、字符串、集合、字典等) |
|---|---|---|
tuple(x) |
元组 | x 为可迭代对象 |
set(x) |
集合 | x 为可迭代对象(元素需为不可变类型),自动去重 |
str(x) |
字符串 | 任意对象(容器转换后为其「字符串表示形式」,非元素拆分) |
九、模块
1.模块导入方式
直接导入整个模块:
import 模块名,使用时需加「模块名.」前缀;导入模块并指定别名:
import 模块名 as 别名,简化长模块名的调用;按需导入指定内容:
from 模块名 import 变量/函数/类,可直接使用,无需前缀;导入模块所有内容:
from 模块名 import *(不推荐),易引发命名冲突。
2.包
十、注解
1.Python 的 类型注解(Type Hint) 是一种用于标注变量、函数 / 方法的参数和返回值预期类型的语法,核心价值是提升代码可读性、提供开发工具提示、实现文档化说明,并非强制类型检查(Python 运行时会忽略类型注解,不影响程序执行)。
2.函数\方法注解 形参 : 类型
1 | def f1(name : str): #标识参数类型为字符串 |
3.函数 / 方法返回值注解 函数() -> 返回值类型
1 | def sum(num1,num2) -> int: #标识返回值为int类型 |
4.变量注解 变量 : 类型
1 | name : str = "你好" |
5.复杂类型注解
1 | lists[int] = [1,2,3,4] #参数为int类型 |
6.多类型注解
1 | money : int | str |
十一、面向对象编程
1.类的定义
class 类名{
成员属性;
成员方法;
}
调用: 类名();
1 | #定义一个猫类,age,name,color 是属性,又称成员变量 |
2.静态方法
使用: @staticmethod标识 此时调用该方法只要: 类名.方法() 并且函数不需要写self!!!
1 | class dog: |
3.构造函数
当实现该类时自动调用该方法
1 | class person: |
4.三大特性
面向对象三大特性: 封装、继承、多态
1.封装
1 | 封装是将抽象出的数据(属性)和对数据的操作封装(方法)在一起,将数据保护在内部,可以被用户调用 |
1 | class cleak: |
2.继承
1 | 创建一个A类、B类、C类,A类有B、C类所有的特征;B、C类可以继承A类。A类可以称为父类(基类),B、C为子类(派生类) |
1 | #父类 |
3.多态
1 | class Animal: |
5.魔法方法
1 | 什么是模式方法?在python中所有以双下划线包裹的都称为魔术方法,它是一个特殊的方法,不需要调用就会自己执行! |
1 | class A: |
十二、抽象类
1.Python 中的抽象类是包含一个或多个抽象方法的特殊类,抽象方法仅定义方法签名(无具体实现逻辑),要求其子类必须重写实现该抽象方法;抽象类无法直接实例化,仅作为子类的 “模板” 存在,用于规范子类的接口和行为。
python使用抽象类需要引包 ABC from abc import ABC,abstractmethod
抽象类需要继承ABC 方法使用@abstractmethod声明抽象方法
1 | from abc import ABC, abstractmethod |
十三、异常
1.异常基本写法
1 | 1.语法:(try-except) |
2.异常类
| 异常类名称 | 异常描述 | 常见触发场景 |
|---|---|---|
SyntaxError |
语法错误(编译时异常) | 缺少冒号、括号不匹配、关键字拼写错误(如pront代替print) |
NameError |
访问未定义的变量 / 函数 / 类 | 变量名拼写错误、使用未声明的变量(如print(a),其中a未定义) |
ZeroDivisionError |
除零错误 | 数字除以 0(如10 / 0、20 // 0) |
TypeError |
类型错误(操作 / 函数应用于不兼容的类型) | 不同类型直接运算(如10 + "20")、函数传入参数类型不符(如len(123)) |
ValueError |
值错误(类型正确但值不合法) | 字符串转数字失败(如int("abc"))、列表中查找不存在的值([1,2].index(3)) |
KeyError |
字典键不存在 | 访问字典中未定义的键(如{"name":"Python"}["age"]) |
IndexError |
索引越界错误 | 访问列表 / 元组 / 字符串的无效索引(如[1,2,3][5]、"abc"[10]) |
FileNotFoundError |
文件 / 目录不存在 | 以读模式打开不存在的文件(如open("nonexist.txt", "r")) |
AttributeError |
属性 / 方法不存在 | 访问对象未定义的属性 / 方法(如"abc".append(1)、class A: pass; A().b) |
ImportError/ModuleNotFoundError |
模块导入失败 | 导入不存在的模块(如import nonexist_module)、从模块导入不存在的对象(from os import nonexist_func) |
KeyboardInterrupt |
用户中断程序(Ctrl+C) | 程序运行时按下Ctrl+C终止执行 |
Exception |
所有非系统退出类异常的基类(可捕获大部分运行时异常) | 作为异常捕获的兜底(不推荐直接捕获,优先捕获具体异常) |
3.主动抛出异常
raise 关键字
1 | try: |
4.自定义异常
当 Python 内置异常无法满足业务需求时,可以自定义异常类,通常继承自Exception(不推荐继承BaseException,后者包含系统退出类异常)。
1 | class AgeError(Exception): #自定义异常类 |
十四、文件操作
1.核心操作
| 模式 | 中文说明 | 操作权限 | 注意事项 |
|---|---|---|---|
'r' |
只读(默认) | 仅能读取文件内容,不能修改 / 写入 | 文件必须存在,否则抛出FileNotFoundError |
'w' |
只写 | 清空文件原有内容并写入新内容;若文件不存在,则创建新文件 | 会覆盖原有文件内容,慎用(需备份原有数据) |
'a' |
追加写 | 在文件末尾追加写入新内容;若文件不存在,则创建新文件 | 不会覆盖原有内容,适合日志记录、数据追加等场景 |
'r+' |
读写 | 既能读取文件内容,也能写入 / 修改文件内容 | 文件必须存在,写入会覆盖光标位置后的内容 |
'w+' |
读写 | 先清空文件(无文件则创建),再支持读写操作 | 会覆盖原有文件内容,读写一体场景使用 |
'a+' |
追加读写 | 先追加写入(无文件则创建),也支持读取文件内容 | 读取时需先移动文件光标(默认光标在文件末尾),否则读取不到内容 |
'b' |
二进制模式 | 配合上述模式使用(如'rb'、'wb'),用于操作二进制文件(图片、视频、压缩包) |
无需指定encoding参数,操作的是字节流(bytes类型),而非字符串 |
注:需要引入 import os 包
2.读取文件
格式: open(文件路径,模式,编码类型) 不写编码类型默认utf-8
| 读取方法 | 功能描述 | 适用场景 |
|---|---|---|
file.read(size=-1) |
读取文件内容,size指定读取字节数(默认-1,读取全部内容) |
小文件读取(一次性加载到内存) |
file.readline() |
读取文件一行内容,返回字符串(包含行尾的\n) |
大文件逐行读取(节省内存) |
file.readlines() |
读取文件所有行,返回列表(每行内容为列表一个元素,包含\n) |
需按行处理文件,且文件不大 f = open(“test.txt”, ‘r’, encoding=’utf-8’) # 读取全部内容 content = f.read() print(“文件全部内容:”) print(content) |
1 | f = open("test.txt", 'r', encoding='utf-8') |
3.写入数据
格式: open(文件路径,模式,编码类型) 不写编码类型默认utf-8
| 写入方法 | 功能描述 |
|---|---|
file.write(str) |
将指定字符串写入文件,返回写入的字符数 |
file.writelines(list) |
将字符串列表写入文件(不会自动添加换行符,需手动在列表元素中添加\n) |
1 | # 1. 覆盖写入(mode='w') |
4.新版文件读写
格式: with open(文件路径,模式,编码类型) as f: 此时会自动关闭文件,无需手动close()
1 | # 1. 读取文件(自动关闭) |
5.文件操作
| 操作功能 | 传统模块(os) | 现代模块(pathlib,推荐) | 适用场景 | 关键注意事项 |
|---|---|---|---|---|
| 删除单个文件 | os.remove(file_path) |
Path(file_path).unlink() |
删除已存在的普通文件 | 1. 无法删除目录,否则抛IsADirectoryError;2. pathlib支持missing_ok=True(Python3.8+),忽略文件不存在的错误;3. 操作不可逆,无回收站。 |
| 重命名文件 | os.rename(old_path, new_path) |
Path(old_path).rename(new_path) |
修改文件名称 / 移动文件路径 | 1. 原文件必须存在,否则抛FileNotFoundError;2. 新路径若已存在,会覆盖(部分系统抛异常)。 |
6.目录操作
| 操作功能 | 传统模块(os/shutil) | 现代模块(pathlib,推荐) | 适用场景 | 关键注意事项 |
|---|---|---|---|---|
| 创建单个空目录 | os.mkdir(dir_path) |
Path(dir_path).mkdir() |
仅创建一级目录(父目录需已存在) | 1. 目录已存在则抛FileExistsError;2. pathlib支持exist_ok=True,忽略目录已存在的错误。 |
| 递归创建多级目录 | os.makedirs(dir_path) |
Path(dir_path).mkdir(parents=True) |
创建多层嵌套目录(父目录可不存在) | 1. 自动创建所有缺失的父目录;2. pathlib可搭配exist_ok=True,避免目录已存在报错。 |
| 删除单个空目录 | os.rmdir(dir_path) |
Path(dir_path).rmdir() |
删除无文件 / 子目录的空目录 | 1. 目录非空则抛OSError;2. 目录不存在则抛FileNotFoundError。 |
| 递归删除非空目录(含所有文件 / 子目录) | shutil.rmtree(dir_path) |
shutil.rmtree(Path(dir_path)) |
删除包含文件、子目录的复杂目录 | 1. 依赖shutil模块,pathlib无原生递归删除方法;2. 操作不可逆,会彻底删除所有内容,慎用;3. 支持ignore_errors=True,忽略删除过程中的部分错误。 |
| 重命名目录 | os.rename(old_dir, new_dir) |
Path(old_dir).rename(new_dir) |
修改目录名称 / 移动目录路径 | 1. 原目录必须存在,否则抛FileNotFoundError;2. 新目录若已存在,部分系统会抛异常。 |
7.其他操作
| 操作功能 | 传统模块(os) | 现代模块(pathlib,推荐) | 功能说明 |
|---|---|---|---|
| 判断路径是否存在 | os.path.exists(path) |
Path(path).exists() |
校验文件 / 目录是否存在,返回布尔值 |
| 判断路径是否为文件 | os.path.isfile(file_path) |
Path(file_path).is_file() |
校验路径是否为有效文件,返回布尔值 |
| 判断路径是否为目录 | os.path.isdir(dir_path) |
Path(dir_path).is_dir() |
校验路径是否为有效目录,返回布尔值 |
| 获取当前工作目录 | os.getcwd() |
Path.cwd() |
返回当前程序运行的工作目录路径 |
十五、闭包
1.闭包是 Python 中基于函数一等对象特性和作用域嵌套实现的一种特殊结构,指内部函数引用了外部函数(非全局)的变量 / 参数,且外部函数返回了这个内部函数。此时内部函数及其所引用的外部变量(称为「自由变量」)共同构成了闭包。用于延长外部函数变量周期
2.基本闭包
| 构成条件 | 具体说明 |
|---|---|
| 1. 嵌套结构 | 存在嵌套函数(外部函数内部定义了一个内部函数) |
| 2. 变量引用 | 内部函数引用了外部函数的变量或参数(非全局变量,即自由变量) |
| 3. 返回内部函数 | 外部函数的返回值是内部函数本身(不调用内部函数,仅返回函数对象) |
1 | def fn_outer(): |
3.数据持久化闭包
需要使用 nonlocal关键字 此时里面的函数可以修改外面的变量!!!
1 | def create_accumulator(init_value=0): |
十六、装饰器
1.装饰器是一个可调用对象(通常是函数),它接收一个函数 / 类作为参数,返回一个增强后的新函数 / 类(或原函数的包装函数)。核心价值是「解耦」,将日志记录、性能统计、权限校验等通用功能与业务逻辑分离,通用功能的抽离,如日志打印、性能计时、权限校验、缓存处理、异常捕获等. 写法就是闭包
2.传统写法
1 | import time |
3.语法糖写法
使用@符号 @装饰器名 不要带()!!
1 | import time |
4.修饰器类型
(1).无参无返回
1 | import time |
(2).有参无返回值
1 | import time |
(3)有参有返回值
1 | import time |
5.多装饰器调用
多装饰器调用先调用近的后调用远的
1 | #登录验证器 |
6.带参数的装饰器
1 | from functools import wraps |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Ulen!
评论






