python基础
一、python的注释
1、为什么需要注释?
想象你写了一篇日记,过了半年再看,可能不记得当时为什么写这段话。代码也是一样。
- 给自己看:比如你写了一段复杂的代码,过几天再打开时,注释能帮你快速回忆起“这里为什么要这么写”。
- 给别人看:如果别人需要用你的代码(比如同学、同事),注释就像“使用说明书”,让对方不用猜你的逻辑。
2、注释长什么样?怎么写?
Python的注释用于解释代码逻辑、提高可读性,不影响程序执行。
2.1 单行注释:给一行代码“贴便利贴”
- 用
#开头,后面写文字,电脑会自动跳过#后的内容。 - 👉例子:
print("今天天气真好") # 这行代码的作用是:在屏幕上显示“今天天气真好”- 就像你在笔记本上写:
买牛奶 # 记得买低脂的2.2 多行注释:给一大段代码“写说明书”
- 用
'''(三个单引号)或"""(三个双引号)把一段话包起来,适合写长注释。 - 👉例子:
"""
下面这段代码的作用:
1. 记录今天吃了什么
2. 统计一共吃了几种食物
"""
food = ["苹果", "米饭", "牛肉"]
print("今天吃了", len(food), "种食物")- 相当于你在笔记本上写:
【周末计划】
- 上午:去公园跑步
- 下午:看电影
- 晚上:做饭2.3 注释的小 tips
- 简洁清晰:注释应解释“为什么做”,而非“做了什么”(代码本身已说明后者)。
- 避免冗余:不要注释显而易见的代码(如
x = x + 1# x自增1)。 - 保持更新:代码修改时,同步更新注释,避免“过时注释”误导读者。
- 文档化注释:对公开函数/类必须写 docstring,方便他人使用(可配合工具如 Sphinx 生成文档)。
- 临时注释:调试时可用 # 快速注释多行代码(推荐用 IDE 的批量注释功能)。
简单说就是:
- 别写“废话”:比如
x = 1 + 1# 把1和1加起来,这种注释不如不写(代码本身已经很清楚了)。 - 写“为什么”,不是“是什么”:比如代码是
if age > 18: ...,注释可以写 # 这里判断是否成年,因为未成年不能购买,而不是 # 如果年龄大于18。 - 像写便签一样简洁:别写长篇大论,抓住重点即可~
3、总结
- Python 注释通过
#、'''/"""实现单行/多行说明,核心价值是提升代码可读性和可维护性 - 简单说:注释就是代码的“翻译官”和“备忘录”,电脑不看,只给人看,目的是让代码更好懂。刚开始写代码时养成写注释的习惯,以后无论是自己回顾还是和别人合作,都会轻松很多~ 😊
二、常用快捷键
- 复制
ctrl + c - 粘贴
ctrl + v - 撤回
ctrl + z - 剪切
ctrl + x - 注释
shift + 3 ==> # - 输入法中英文输入状态切换
shift 或者 ctrl + 空格 - 快速往下复制1行
Ctrl + D - 快速注释或者快速打开注释
Ctrl + / - 多行修改
Alt + Shift + 鼠标拖动
三、变量
Python中的“变量与赋值”可以理解为 “给数据贴标签”,就像给盒子贴标签方便存放和查找东西一样。
1、变量:给数据起个名字
1.1 什么是变量?
变量就是一个 “容器”,用来存放数据(比如数字、文字、列表等),并给这个容器起一个名字。
👉 类比:你有一个盒子,贴上标签“零花钱”,里面放了100元。这里的 “零花钱”就是变量名,100元就是变量的值。
1.2 如何创建变量?(赋值操作)
- 用 = (赋值符号)把数据“装进”变量,格式:变量名 = 数据。
- 👉例子:
age = 18 # 变量名为age,存放的数据是18(整数)
name = "小明" # 变量名为name,存放的数据是"小明"(字符串,用引号包裹)
height = 1.75 # 变量名为height,存放的数据是1.75(浮点数/小数)就像
零花钱 = 100元
姓名 = "小明"
身高 = 1.75米2、变量命名规则(必须遵守!)
变量名就像“标签”,不能随便起,有几个简单规则:
1. 只能包含:字母、数字、下划线(_),且 不能以数字开头。
❌ 错误:1name(以数字开头)、my-name(含减号)
✅ 正确:name1、my_name、student_age
2. 区分大小写:age和Age是两个不同的变量。
age = 18
Age = 20
print(age) # 输出18(不是20)- 不能用Python关键字(比如
if、for、print等,这些是Python自带的“特殊标签”)。❌ 错误:if = 5(if是关键字,不能当变量名)
- 建议:见名知意
变量名最好能直接看出存放的数据是什么,比如用 age 存年龄,score 存分数,而不是 a、b、x 这种无意义的名字。
3、变量的核心特性:可以随时“修改内容”
变量的值不是固定的,可以用新的赋值语句覆盖旧值,就像“把盒子里的东西换成新的”。
👉例子
money = 100 # 一开始有100元
money = 200 # 现在把钱改成200元(覆盖旧值)
print(money) # 输出200(不是100)甚至可以用 变量本身 来更新值:
count = 0
count = count + 1 # 把count原来的值(0)加1,再存回count
print(count) # 输出1(相当于“计数器+1”)4、变量的“类型”:存放不同种类的数据
变量可以存放不同类型的数据,Python会自动识别类型(无需手动声明)
| 类型 | 例子 | 说明 |
|---|---|---|
| 整数(int) | age = 18、num = -5 | 不带小数点的数字 |
| 字符串(str) | name = "小明"、msg = 'Hi' | 文本,用单/双引号包裹 |
| 浮点数(float) | height = 1.75、pi = 3.14 | 带小数点的数字 |
| 布尔值(bool) | is_student = True、has_money = False | 只有True(是)/False(否) |
👉可以用 type(变量名) 查看变量类型:
x = 10
print(type(x)) # 输出 <class 'int'>(表示x是整数类型)5、常见问题:“赋值”不是“等于”
注意:Python中的 = 是 “赋值符号”,不是数学中的“等于号”!
数学中 x = x + 1 不成立(x不可能等于x+1),但Python中表示“用x原来的值加1,再存回x”(比如计数器场景)。
如果想判断两个值是否相等,用 ==(双等号),比如 x == 10(判断x的值是不是10)。
6、总结
- 变量:给数据起的名字,像贴了标签的盒子。
- 赋值:用 变量名 = 数据 把数据放进盒子,可随时更新。
- 核心:记住命名规则(字母/数字/下划线,不能以数字开头),见名知意,理解 = 是“赋值”而非“等于”。
四、数据类型的可变性和不可变性
定义
✅不可变数据类型:创建后无法修改其内容,修改时会生成新的对象并分配新内存地址。
✅可变数据类型:创建后可直接修改内容,内存地址不变(除非重新赋值)。
| 维度 | 不可变类型 | 可变类型 |
|---|---|---|
| 内存地址 | 修改时地址改变(新对象) | 修改时地址不变(原对象) |
| 可哈希性 | 可哈希(可作为字典键/集合元素) | 不可哈希(不可作为字典键) |
| 性能 | 读取快,修改开销大 | 修改快,内存占用较稳定 |
| 线程安全 | 天然线程安全(无修改竞争) | 非线程安全(需加锁保护) |
典型应用场景
- 不可变类型
- 存储固定配置(如常量、元组坐标)。
- 作为字典键(如字符串键名)。
- 函数参数传递(避免外部修改)。
- 可变类型
- 动态数据集合(如列表存储日志、字典存储用户信息)。
- 需要频繁修改的数据(如集合去重、列表排序)。
五、数据类型的常用操作及方法
1、字符串类型
字符串(str)是文本数据的容器,用单引号' '、双引号" " 或 三引号''' '''/""" """ 包裹。
1.1 字符串的定义及注意点
类型: str
作用:记录一些描述性的数据,比如,名字、性别、家庭住址、公司简介……定义:在引号内按照从左往右的顺序包含一个个字符,可以使用单引号、双引号和三引号,注意三引号可以换行
👉例如
# 定义字符串
strings = '人生苦短,我用python!'
strings2 = "人生苦短,我用python!"
strings3 = '''人生苦短,
我用python!'''
strings4 = """人生苦短,
我用python!"""
# 打印输出
print(strings, strings2, strings3, strings4)
print(id(strings), id(strings2), id(strings3), id(strings4))
print(type(strings), type(strings2), type(strings3), type(strings4))⚠️注意点:
# 需要注意的情况,就是字符串内外都含引号的时候(字符串本身就是带引号) 人生苦短,我用'python'!
# print('人生苦短,我用'python'!')
# strings5 = '人生苦短,我用'python'!'
# strings5 = "人生苦短,我用'python'!"
print("人生苦短,我用'python'!")👉字符串拼接
# 字符串的拼接 "人生苦短" "我用'python'!"
print("人生苦短" + "我用'python'!")
print("5" + "20")
print("人生苦短" * 10)
print("人生苦短" + "人生苦短" + "人生苦短" + "人生苦短" + "人生苦短" + "人生苦短" + "人生苦短")👉字符串的索引(可正可负)
# 字符串的索引
strings6 = 'abcde'
# 索引 0 1 2 3 4 索引 从0开始
# -5 -4 -3 -2 -1
print(strings6[0])
print(strings6[1])
print(strings6[2])
print(strings6[3])
print(strings6[4])
print("-----------------------")
print(strings6[-1])
print(strings6[-2])
print(strings6[-3])
print(strings6[-4])
print(strings6[-5])👉字符串不可索引修改
# 捕获异常机制
try:
strings6[0] = 'q'
except Exception as e:
print(e)👉字符串的格式化输出
程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式
比如要求用户输入用户名和年龄,然后打印如下格式:
==>My name is xxx,my age is xxx.
这就用到了占位符,如:%s、%d、%i、%f……
👉例子
# %s
name = input('请输入您的名字:')
# 一个值的话直接放到%后面
# %s 占位符
print("My name is xxx,my age is %s" % name)
# %d/%i
# 多个值的话直接放到%后面,要括号
age = input('请输入您的年龄:')
print("My name is %s, my age is %d" % (name, int(age))) # 注意类型转换
print("My name is %s, my age is %i" % (name, int(age))) # 注意类型转换
# %f 占位符默认显示 6位小数
print("小数 %f" % 1.0001)
# 需要调整小数位数,可通过 %.nf 格式指定(n 为数字),例如 %.2f 显示2位小数。
print("指定小数位: %.2f" % 1.0001)📌图示:

1.2 字符串的相关操作
1.2.1 索引取值
# 1、索引取值
msg = '人生苦短 我用python'
print(msg[0])1.2.2 切片操作
通过 [start:end:step] 截取子串(左闭右开,step 为步长)
# 2、切片(顾头不顾尾)(左闭右开区间)查找字符串当中一段值 [起始值:终止值:步长] 索引值
# 步长:默认为1,此时可以省略,用于控制提取字符的间隔 不能为0
# 切黄瓜 一节一节
print(msg[0:5])
print(msg[0:5:1])
print(msg[0:5:2])
# 提取不会改变原值
print(msg)
# 如果省略起始值,默认字符串开头(索引0)开始
# 如果省略终止值,默认到字符串末尾结束
# 如果省略步长,默认步长为1 为正数 从左往右取
print(msg[::])
print(msg[0::])
print(msg[0::2])
# 步长是负数 # 从右向左提取字符,反向提取
# msg = 'hello world'
print(msg[::-1])
print(msg[10::-1])
print('-------------')
print(msg[10:5:-1])
print(msg[5:10:-1]) # 取不到值,没有值
print(type(msg[5:10:-1])) # 空字符串1.2.3 计算字符串长度 len()
#3、长度len方法 可以计算长度
print(len(msg))1.2.4 成员运算 in 和 not in
判断一个字符串是否存在于另一个大的字符串中
# 4、成员运算 in 和 not in: 判断子字符串是否存在于另一个大的字符串中
# 返回类型 布尔 True False
print('linmo' in 'linmo is dsb')
print('xialuo' not in 'linmo is dsb')1.2.5 字符串的增、删、改、查
🔹增
# 增
# 字符串拼接
print('linmo'+'dsb')
# join
str1 = '真正的勇士'
str2 = '敢于直面惨淡的人生'
str3 = '敢于正视淋漓的鲜血'
# 可以把列表的元素组合成字符串
print(''.join([str1,str2,str3]))
print(','.join([str1,str2,str3]))
print('哇塞'.join([str1,str2,str3]))
# 空格也属于字符
print(' '.join([str1,str2,str3]))🔹删
# 删
name1 = 'dahai'
del name1
print(name1)🔹改(常用方法)
lower()全小写
upper()全大写
capitalize()仅首字母大写
title()每个单词首字母大写
split()分割字符串(返回列表)
strip()去除两端空白
lstrip()去除左端空白
rstrip()去除右端空白
replace()替换子串
center()居中对齐,两侧填充空格
ljust()留左填右
rjust()留右填左
# 改 字符串底层是不可变的数据类型,直观体现不能通过索引直接改里面字符的值, 但可以间接修改(比如说替换)
# 1、字符串字母变大写和变成小写 lower,upper
msg1 = 'abc'
msg2 = msg1.upper() # 变大写
# 原值
print(msg1)
print(msg2)
print(id(msg1))
print(id(msg2))
# 注意字符串进行改变需要重新赋值,所以它也是不可变类型,它的原值的变量不会变,
# 只是做了一个方法改变了它的值,但是这个值并不是在原来的基础上改的,而是重新赋值给一个新的变量
# 2、把第一个字母转换成大写 capitalize
lettter = 'abcd'
print(lettter.capitalize())
# 3、每个单词的首字母进行大写转换 title
letter_msg = 'hello world'
print(letter_msg.title())
# 4、把字符串切分成列表 split 默认空格字符切分
msgg = 'hello world python'
# 默认以空格切分
print(msgg.split())
# 可以切分你想要的字符 比如*
msgg1 = 'hello*world*python'
print(msgg1.split('*'))
#切分split的作用:针对按照某种分隔符组织的字符串,可以用split将其切分成列表,进而进行取值
msggg = 'root:123456'
print(msggg[0:4])
print(msggg.split(':')[0])
print(msggg.split(':')[1])
#5、去掉字符串左右两边的字符 strip 不写默认是空格字符,不管中间的其他的字符
user = ' dahai '
print(user)
print(user.strip())
# name = input('请输入用户名').strip()
# print(name)
# 字符串的替换 replace()
# 1、基本替换
s = 'Hello World!'
new_s = s.replace('Hello','Hi')
print(new_s)
# 2、替换所有匹配的字符串
s = '不吃香菜 真爱粉 不吃香菜 两年半'
# 将所有'不吃香菜'替换成'个人练习生'
new_s = s.replace('不吃香菜', '个人练习生')
print(new_s)
# 3、指定替换次数
s = 'apple banana apple cherry apple'
# 只替换前两个'apple'
new_s = s.replace('apple','orange',2)
print(new_s)
# 4、替换空字符串
s = 'Hello, World!'
# 删除所有逗号
new_s = s.replace(',','')
print(new_s)
# 了解
# center,ljust,rjust 多余添加自己想要的字符 l ->left左 r ->right右
print('dahai'.center(11,'a')) # 总共有11个字符 -> 11字符
print('dahai'.ljust(11,'*')) # 留左填右
print('dahai'.rjust(11,'*')) # 留右填左
🔹查
# 查
#1、find,index
# 查找子字符串在大字符串的哪个位置(起始索引)
msga = 'hello dahai is dsb dahai'
print(msga.find('dahai')) # 索引值
# 没找到会返回-1
print(msga.find('ddddd'))
print(msga.index('dahai'))
# 没找到会报错
# print(msga.index('ddddd'))
# 统计一个子字符串在大字符串中出现的次数 count
print(msga.count('dahai'))1.2.6 判断检查
# 判断一个字符串里的数据是不是都是数字 isdigit # 返回布尔值 判断什么 是不是 对不对 is开头的方法,就是判断
num = '1818'
num1 = '18aaa18'
aaaa = 'aaa'
print(num.isdigit())
print(num1.isdigit())
# 判断每个元素是不是都是字母 isalpha
print(aaaa.isalpha())
print(num.isalpha())
print(num1.isalpha())
# 比较开头的元素是否相同 startswith 以什么开头
# 比较结尾的元素是否相同 endswith 以什么结尾
# 返回布尔类型
mm = 'dahai xialuo'
print(mm.startswith('dahai'))
print(mm.endswith('uo'))
# 判断字符串中的值是否全是小写的 islower
# 判断字符串中的值是否全是大写的 isupper
letter2 = 'ABC'
letter3 = 'abc'
letter4 = 'aAbc'
print(letter2.isupper())
print(letter3.isupper())
print(letter4.isupper())
print(letter2.islower())
print(letter3.islower())
print(letter4.islower())1.2.7 字符串转义
# 字符串的转义
# 字符串的转义 加了 \ 字符不再表示它本身的含义
# 常用的 \n \t
# \n 换行符
print('hello \n python')
# \n 横向换行符 相当于一个tab 四个空格
print('hello \t python')
# #(实在想打出\n \t)不让它转义
print(r'hello \n python \t')
# 实在想打出\n \t
print('hello \\n python \\t')1.3 字符串所有方法总结(常用与不常用)
1.3.1 大小写转换
| 方法名 | 作用 |
|---|---|
capitalize() |
首字母大写,其余字符小写(仅对首字符生效,如 "hello".capitalize() → "Hello")。 |
casefold() |
转换为小写(比 lower() 更激进,支持多语言,如德语 ß → ss)。 |
lower() |
所有字符转换为小写(如 "HELLO".lower() → "hello")。 |
upper() |
所有字符转换为大写(如 "hello".upper() → "HELLO")。 |
swapcase() |
大小写互换(如 "Hello".swapcase() → "hELLO")。 |
title() |
每个单词首字母大写,其余小写(如 "hello world".title() → "Hello World")。 |
1.3.2 判断与检查(返回布尔值)
| 方法名 | 作用 |
|---|---|
isalnum() |
是否全为字母/数字(无空格或符号,如 "abc123".isalnum() → True)。 |
isalpha() |
是否全为字母(如 "abc".isalpha() → True,"abc123".isalpha() → False)。 |
isascii() |
是否所有字符均为 ASCII 码(0-127,如 "a1!".isascii() → True,中文则 False)。 |
isdecimal() |
是否全为十进制数字(仅 0-9,不包含罗马数字或分数,如 "123".isdecimal() → True)。 |
isdigit() |
是否全为数字字符(包含 Unicode 数字,如 "¹²³".isdigit() → True)。 |
isnumeric() |
是否全为数值字符(包含数字、分数、罗马数字等,如 "½Ⅷ".isnumeric() → True)。 |
isidentifier() |
是否为合法标识符(变量名规则:字母/下划线开头,后跟字母/数字/下划线,如 "my_var".isidentifier() → True)。 |
islower() |
是否所有字母均为小写(且至少有一个字母,如 "hello".islower() → True)。 |
isupper() |
是否所有字母均为大写(且至少有一个字母,如 "HELLO".isupper() → True)。 |
istitle() |
是否符合标题格式(每个单词首字母大写,如 "Hello World".istitle() → True)。 |
isprintable() |
是否所有字符均可打印(无控制字符,如 "hello\n".isprintable() → False,换行符不可打印)。 |
isspace() |
是否全为空白字符(空格、制表符 \t、换行符 \n 等,如 " \t\n".isspace() → True)。 |
startswith(prefix) |
是否以指定前缀开头(如 "hello".startswith("he") → True)。 |
endswith(suffix) |
是否以指定后缀结尾(如 "hello".endswith("lo") → True)。 |
1.3.3 搜索与替换
| 方法名 | 作用 |
|---|---|
count(sub[, start[, end]]) |
统计子串 sub 在 [start:end] 范围内出现的次数(如 "ababa".count("aba") → 1)。 |
find(sub[, start[, end]]) |
查找子串 sub 的索引,未找到返回 -1(如 "hello".find("lo") → 3)。 |
rfind(sub[, start[, end]]) |
从右侧开始查找子串 sub 的索引(如 "ababa".rfind("aba") → 2)。 |
index(sub[, start[, end]]) |
同 find(),但未找到时 报错(ValueError)。 |
rindex(sub[, start[, end]]) |
同 rfind(),但未找到时 报错。 |
replace(old, new[, count]) |
替换子串 old 为 new,count 为最大替换次数(如 "aaa".replace("a", "b", 2) → "bba")。 |
translate(table) |
通过翻译表替换字符(需配合 str.maketrans() 使用,如替换多个字符)。 |
maketrans(x[, y[, z]]) |
创建翻译表(用于 translate(),如 str.maketrans("abc", "123") 生成 a→1、b→2、c→3 的映射)。 |
1.3.4 分割与连接
| 方法名 | 作用 |
|---|---|
split(sep=None, maxsplit=-1) |
按 sep 分割字符串为列表,maxsplit 为最大分割次数(默认空格分割,如 "a b c".split() → ["a", "b", "c"])。 |
rsplit(sep=None, maxsplit=-1) |
从右侧开始分割(如 "a/b/c".rsplit("/", 1) → ["a/b", "c"])。 |
splitlines([keepends]) |
按换行符分割(\n、\r\n 等),keepends=True 保留换行符(如 "a\nb".splitlines() → ["a", "b"])。 |
join(iterable) |
将可迭代对象(如列表)的元素用字符串连接(如 "_".join(["a", "b"]) → "a_b")。 |
partition(sep) |
按 sep 分割为 (head, sep, tail),sep 不存在则 (s, "", "")(如 "a/b/c".partition("/") → ("a", "/", "b/c"))。 |
rpartition(sep) |
从右侧开始分割(如 "a/b/c".rpartition("/") → ("a/b", "/", "c"))。 |
1.3.5 填充与对齐
| 方法名 | 作用 |
|---|---|
center(width[, fillchar]) |
居中对齐,总长度为 width,两侧用 fillchar 填充(默认空格,如 "abc".center(5, "*") → "*abc*")。 |
ljust(width[, fillchar]) |
左对齐,右侧填充(如 "abc".ljust(5) → "abc ")。 |
rjust(width[, fillchar]) |
右对齐,左侧填充(如 "abc".rjust(5) → " abc")。 |
zfill(width) |
左侧用 0 填充,总长度为 width(如 "123".zfill(5) → "00123")。 |
expandtabs([tabsize=8]) |
将制表符 \t 替换为空格,tabsize 为制表符宽度(如 "a\tb".expandtabs(4) → "a b")。 |
1.3.6 修剪与清理
| 方法名 | 作用 |
|---|---|
strip([chars]) |
移除字符串两端的 chars 字符(默认移除空白字符:空格、\t、\n 等,如 " abc ".strip() → "abc")。 |
lstrip([chars]) |
移除左侧的 chars 字符(如 "###abc###".lstrip("#") → "abc###")。 |
rstrip([chars]) |
移除右侧的 chars 字符(如 "###abc###".rstrip("#") → "###abc")。 |
removeprefix(prefix) |
移除前缀 prefix(如 "hello".removeprefix("he") → "llo",Python 3.9+)。 |
removesuffix(suffix) |
移除后缀 suffix(如 "hello".removesuffix("lo") → "hel",Python 3.9+)。 |
1.3.7 编码与解码
| 方法名 | 作用 |
|---|---|
encode(encoding="utf-8", errors="strict") |
将字符串编码为字节(bytes),如 "你好".encode("utf-8") → b'\xe4\xbd\xa0\xe5\xa5\xbd'。 |
decode(encoding="utf-8", errors="strict") |
字节对象方法(非字符串方法),将字节解码为字符串(如 b'\xe4\xbd\xa0'.decode("utf-8") → "你")。 |
2、数字类型
2.1 数字类型的介绍
1、整型 int
作用:就是记录精确的整数数值,比如,年龄、人数、时间、金额……
👉定义输出类型看看
# 定义
age = 22
print(type(age))2、浮点型 float 小数
作用:记录身高height、体重weight、薪资salary……
注意:浮点数的相加是不精确的
# 定义
weight = 151.2
print(type(weight))
float_1 = 1.1
float_2 = 2.2
print(float_1 + float_2, "----") # 结果不精确3、复数 (了解) complex
常用于:电路分析(阻抗计算)、信号处理(傅里叶变换)、量子力学(波函数表示)
👉简单看看👀
x = 2 - 2j
print(x)
print(type(x))2.2 数字类型的计算
1、基本运算加+ 减- 乘* 乘方** 除/ 整除// 取余% 和 比较运算 > < >= <= == !=
# 基本的运算
"""
+ - * **
"""
num1 = 10
num2 = 3
print(num1 + num2)
print(num1 - num2)
print(num1 * num2)
print(num1 ** num2) # num1的num2次方 10 的 3 次方
"""
/ // %
"""
# // 是向下取整 地板除
print(num1 / num2)
print(num1 // num2)
print(15 / 4)
print(15 // 4)
# / 结果一定是浮点数
print(10 / 5)
# % 顾名思义就是求余数 被除数 / 除数 = 商 …… 余数
print(num1 % num2)
# 比较运算 > < >= <= == != 结果是布尔值 True False(比较值)
print(3 > 4)
print(3 < 4)
print(3 >= 4)
print(3 <= 4)
print(3 == 4)
print(3 != 4)
print(type(3 != 4))
# 身份运算符 判断是不是一个对象
a = 100000
b = 100000
print(id(a), id(b)) # 实际上a 和 b 是同时指向了10000
print(a is b)
print(id(100000), id(100000))
# 总结:
# 注意⚠️:在交互模式下,是不一样的(python有一个小整数池[-5,256]是一样的,超出范围不一样)(研究发现,程序中 -5 到 256 的整数出现频率最高)
# 特殊情况:同一代码块的大整数优化
# 在 同一代码块(如脚本文件、函数)中,相同的大整数字面量可能被编译器优化为同一对象(非小整数池机制,而是“常量折叠”)
#避免 == 与 is 混淆
#== 判断值相等(True == 1 为 True)。
#is 判断对象身份(True is 1 为 False,True 和 False 是单例对象)。
注意:
- 避免
==与is混淆 ==判断值相等(True == 1为True)。is判断对象身份(True is 1为False,True和False是单例对象)。
2、赋值运算 =、+=、-=、*=、/=、%=、**=、//=
"""
3、赋值运算 => 赋值 + 算术运算
# 普通赋值 =
# 加法赋值 +=
# 减法赋值 -=
# 乘法赋值 *=
# 除法赋值 /=
# 取余赋值 %=
# 乘方赋值 **=
# 整除(地板除)赋值 //=
"""
# 普通赋值 = (变量赋值)
num = 1
# 加法赋值 +=
num += 1 # num = num + 1
print(num)
# 减法赋值 -=
num -= 1 # num = num - 1
print(num)
# 乘法赋值 *=
num *= 2 # num = num * 2
print(num)
# 除法赋值 /=
num /= 2 # num = num / 2
print(num)
# 取余赋值 %=
num %= 2 # num = num % 2
print(num)
# 乘方赋值 **=
num **= 2 # num = num ** 2
print(num)
# 整除(地板除)赋值 //=
num //= 2 # num = num // 2
print(num)
3、布尔类型
Python 的布尔类型(bool)是基础数据类型之一,用于表示逻辑判断的结果(真/假)。
布尔类型:bool
作用:通常用于逻辑判断
布尔值 一个是 True 一个是 False
👉练练手
flag1 = True
flag2 = False
print(flag1, type(flag1))
print(flag2, type(flag2))
flag1 = False
print(flag1)
# 我们定义一个变量表示一个人是否成年,然后我们再根据这个变量的值来执行不同的代码快
is_adult = input("请输入是否成年(成年输入1,未成年输入0):")
print(is_adult, type(is_adult))
if is_adult == '1':
is_adult = True
else:
is_adult = False
if is_adult:
print("这个人已经成年了!")
else:
print("这个人还未成年!")True:(逻辑真,本质是整数 1 的特殊实例)
False:(逻辑假,本质是整数 0 的特殊实例)
🤔验证:
# 结果均为True,说明True和False的值就是1和0
print(True == 1)
print(False == 0)
# 均为False,说明True并不是1,False并不是0,只是值相等(可能会有语法警告)
print(True is 1)
print(False is 0)
# 1 和 1 是一个东西,但是 True 和 1 就不是一个东西
print(1 is 1)
print(0 is 0)
# 说明不是一个东西,地址不一样
print(id(True), id(False))
print(id(1), id(0))Python 数据"自带布尔值"
每个对象在条件判断中会根据自身状态(是否为空、是否为零等)自动转换为True 或False
不仅仅是真假 还有数据的有无
None表示"无值"或"不存在",是 Python 中一个特殊的常量,属于NoneType类型(该类型只有None一个实例)。0 -> 0 == False
空序列(容器)-->(空字符串、空列表、空字典、空集合、空元组)
"""
# 重点知识
# 不仅仅是真假 还有数据的有无
# Python 数据"自带布尔值":
# 每个对象在条件判断中会根据自身状态(是否为空、是否为零等)自动转换为 True 或 False
# None 表示"无值"或"不存在",是 Python 中一个特殊的常量,属于 NoneType 类型(该类型只有 None 一个实例)。
# 0 -> 0 == False
# 空序列(容器)-->(空字符串、空列表、空字典、空集合、空元组)
# 布尔值为False所有"空"对象在布尔上下文中(如 if 条件判断)会被视为 False,非空对象则视为 True
"""
# if []: # 空列表
# if (): # 空元组
# if {}: # 表示空字典(直接花括号会默认识别成空字典,不会识别成集合) print(type({}))
# if set(): # 空集合
# if '': # 空字符串
# if 0: # 0
if None: # None
print(1)
else:
print(2)
# 表示空字典(直接花括号会默认识别成空字典,不会识别成集合) print(type({}))
print(type({}))4、列表类型
- 核心概念:列表是 Python 中最常用的有序、可变序列,可存储任意类型元素(整数、字符串、对象等),元素间用逗号分隔,整体包裹在方括号
[]中。 - 底层实现:基于动态数组(
Dynamic Array)实现,支持自动扩容与缩容,按索引访问效率极高(时间复杂度O(1))。
4.1 列表list
作用: 记录、存储多个值,可以方便地取出来指定位置的值(索引取值)
比如 爱好,学生姓名……
定义:在[ ]内用逗号隔开多个任意类型的值
lst = ["小明", 1, 1.1, True, ["小明", 1, 1.1, True]]
# 索引 0 1 2 3 4
print(lst[0], lst[-5])
print(lst[1], lst[-4])
print(lst[2], lst[-3])
print(lst[3], lst[-2])
print(lst[4], lst[-1])
# 取列表里面的列表的值
print(lst[4][0])
# 第4号索引的值整体赋值给变量 lst1
lst1 = lst[4]
print(type(lst1))
print(lst1[0])
# 修改某个位置上的值
try:
lst[1] = '小红'
except Exception as e:
print(e)
print(lst)4.2 列表的相关操作
🔹增 append()、insert()、extend()
lst = ["小明", 1, 1.1, True, ["小明", 1, 1.1, True]]
# 索引 0 1 2 3 4
# 索引(反)-5 -4 -3 -2 -1
# 增删改查 统计
# 1、增
print("----------------增---------------")
# append(元素)
# 往列表末尾追加一个元素
lst.append("append")
print(lst)
# extend()
# 往列表当中添加多个元素 括号里放列表 也是末尾追加
lst2 = ["extend1","extend2"]
lst.extend(lst2)
print(lst)
# insert(索引,元素)
# 往指定索引位置前插入一个元素
lst.insert(1,'insert')
print(lst)🔹删 del、pop、remove、clear
# 删
print("----------------删---------------")
# del
# del lst[0]
# print(lst)
# 指定删除
# lst.remove("小明")
# print(lst)
# pop 从列表里拿走一个值
# 按照索引删除值
print("---------------pop-------------")
# ·默认删除最后一个 pop返回值是删除的值
# lst.pop()
# print(lst)
# 指定索引
# lst.pop(0)
# print(lst)
# 清空列表
# lst.clear()
# print(lst)🔹改
# 改
print("----------------改---------------")
# 索引赋值
lst[0] = '小红'
print(lst)
# 切片赋值
# lst[0:2] = [1,2]
# print(lst)
# 反序
lst.reverse()
print(lst)
🔹查
# 查
print("----------------查---------------")
# 索引取值 (正向取、反向取)
print(lst[0], lst[-9])
# 切片 [起始值:终止值:步长] 左闭右开
print(lst[::])
print(lst[3:0:-1]) # 取得到
print(lst[3:0:1]) # 取不到空置🔹统计
# 统计
print("----------------统计---------------")
# len() 长度
print(lst, len(lst))
# index 查找元素索引
print(lst.index("小红"))
# print(lst.index("小")) # 报错
# 统计元素出现次数:count()
lst3 = [1,1,3,4,1,2,1]
print(lst3.count(1))4.3 列表相关方法总结
| 方法名 | 核心功能 | 参数要点 | 原地修改? |
|---|---|---|---|
append(x) |
末尾添加单个元素 | x 为任意类型 |
✅ 是 |
extend(iterable) |
末尾扩展可迭代对象的元素 | iterable 为列表、元组等 |
✅ 是 |
insert(index, x) |
指定位置插入元素 | index 为插入索引 |
✅ 是 |
remove(x) |
删除第一个值为 x 的元素 |
x 为元素值,不存在抛 ValueError |
✅ 是 |
pop(index=-1) |
删除并返回指定索引元素(默认最后一个) | index 为索引,默认 -1 |
✅ 是 |
clear() |
清空所有元素 | 无 | ✅ 是 |
index(x, start, end) |
返回第一个 x 的索引 |
start/end 限定搜索范围 |
❌ 否 |
count(x) |
统计 x 出现次数 |
x 为元素值 |
❌ 否 |
sort(key, reverse) |
原地排序(升序/降序,支持自定义键) | key 为排序函数,reverse 控制方向 |
✅ 是 |
reverse() |
原地反转元素顺序 | 无 | ✅ 是 |
copy() |
返回浅拷贝新列表 | 无 | ❌ 否 |
5、元组类型
5.1 定义与本质
核心概念:元组是 Python 中一种有序、不可变序列,可存储任意类型元素(整数、字符串、对象等),元素间用逗号分隔,通常包裹在圆括号 () 中(括号可省略,但推荐使用以增强可读性)。
底层实现:基于固定大小数组实现,不可动态扩容,因此比列表更节省内存,访问速度更快。
不可变性:元组创建后,元素值和数量不可修改(无法添加、删除或替换元素),但元素若为可变对象(如列表),其内部数据可修改。
- 类型:
tuple - 用途:记录多个值,当多个值没有修改的需求,此时用元组更合适,元组里面的值不要改.
- 定义方式:在
()内用逗号分隔开多个任意类型的值.
一句话总结:
元组(`Tuple`) 就是一个用透明胶带封死的、透明的、装着一组固定东西的盒子。
你能看、能数、能找、能复制、能连盒子、能拆包,但就是不能改、不能加、不能减里面的东西!
当你需要一组固定不变的数据时,就用它。
创建盒子(元组)很简单:用圆括号 ( ) 把东西括起来,东西之间用逗号 , 隔开。
👉小试牛刀
t = (1, 1.1, '人生苦短,我用python!', True, (1, 1.1, '人生苦短,我用python!'), ['人生苦短,我用python!', 2, 3])
# 0 1 2 3 4 5
# -6 -5 -4 -3 -2 -1
print(t, type(t))
print(t[0], t[-6])
print(t[1], t[-5])
print(t[2], t[-4])
print(t[3], t[-3])
print(t[4], t[-2])
print(t[5], t[-1])
print(t[4][0])
print(t[5][0])5.2 元组的方法
可以删、查,不能新增和修改,但是:
删:删除整个元组对象
查:与列表一样索引,切片,长度len,count个数,index查找元素所在索引成员运算
元组内元素如果是可变对象,那这个可变对象还是支持它自己的增删改(除了删除可变对象本身之外)因为可变对象本身是元组的元素了,元组是不支持修改的。
t = (1, 2, '人生苦短', (4, 5), [7, 8])
# 0 1 2 3 4
# -5 -4 -3 -2 -1
# 不能索引修改
# 元组本身是不可变的,他的元素是不能直接修改的,
# 但是如果元组里的元素本身就是可变的,那么这个可变的元素,它遵循的是自己可变的原则
try:
t[0] = 2
except Exception as e:
print(e)
# 元组里的列表可以改
t[4][0] = '小花'
print(t)
# 查
# 与列表一样索引,切片,长度len,count个数,index查找元素所在索引成员运算
# 删
del t5.3 元组🆚列表
| 特性 | 元组(Tuple) | 列表(List) |
|---|---|---|
| 可变性 | 不可变(元素不可增删改) | 可变(支持增删改) |
| 语法 | 圆括号 ()(可省略) |
方括号 [] |
| 内存效率 | 更高(固定大小,无需扩容空间) | 较低(动态数组,预留扩容空间) |
| 访问速度 | 更快(无需检查动态变化) | 稍慢(需维护动态大小) |
| 哈希性 | 可哈希(可作字典键/集合元素) | 不可哈希(不可作字典键) |
| 方法 | 仅 count()、index() |
丰富(append()、sort() 等) |
| 适用场景 | 存储不可变数据(如配置、坐标) | 存储动态数据(如用户输入、日志) |
6、字典类型
6.1 字典类型 dict
核心概念:字典是 Python 中一种无序(Python 3.7+ 变为有序)、可变的键值对(key-value)集合,用于存储映射关系数据。每个元素由 键(key) 和 值(value) 组成,键和值之间用冒号 : 分隔,元素间用逗号分隔,整体包裹在花括号{} 中。
底层实现:基于哈希表(Hash Table) 实现,通过键的哈希值快速定位值,因此查找、添加、删除操作的平均时间复杂度为 O(1)(常数级)。
键的要求:
- 必须是可哈希(不可变)类型,如整数、字符串、元组(元素不可变)等。
- 不能重复(重复键会被覆盖,保留最后一次赋值)。
- 值的特性:可以是任意类型(包括可变类型如列表、字典,或函数、对象等),且可重复。
作用:记录多个key:value值(键值对),key:value => key描述性质 value:值
如: 小林: 身份证:4358112
小爱 : 身份证:4546544
小坤: 身份证:123135415
姓名: 念尘 年龄:18
key对value(键对值) key:value
种类 : 具体内容
鱼: 带鱼、鲫鱼、鲤鱼
游戏: csgo、英雄联盟、cf、王者荣耀
key : value --> 键值对定义:
在{}内用逗号分隔开多个key:value元素,其中value可以是任意数据类型。
通常用字符串、数字或元组(元组里的元素也必须不可变)来做标签。列表不能当标签(因为列表会变)。
👉小试牛刀🔪
dic = {
"列表": ["苹果", "香蕉"], # 值可以是任何类型,比如列表
"字符串": "饼干", # 也可以是字符串
"整型": 3, # 值也可以是整型
"布尔": True, # 值也可以是布尔
"元组": (1,2,3), # 值也可以是元组
"字典": {"小明": 18}, # 值也可以是字典
"浮点": 1.1 # 值也可以是浮点
}
print(dic)
print(type(dic))
# 取值
print(dic['列表'])
print(dic['字符串'])
print(dic['整型'])
print(dic['字符串'])
print(dic['布尔'])
print(dic['元组'])
print(dic['字典'])
print(dic['浮点'])6.2 字典的相关操作
# 字典的创建
# 花括号{}
info1 = {"name": '大海', 'age': 18}
# dict()
info2 = dict(x=1,y=2)
print(info1, id(info1))
print(info2, id(info2))
# 增
info1["addr"] = '北京'
info2["addr"] = '纽约'
print(info1, id(info1))
print(info2, id(info2))
# 对比id值可以发现增加之后不会改变内存地址,所以是可变类型
# len() 字典里面的len方法是查看键值对的个数
print(len(info1), len(info2))
# 成员运算 in 和 not in 字典的成员运算判断的是key,返回值是布尔值
print('name' in info1)
print('addr' in info2)
# 删
# clear()
# info1.clear()
# info2.clear()
# print(info1, info2)
# del
# del info1['addr']
# del info2['addr']
# print(info1, info2)
# 删除的key不存在会报错
# del info1['add']
# print(info1)
# pop 删除 返回值是value 实际上就是拿走了字典的value
# res = info1.pop('name')
# print(res, info1)
# 改
# 1'
# info1['name'] = "小海"
# print(info1)
# 2'
info1.update({"name": '小海'})
info1.update({"name1": '小海1'}) # 如果修改的字段不存在,其实就是新增了
print(info1)
# setdefault
# 有则不动/返回原值,无则添加/返回新值
# 字典中已经存在key则不修改,返回已经存在的key对应的value
res = info1.setdefault('name', 'xxx')
print(res, '-')
print(info1)
res2 = info1.setdefault('name2', 'xxx')
print(res2)
print(info1)
# 查
# 1'
print(info2['addr'])
# 查一个不存在的key会报错
# print(info1['xxx'])
# 2'
print(info1.get('name'))
# 没有key就返回None,不会报错
print(info1.get('xxxx'))
# 可自定义返回值
print(info1.get('xxxx', '无'))
# 3'
# 取所有key
print(list(info1.keys()))
# 取出所有值
print(list(info1.values()))
# 取出所有键值对
print(list(info1.items()))6.3 字典🆚列表🆚元组
| 特性 | 字典(Dictionary) | 列表(List) | 元组(Tuple) |
|---|---|---|---|
| 存储方式 | 键值对(映射关系) | 有序元素(序列) | 有序元素(不可变序列) |
| 访问方式 | 键(dict[key]) |
索引(list[index]) |
索引(tuple[index]) |
| 查找效率 | O(1)(哈希表) | O(n)(需遍历) | O(n)(需遍历) |
| 可变性 | 可变(键值对可增删改) | 可变(元素可增删改) | 不可变(元素不可增删改) |
| 键/索引要求 | 键唯一、可哈希 | 索引为非负整数 | 索引为非负整数 |
| 适用场景 | 存储关联数据(如配置、缓存) | 存储动态序列(如日志、列表) | 存储不可变序列(如坐标、日期) |
6.4 字典方法总结
| 方法名 | 核心功能 | 参数要点 | 原地修改? |
|---|---|---|---|
update([other]) |
用其他字典/键值对更新,覆盖重复键 | other 为字典、元组列表或关键字参数 |
✅ 是 |
setdefault(key, d) |
键存在返回值,不存在则添加键值对 {k: d} |
d 为默认值(默认 None) |
✅ 是 |
get(key, d) |
安全访问键值,不存在返回 d(默认 None) |
key 为目标键,d 为默认值 |
❌ 否 |
keys() |
返回所有键的动态视图 | 无 | ❌ 否 |
values() |
返回所有值的动态视图 | 无 | ❌ 否 |
items() |
返回所有键值对的动态视图((k, v) 元组) |
无 | ❌ 否 |
pop(key, d) |
删除并返回键值,不存在返回 d(或抛错) |
key 为目标键,d 为默认值 |
✅ 是 |
popitem() |
删除并返回最后插入的键值对(3.7+ 有序) | 无(空字典抛 KeyError) |
✅ 是 |
clear() |
清空所有键值对 | 无 | ✅ 是 |
copy() |
返回浅拷贝新字典 | 无(嵌套对象仍为引用) | ❌ 否 |
fromkeys(iter, v) |
创建新字典,键来自 iter,值为 v |
iter 为键的来源,v 为默认值(共享) |
❌ 否 |
6.5 总结:
字典(Dictionary) 就是一个贴满了标签的万能收纳盒。你存东西、找东西、改东西、删东西,全靠你贴的那个标签(Key)。
标签要唯一且不能变(常用字符串或数字),值(Value)随便放。
当你需要通过名字快速找到信息时,字典就是你的最佳拍档!记住它的核心:钥匙(Key)开锁找值(Value)。
7、集合类型
在Python中,集合(Set)是一种无序且元素唯一的可变数据类型,主要用于存储互不相同的元素,支持数学中的集合运算(如交集、并集、差集等)。
7.1集合的定义、创建和使用
核心概念:集合是 Python 中一种无序、可变、元素唯一的序列,用于存储不重复的元素集合。元素间用逗号分隔,整体包裹在花括号{} 中,或通过 set() 函数创建。
底层实现:基于哈希表(Hash Table) 实现,元素需可哈希(不可变类型),因此查找、添加、删除操作的平均时间复杂度为 O(1)(常数级)。
核心特性:
- 无序性:元素没有固定顺序,不支持索引访问。
- 唯一性:自动去重,重复元素会被忽略。
- 可变性:支持动态添加/删除元素(但元素本身必须不可变)。
✅基本语法
使用大括号 {} 或 set() 函数创建,元素间用逗号分隔
# 集合的定义
s = {1,2,'人生苦短'}
# s = set()
print(s, type(s))
s1 = {'a','b','d'}
s2 = {'a','b','c'}
print(s1, type(s1))
print(s2, type(s2))
# 运算 交集 并集 差集 对称差集 想象你有两个朋友圈。
print(s1 & s2) # 交集 拿2个集合相同的元素 shift + 7 & ( 你和朋友都认识的人。)
print(s1 | s2) # 并集 两个集合合并,相同只取一次,不同就都取(你们两人认识的所有人(不重复))
print(s1 - s2) # 差集 s1 有但 s2 没有的值(我认识,但他不认识的人。)
print(s2 - s1) # 差集 s2 有但 s1 没有的值(我认识,但他不认识的人。)
print(s1 ^ s2) # 对称差集 (我们各自独有的好友)✅运算总结:
| 运算类型 | 运算符 | 方法 | 示例(s1={1,2,3}, s2={2,3,4}) |
|---|---|---|---|
| 并集(所有元素) | s1 | s2 |
s1.union(s2) |
{1,2,3,4} |
| 交集(共含元素) | s1 & s2 |
s1.intersection(s2) |
{2,3} |
| 差集(s1 独有) | s1 - s2 |
s1.difference(s2) |
{1} |
| 对称差集(独有的元素) | s1 ^ s2 |
s1.symmetric_difference(s2) |
{1,4} |
✅不可变集合(frozenset)[ 扩展 ]
用 frozenset() 创建,元素不可修改,可作为字典的键或其他集合的元素。
fs = frozenset([1, 2, 3])
print(fs,type(fs))✅集合的相关操作
set1 = {1,2,'小明'}
print(id(set1))
# 添加单个元素 add
set1.add('小红')
print(set1, id(set1))
# 对比id值可知,集合是可变类型
# 添加多个元素
# set1.update(['1', '2', '小明'])
# print(set1)
# 删除 (多运行几次就可以发现每次pop的值不一样,说明集合的无序) 随机删除并返回一个元素(因集合无序,无法指定)
# set1.pop()
# print(set1)
# remove 指定删除
# set1.remove('小明')
# set1.remove(1)
# 元素不存在会报错
# set1.remove(3)
# print(set1)
# discard 删除指定元素
# set1.discard(1)
# print(set1)
# 若元素不存在,无操作
# set1.discard(3)
# print(set1)
# in、 not in
s = {"apple", "banana"}
print("apple" not in s) # 输出:True(存在)
print("orange" in s) # 输出:False(不存在)7.2 集合的核心特性
- 无序性:元素没有固定顺序,不支持索引和切片。
- 唯一性:自动去重,重复元素会被保留一个。
- 可变性:普通集合(
set)支持添加/删除元素,frozenset不可变。 - 元素类型限制:元素必须是不可变类型(如整数、字符串、元组),列表、字典等可变类型不能作为集合元素。
7.3 集合🆚列表🆚元组🆚字典
| 特性 | 列表(List) | 字典(Dictionary) | 元组(Tuple) | 集合(Set) |
|---|---|---|---|---|
| 定义 | 有序、可变序列 | 无序(3.7+有序)键值对集合 |
有序、不可变序列 | 无序、可变、元素唯一集合 |
| 语法标识 | [] |
{key: value} |
()(或无括号) |
{}(空集合需用 set()) |
| 可变性 | 可变(增删改元素) | 可变(增删改键值对) | 不可变(元素不可增删改) | 可变(增删元素,元素需不可变) |
| 元素唯一性 | 允许重复元素 | 键唯一,值可重复 | 允许重复元素 | 自动去重(元素唯一) |
| 有序性 | 有序(支持索引/切片) | 3.7+有序(插入顺序) |
有序(支持索引/切片) | 无序(不支持索引/切片) |
| 元素类型限制 | 无(可存储任意类型) | 键必须可哈希(不可变类型) | 无(可存储任意类型) | 元素必须可哈希(不可变类型) |
| 底层实现 | 动态数组 | 哈希表 | 固定大小数组 | 哈希表 |
| 是否可哈希 | 不可哈希(不能作字典键) | 不可哈希(不能作字典键) | 可哈希(可作字典键) | 不可哈希(不能作字典键) |
核心操作对比
1、创建方式
| 数据结构 | 示例 |
|---|---|
| 列表 | [1, 2, 3]、list(range(5)) |
| 字典 | {"a": 1, "b": 2}、dict(a=1, b=2) |
| 元组 | (1, 2, 3)、1, 2, 3(单元素需加逗号:(1,)) |
| 集合 | {1, 2, 3}、set([1, 2, 3])(空集合:set(),不可用 {}) |
2、访问元素
| 数据结构 | 访问方式 | 效率 | 示例 |
|---|---|---|---|
| 列表 | 索引 lst[index] |
O(n) | [1,2,3][0] → 1 |
| 字典 | 键 dict[key] 或 dict.get(key) |
O(1) | {"a":1}["a"] → 1 |
| 元组 | 索引 tpl[index] |
O(n) | (1,2,3)[-1] → 3 |
| 集合 | 成员检测 elem in set |
O(1) | 1 in {1,2,3} → True |
3、添加/修改元素
| 数据结构 | 添加/修改操作 | 示例 |
|---|---|---|
| 列表 | append()(尾加)、insert()(指定位置) |
lst = [1]; lst.append(2) → [1, 2] |
| 字典 | dict[key] = value 或 update() |
d = {}; d["a"] = 1 → {"a": 1} |
| 元组 | 不可修改(需重新创建新元组) | t = (1,2); t + (3,) → (1,2,3) |
| 集合 | add()(单元素)、update()(批量) |
s = {1}; s.add(2) → {1, 2} |
4、删除元素
| 数据结构 | 删除操作 | 示例 |
|---|---|---|
| 列表 | del lst[index]、pop()、remove() |
lst = [1,2]; lst.pop() → [1] |
| 字典 | del dict[key]、pop(key)、popitem() |
d = {"a":1}; d.pop("a") → {} |
| 元组 | 不可删除(需重新创建新元组) | - |
| 集合 | remove(elem)(不存在抛错)、discard(elem)(安全删除) |
s = {1}; s.remove(1) → set() |
5、场景
| 数据结构 | 核心适用场景 | 典型案例 |
|---|---|---|
| 列表 | 存储动态序列(元素需有序/重复)、频繁修改数据 | 日志记录、待办事项列表、批量数据存储 |
| 字典 | 存储键值对映射关系、配置参数、快速查找数据 | 用户信息({"name": "Alice", "age": 30})、缓存数据({key: result}) |
| 元组 | 存储不可变数据、保护数据安全、函数返回多值 | 坐标 (x, y)、日期 (year, month, day)、函数返回 (status, data) |
| 集合 | 去重、成员检测、集合运算(交集/并集/差集) | 列表去重 list(set(lst))、用户ID去重、共同好友计算 users1 & users2**** |
7.4 特性区别总结
可变性 vs 不可变性:
- 可变:列表、字典、集合(适合动态数据)。
- 不可变:元组(适合静态数据,如常量、哈希键)。
有序性 vs 无序性:
- 有序:列表、元组、
3.7+字典。 - 无序:集合、
3.7前字典(不支持索引,顺序不固定)。
元素唯一性:
- 仅集合支持自动去重,其他结构允许重复元素。
哈希性:
- 可哈希:元组(可作字典键或集合元素)。
- 不可哈希:列表、字典、集合(不能作字典键)。
性能核心:
- 字典和集合基于哈希表,查找/添加/删除效率为
O(1),适合高频操作。 - 列表和元组基于数组,索引访问快,但删除中间元素效率低
(O(n))。
六、用户交互
input函数
input() 是 Python 中用于获取用户输入的内置函数。
简单来说,它可以让程序暂停运行,等待用户在键盘上输入内容,按回车键后继续执行,并将用户输入的内容返回给程序。
作用:实现程序与用户的交互(比如让用户输入名字、年龄、选择等)。
电脑与用户交互:
Python的input()函数用于从用户处获取键盘输入
内置函数input()阻塞等待用户输入
注意:
input函数返回都是字符串
👉小试牛刀
strings = input("请输入你最喜欢的动画片:")
print(type(strings), id(strings))👉记住:input函数接收到的值是字符串
age = input("请输入你的年龄:")
print(age, id(age), type(age))
# '18' -> 18
age2 = int(age)
print(age2, type(age2))👉再来个案例练练手
# 两个数相加
a = input("请输入第一个数:")
b = input("请输入第二个数:")
print(a+b)