1.环境搭建与IDE配置(venv/uv)
1.1 venv和uv的区别
venv 是 Python 标准库自带的虚拟环境工具,为每个项目复制一份独立的解释器目录与第三方包目录;uv 是用 Rust 编写的高性能 Python 版本与包管理器,能用更少的命令、更快的速度完成同样的事。
1.2 venv创建虚拟环境总流程
1.确认解释器版本(Windows 用 python 或 py -3;macOS / Linux 用 python3)
python --version
我用的是python3.13.11
2.建项目目录并进入
mkdir todo-app && cd todo-app
在pycharm里面需要分成两次输入,不然会报错
3.用标准库 venv 创建虚拟环境:生成 .venv 目录,无输出即成功
python -m venv .venv
4.激活环境(激活成功后命令行提示符前出现 (.venv))
Windows PowerShell:
.venv\Scripts\Activate.ps1
Windows CMD:
.venv\Scripts\activate.bat
macOS / Linux:
source .venv/bin/activate
5.激活后再装包,只影响当前 .venv
python -m pip install requests
6.退出当前虚拟环境
deactivate
1.3 uv创建虚拟环境
1.uv 等价流程:不用手动 activate,uv run 会自动使用 .venv 里的解释器
uv venv # 等价于 python -m venv .venv,速度快得多
2.uv pip install requests # 等价于激活后的 pip install
3.uv run python main.py # 无需激活,直接在该环境里执行脚本
4.uv python list # 查看本机可用 / 可下载的 Python 版本
2.核心语法、数据类型与运算符
2.1 变量的基本使用
2.1.1标识符
第一个字符必须以字母(a-z, A-Z)或下划线 _ 。
标识符的其他的部分由字母、数字和下划线组成。
标识符对大小写敏感,count 和 Count 是不同的标识符。
标识符对长度无硬性限制,但建议保持简洁(一般不超过 20 个字符)。
禁止使用保留关键字,如 if、for、class 等不能作为标识符
2.1.2注释
Python中单行注释以#开头,还有一个快捷键ctrl+/,多行注释"""(内容)"""
2.2数据类型的基本分类
2.2.1标准数据类型
1.不可变数据(4 个):Number(数字)、String(字符串)、bool(布尔)、Tuple(元组)
2.可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)
2.3运算符
2.3.1算术运算符
+加-减*乘/除//整除%取余(模运算)**幂运算
2.3.2比较运算符
==等于!=不等于>大于<小于 >=大于等于<=小于等于
2.3.3逻辑运算符
and与 or或not非
2.3.4赋值运算符
+=加后赋值 -=减后赋值 *=乘后赋值 /=除后赋值 //=整除后赋值 %=取余后赋值**=幂后赋值
2.3.5成员运算符
in在……之中not in不在……之中
2.3.6身份运算符
is是同一个对象is not不是同一个对象
2.4数据类型转换
有时候,我们需要对数据内置的类型进行转换,数据类型的转换,一般情况下你只需要将数据类型作为函数名即可。
Python 数据类型转换可以分为两种:
1.隐式类型转换 - 自动完成:较低数据类型(整数)就会转换为较高数据类型(浮点数)
2.显式类型转换 - 需要使用类型函数来转换:需要用户将对象的数据类型转换为所需的数据类型
2.5分支语句
2.6 for循环语句
迭代循环,用于遍历序列或可迭代对象,可以
2.7while循环
基本格式:
如果 while 后面的条件语句为 false 时,则执行 else 的语句块。
语法格式如下:
while <expr>: <statement(s)> else: <additional_statement(s)>
2.8 isdigit() 与 isinstance()对比
| 对比项 | isdigit() | isinstance() |
|---|---|---|
| 类型 | 字符串的方法 | Python内置函数 |
| 调用方式 | 字符串.isdigit() | isinstance(对象, (类型,...)) |
| 作用对象 | 只能对字符串调用 | 可以判断任何类型的对象 |
| 判断内容 | 判断字符串内容是否全由数字字符组成(即"长得像不是纯整数") | 判断对象是否属于指定的某类/某几类类型 |
| 返回结果 | 布尔值True/False | 布尔值True/False |
| 能否判断整数 | ✅(如"123") | ✅(如123) |
| 能否判断浮点数 | ❌("3.14"→ False) | ✅(若写了float) |
| 能否判断负数 | ❌("-5"→ False) | ✅(若写了int/float) |
| 判断对象还是内容 | 判断字符串内容 | 判断对象的数据类型 |
| 典型应用 | 校验用户输入的字符串是否为纯数字 | 检查变量是否为某类型,做分支处理 |
| 支持类型继承 | 不涉及 | ✅ 支持(子类也算) |
b = isinstance(num, (int, float, str))
这里的isinstance用于判断num这个变量本身是否属于int、float、str这三种类型中的某一种。
如果
num = 5→b = True如果
num = 3.14→b = True如果
num = "123"→b = True(因为包含str)如果
num = [1,2]→b = False
关键区别一句话:
isdigit()看"长相":这个字符串看起来是不是一串数字字符。isinstance()看"身份":这个变量本质上属于什么类型。
注意:
isinstance(num, (int, float, str))把str也放进去了,所以字符串也会返回True。如果你本意是判断"是不是数字",就不应该包含str,写(int, float)更合适。而isdigit()只能用在字符串上,用来判断字符串内容是不是数字。
2.9 for和while循环的区别
| 对比项 | for循环 | while循环 |
|---|---|---|
| 循环次数 | 固定/可数,遍历某个序列(列表、字符串、range等) | 不确定,只要条件成立就一直循环 |
| 条件依赖 | 依赖"还有没有下一个元素" | 依赖"条件是否为真" |
| 是否必须手动更新 | 不需要,自动取下一个 | 必须在循环体里手动改变条件变量(否则死循环) |
| 适用场景 | "我要循环N次" 或 "遍历每个元素" | "我要循环直到某个条件不再成立" |
| 何时进循环 | 进入时就知道要循环多少次 | 每次执行前才判断条件 |
能用for就用for:遍历列表、字符串、range(n)固定次数时,更简洁、不易出错。
必须用while的情况:循环次数无法预知,只能靠条件判断。典型例子——让用户一直输入,直到输入"quit"才退出。
3.break和continue的使用
都可以用在while和for循环里
continue:跳过本次循环,执行下次循环
语法格式:
for item in iterable: if 跳过条件: continue # 处理代码
break:结束本次循环
for item in iterable: if 跳过条件: break # 结束循环
实例:
4.循环结合else的基本使用
实战效果:
5.字符串的基本使用和基本操作
5.1.1基本使用
三种创建方式:
单引号: str = 'hello world'
双引号创建: str = "hello world"
多行字符串创建: str = """ hello world hello world """
5.1.2基本操作(增删改查)
注意:字符串是不可变类型,所有的"增删改查"本质都是通过方法生成一个新的字符串,原字符串不改变.
1)增
定义一个原始字符串作为操作对象
s = "hello world" ================================================== 增(在原有字符串基础上扩充内容) ================================================== print("===== 增:拼接 =====") 1. 使用 + 拼接 new_s = s + " python" print(new_s) hello world python 2. 使用 * 重复 print("ab" * 3) ababab2)删
定义一个原始字符串作为操作对象 s = "hello world" ================================================== 删(删除字符串中的指定内容) ================================================== print("===== 删:利用替换实现删除 =====") 1. 使用 replace 替换为空字符串实现"删除" print(s.replace("l", "")) heo word 删除所有l 2. 删除字符串两侧的同时,可指定删除的字符 print("###hello###".strip("#")) hello 删除指定的#字符 3. 切片思想:保留除了指定位置以外的内容 print(s[:2] + s[3:]) helo world 删除索引2位置的字符(3)改
定义一个原始字符串作为操作对象 s = "hello world" ================================================== 改(替换/转换字符串的内容) ================================================== print("===== 改:替换 =====") 1. 替换指定内容 new_s = s.replace("world", "python") print(new_s) hello python print("===== 改:大小写转换 =====") 2. 大小写转换 print(s.upper()) HELLO WORLD 全部转大写 print(s.lower()) hello world 全部转小写 print("hello".capitalize()) Hello 首字母大写 print("===== 改:去除空白 =====") 3. 去除字符串两端的空白字符 str_space = " hello " print(str_space.strip()) hello 去掉两端空白 print(str_space.lstrip()) hello__ 去掉左边空白 print(str_space.rstrip()) __hello 去掉右边空白 print("===== 改:分割与拼接 =====") 4. 分割与拼接 list1 = s.split(" ") 按空格分割成列表 print(list1) ['hello', 'world'] str_list = ["a", "b", "c"] print("-".join(str_list)) a-b-c 用-将列表拼接成字符串(4)查(读取字符串中的内容)
定义一个原始字符串作为操作对象 s = "hello world" ================================================== 查(读取字符串中的内容) ================================================== print("===== 查:索引取值 =====") 1. 通过索引取值(正向从0开始,反向从-1开始) print(s[0]) h print(s[-1]) d print(s[0:5]) hello 切片(含头不含尾) print(s[6:]) world 从索引6到末尾 print("===== 查:查找位置 =====") 2. 查找子串的位置 print(s.find("world")) 6,返回第一次出现的下标,找不到返回-1 print(s.index("o")) 4,功能同find,找不到会报错 print(s.count("l")) 3,统计子串出现次数 print("===== 查:判断 =====") 3. 判断 print(s.startswith("he")) True 是否以指定内容开头 print(s.endswith("ld")) True 是否以指定内容结尾 print("hello" in s) True 是否存在 print("abc" not in s) True 是否不存在5.1.3实战示例:
切片操作,注意切片包含开始索引,不包含结束索引,所以结束索引要在原来的位置加1
身份证号码信息解析 id = input("请输入身份证号码: ") print(f"出生日期为:{id[6:14]}") if int(id[-2]) % 2 == 0: print("性别为女") else: print("性别为男")用户名规范化处理 # strip()表示去除字符串首尾的空格字符 # title()表示每个单词首字母大写,其他字母小写 # capitalize()表示字符串的第一个字符大写,其他字符小写 name = input("请输入用户名: ") name = name.strip() name = name.title() print(name)手机号脱敏显示 # replace()表示替换字符串中的子字符串,将前面的子字符串替换为后面的子字符串 # 注意:切片时,不包含结束索引,包含开始索引 phone = input("请输入手机号: ") if len(phone) == 11: print(f"手机号为:{phone.replace(phone[3:7], '****')}") else: print("手机号格式错误") count = phone.count("1") print(f"手机号中包含的1的数量为: {count}")统计英文句子单词个数与最长单词 # max()表示返回列表中最大的元素,key=len表示根据元素的长度进行比较 sent = "hello, world. python" sent = sent.replace(",", "") sent = sent.replace(".", "") print(sent) list1 = sent.split(" ") print(list1) print(f"单词列表长度为:{len(list1)}") print(f"最长单词为:{max(list1, key=len)},长度为:{len(max(list1, key=len))}")def highlight(text, keyword): keyword = [keyword] if isinstance(keyword, str) else keyword result = text for i in keyword: if i in result: result = result.replace(i, f"**{i}**") else: print("关键词不存在") return text return result print(highlight("我很喜欢python这门语言", "python")) print(highlight("我喜欢python和apple", ["python", "apple"])) print(highlight("hello world", "java"))这里运用isinstance来判断输入内容是否是字符串,然后定义一个新变量来装列表内容,利用for循环结合else实现整体逻辑