《Python 入门到进阶完整学习笔记 | 基础语法 + 容器 + 函数 + 面向对象》
本文是我 Agent 开发学习路线的 Python 基础阶段笔记,后续会持续更新 Agent 相关的进阶内容,欢迎关注我的专栏「Agent 学习」一起进步。
Python 入门到进阶完整学习笔记 | 基础语法 + 容器 + 函数 + 面向对象
本文整理了 Python 从环境搭建、基础语法、流程控制、五大数据容器、函数、面向对象、异常处理、模块与包全套入门知识点,包含大量实操代码、经典案例、易错点与开发快捷键,适合零基础自学、复习、面试复盘使用。
Python启航
初识
荷兰计算机科学家吉多·范罗苏姆(龟叔)在1991年发布的编程语言
环境准备
解释器
- Python官网:https://www.python.org/
- 在python解释器,退出到windows:exit()
- 一次性执行多行python代码,将多行python代码定义在一个文件中(hello.py),然后用python命令运行:python xxx.py(先切换到指定目录)
- 编写程序,英文符号
开发工具
- IDE:集成开发工具
- Shift+alt+句号 调大字体
- Shift+alt+逗号 调小字体
入门程序
- 注释:#
- 快捷键:ctrl+/
- Python中使用;作为语句分隔符,使用换行符作为终止符
剖析—目录结构
- .idea文件:保存项目的配置信息
- .venv文件:虚拟环境,保存项目的环境信息
- 通过虚拟的运行.venv,可以保证每个Python项目都在一个相对独立的隔离环境中运行,项目与项目之间互不影响
剖析—配置
设置->外观与行为
Python核心语法
数据存储与运算
字面量与变量
字面量
- 程序中直接书写的固定值

变量
-
程序中用来存储单个数据的容器
-
变量是指存储数据的容器(空间),而不是其中存储的数据
- Python是动态类型语言,在程序运行时才进行检查,变量的类型可以在程序运行过程中改变(一个变量可以接收不同类型的值)
-
定义格式:变量名 = 变量的值
-
连续赋值:a,b = 1,‘‘python’’
标识符
- 字母数字下划线
- 不能以数字开头
- 不能使用关键字
- 严格区分大小写
- true合法 True非法(因为是关键字)
- 命名规范
- 见名知意
- 多部分使用下划线连接:(蛇形命名法):update_time
- 英文字母全小写
- PEP8:代码规范文档指南
常见数据类型

- 变量本身没有类型,type(变量)输出的类型时变量中存储的数据的类型
- type(要查看类型的数据)
- isinstance(数据,类型) # True False
字符串
-
字符:是文本世界的基本单位,也是字符串的基本组成单位
-
# 定义字符串的三种方式 s1 = "string" s2 = 'python' # 英文缩写要转义 msg = 'It\'s very good' # 上面两种不支持换行,要做字符串的拼接 s3 = """ hello: 欢迎学习 卡基地和hi火车 """ #多行字符串 print(s1) print(type(s1))

字符串拼接

-
[!CAUTION]
+号可以用来拼接两个字符串,但是无法将非字符串与字符串进行拼接(非字符串需要转换为字符串类型)
-
str(int数字)->str(age) 将int类型的数字转为字符串
字符串格式化
%占位符

注意:前面有多少个占位符(%s),后面就需要有多少个变量(或数据),前后数量要一致
f”内容{变量/表达式}”

输入与输出

[!CAUTION]
无论键盘输入什么类型的数据,获取到的数据永远都是字符串类型
name = input("请输入您的姓名:")
print(f"您的姓名是{name}")
age = input("请输入您的年龄:")
print(f"您的年龄是{age}")

运算符
-
算术运算符
-

-
y = float(input("y:")) -
精度损失:由于计算机底层是基于二进制进行数据的存储与处理,二进制是无法准确的表示所有的小数,因此涉及到浮点数的运算,可能损失精度
-
-
赋值运算符
-

-
有浮点数参与运算,答案也是浮点数,哪怕是整除//
-
-
比较运算符
-
逻辑运算符
数据的逻辑处理—流程控制语句
条件判断
基本格式

进阶


- if语句的嵌套
- pass是一个空语句,起到一个语法占位的作用
模式匹配
match…case


循环
while


for
msg = input("请输入要遍历的字符串:")
for s in msg:
print(f"元素{s}")
else:
print("结束")

range

嵌套循环
-
shift+回车(enter) 快速回车
-
print(“*”):print自带换行效果,每一次执行都会输出新的一行中
-
print(“*”,end=“ ”):end表示的是每一次输出以什么结束;默认\n,表示换行,不想换行就为空字符串
-
m = int(input("长度:")) n = int(input("宽度:")) for j in range(n): for i in range(m): print("*",end=" ") print()
# 打印99乘法表
for i in range(1,10): # 外层循环,控制行
for j in range(1,i+1): # 内层循环,控制列
print(f"{j} x {i} = {j*i}",end="\t")
print()
- break:只能出现在循环中,表示跳出循环的含义(break跳出循环时,while后面else中的代码不会执行)
- continue:只能出现在循环中,表示中断本次循环,直接进入下一次循环

数据存储容器
列表(list)

-
注意:如果指定的索引超出范围,索引报错
-
有序:输入和取出值的大小一致

切片


常见方法
内置的常见功能(添加元素\删除元素\排序等)

案例

- 解包

- 推导式
s1 = [i**2 for i in range(1,21)]
print(s1)
s = [12,15,48,96,88,36,77,91,53,11]
s1 = [i**2 for i in s if i%2==0]
print(s1)
# 去重
# for num in s:
# if num not in s3:
# s3.append(num)
# print(s3)

字符串(str)
- 基本操作



- 常用方法

- 案例

if mail.count("@")==1 and "." in mail:
# 回文
s = input("输入一个字符串:")
s_reverse = s[::-1]
print(s_reverse==s)
#反转后大写后输出
lst = []
for i in range(0,10):
s = input("请输入字符串:")
s_reverse = s[::-1]
s_reverse = s_reverse.upper()
lst.append(s_reverse)
for i in lst:
print(i,end=" ")
元组(tuple)
- 基本操作


- 组包与解包

a = 10
b = 20
#a,b = b,a
# 组包
t = b,a
# 解包
a,b = t
print(a,b)

- 案例
集合(set)
- 基本操作
无序,不可重复,可修改的数据容器
空集合:
s = set()
print(s)
print(type(s))
[!CAUTION]
空集合的定义不可以使用{},{}表示的是空字典,由于集合是无序的,因此不支持下标索引访问


- 案例

字典(dict)
里面存储的是==键值对(key:value)==类型的数据,可以根据键(key)找到对应的值(value)
字典定义

-
key不能重复,如果重复,后面的值会覆盖掉前面的值
-
key必须是不可变类型(str,int ,float,tuple),不能是list,set,dict

常用操作

-
遍历
-
# 遍历 for k in dict1.keys(): print(f"{k}:{dict1[k]}") for item in dict1.items(): print(f"{item[0]}:{item[1]}") for k,v in dict1.items(): print(f"{k}:{v}")

案例

- 同时进行列编辑:alt+shift+列
总结


函数
Python内置函数:
- 提前定义好的
- 可以重复使用
- 实现特定功能
函数基础
函数定义

- 函数定义的时候并不会执行,只有在调用的时候,函数体的逻辑才会执行
- 函数必须先定义,后调用

函数的参数与返回值

-
如果返回值有多个,多个返回值之间逗号分隔,多个返回值会封装到元组中
-
保留一位小数
round(2*3.14*r,1) -
解包操作
-
def circle_area_len(r): return 3.14*r*r,round(2*3.14*r,1) a,l = circle_area_len(10) print(a) print(l)

函数说明文档

函数的嵌套调用

案例


-
回文:用切片
reverse_s = s[::-1] return s == reverse_s
函数进阶
函数变量的作用域



函数参数详解
-
传参方式




-
默认参数

跳过一个默认参数,后面的默认参数要使用关键字参数指定传入(默认是位置参数)
-
不定长参数

这里*agrs只封装 位置参数 ,关键字参数不会封装到元组里面
元组保留一位小数:round(参数,保留小数个数)

**kwargs封装 关键字参数 为字典

-
参数类型

匿名函数


- reverse=false(默认)

案例

- 递归调用:函数中自己调用自己的情况(先层层递进,再逐层回归)一定要有终结点


类型注解
基本介绍


- 类型注解只是起到语法提示作用,并不会影响程序运行的结果

函数类型注解

模块

导入模块


自定义模块
-
常量:名字全大写
-
字符串重复输出:(‘’-‘’ * 30)重复输出30次
-
导入模块会输出被导入模块的测试代码(print()语句)
-
__ name __ :Python中的内置变量,表示的当前模块的名字(直接运行当前模块,__ name__ 的值为’'__ main __ ‘’(字符串),当该模块被导入时,__ __ name __的值就是模块名称)
-
执行当前文件,则会执行如下代码,如果被当作模块导入,则如下代码不执行

-
-
ctrl+y直接删除一行


软件包(package)



# 如果要通过from utils import * 导入包下的所有模块,需要__init__.py 文件中添加__all__=[]
"""
__all__ = [
"my_fun",
"my_var"
]
"""
from utils import *
my_var.log_separator2()
print(my_fun.PI)
# 相对路径:从当前文件所在目录开始查找
# from utils.my_var import log_separator3
# 绝对路径:从项目的根目录下开始查找
from 第二章.utils.my_var import log_separator3
log_separator3()

面向对象基础



类与对象

- 动态添加属性:不推荐
- 推荐:
class Car:
# __init__ 方法是初始化的方法,会在对象创建时自动调用,可以在该方法中为对象设置对应的属性
# self:是第一个参数,表示当前所创建出来的实例对象
def __init__(self,c_color,c_brand,c_name,c_price):
# self.属性=参数值
self.color=c_color
self.brand=c_brand
self.name=c_name
self.price=c_price
print("初始化完毕")
# 创建对象
c1 = Car("红色","BMW","x7",800000)
print(c1.__dict__)

实例方法

魔法方法




实例属性与类属性

- 通过实例对象,查找属性时,会先查找实例属性;实例属性不存在,再查找类属性
- 实例属性:属于单个对象,每个对象独有;类属性:属于类,被所有实例对象共享
案例


异常
常见异常类型
常见的有这些:
ZeroDivisionError # 除数为 0
IndexError # 下标越界
KeyError # 字典 key 不存在
NameError # 变量名不存在
TypeError # 类型错误
ValueError # 值错误
FileNotFoundError # 文件不存在
AttributeError # 对象没有这个属性或方法
ImportError # 导入模块失败
举几个例子:
# KeyError
d = {"name": "Tom"}
print(d["age"])
# TypeError
print("年龄:" + 18)
# ValueError
num = int("abc")
注意区分 TypeError 和 ValueError:
int([1, 2, 3]) # TypeError,类型不合适
int("abc") # ValueError,类型是字符串没问题,但值不能转成整数
try…except 基本用法
格式:
try:
可能出错的代码
except 异常类型:
出错后的处理代码
例子:
try:
a = int(input("请输入一个数字:"))
print(10 / a)
except ZeroDivisionError:
print("除数不能为 0")
except ValueError:
print("请输入合法数字")
如果用户输入 0,会进入:
except ZeroDivisionError
如果用户输入 abc,会进入:
except ValueError
捕获多个异常
可以分开写:
try:
x = int(input("请输入数字:"))
print(10 / x)
except ValueError:
print("输入的不是数字")
except ZeroDivisionError:
print("不能除以 0")
也可以合并写:
try:
x = int(input("请输入数字:"))
print(10 / x)
except (ValueError, ZeroDivisionError):
print("输入有问题")
分开写的好处是可以针对不同错误给不同提示。
捕获异常对象 as e
try:
print(10 / 0)
except ZeroDivisionError as e:
print("发生错误:", e)
输出:
发生错误: division by zero
e 就是异常对象,里面保存了错误信息。
Exception:捕获大多数异常
try:
x = int(input("请输入数字:"))
print(10 / x)
except Exception as e:
print("程序出错:", e)
Exception 是很多常见异常的父类,可以捕获大多数普通错误。
但是不建议一上来就无脑写:
except Exception:
pass
因为这会把错误隐藏掉,程序出问题你也不知道。
比如:
try:
result = 10 / 0
except Exception:
pass
程序不会报错,但你也不知道它其实失败了。
else:没有异常时执行
try:
x = int(input("请输入数字:"))
except ValueError:
print("输入错误")
else:
print("转换成功:", x)
else 的意思是:try 里面没有发生异常,才执行。
更完整一点:
try:
x = int(input("请输入除数:"))
result = 10 / x
except ValueError:
print("请输入数字")
except ZeroDivisionError:
print("不能除以 0")
else:
print("结果是:", result)
finally:不管有没有异常都执行
try:
f = open("test.txt", "r", encoding="utf-8")
content = f.read()
except FileNotFoundError:
print("文件不存在")
finally:
print("程序结束")
finally 常用于释放资源,比如关闭文件、关闭数据库连接、释放锁等。
更常见的是:
f = None
try:
f = open("test.txt", "r", encoding="utf-8")
content = f.read()
print(content)
except FileNotFoundError:
print("文件不存在")
finally:
if f:
f.close()
不过实际开发中,文件处理更推荐用:
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read()
with 会自动关闭文件,比 finally 更方便。
raise:主动抛出异常
有时候不是 Python 自动报错,而是你自己判断不合法,然后主动抛异常。
def set_age(age):
if age < 0:
raise ValueError("年龄不能小于 0")
print("年龄是:", age)
set_age(-1)
会报:
ValueError: 年龄不能小于 0
这在函数参数校验里很常见。
比如:
def divide(a, b):
if b == 0:
raise ZeroDivisionError("除数不能为 0")
return a / b
自定义异常
可以自己定义异常类,通常继承 Exception:
class AgeError(Exception):
pass
def set_age(age):
if age < 0 or age > 150:
raise AgeError("年龄范围不合法")
print("年龄设置成功")
try:
set_age(200)
except AgeError as e:
print("年龄错误:", e)
输出:
年龄错误: 年龄范围不合法
自定义异常常用于大型项目中,让错误类型更清晰。
比如:
class LoginError(Exception):
pass
class PermissionError(Exception):
pass
class BalanceNotEnoughError(Exception):
pass
这样看到异常名字,就知道业务出错原因。
异常的执行流程
看这个例子:
try:
print("1")
print(10 / 0)
print("2")
except ZeroDivisionError:
print("3")
finally:
print("4")
print("5")
输出:
1
3
4
5
解释:
print("1") # 正常执行
print(10 / 0) # 出错,跳到 except
print("2") # 不执行
except # 捕获异常,输出 3
finally # 一定执行,输出 4
后续代码继续执行,输出 5
异常处理的常见写法
写法一:用户输入校验
while True:
try:
age = int(input("请输入年龄:"))
break
except ValueError:
print("输入错误,请输入整数")
print("你的年龄是:", age)
写法二:读取文件
try:
with open("data.txt", "r", encoding="utf-8") as f:
data = f.read()
except FileNotFoundError:
print("文件不存在")
except PermissionError:
print("没有权限读取文件")
写法三:网络请求、数据库操作
try:
# 连接数据库
# 查询数据
pass
except Exception as e:
print("操作失败:", e)
finally:
# 关闭连接
pass
总结
try:
可能出错的代码
except 错误类型:
出错后的处理
else:
没出错时执行
finally:
不管出不出错都执行
本篇覆盖 Python 零基础核心语法、数据容器、函数、面向对象、异常处理、模块包,是入门必备全套知识点,建议多敲代码练习案例,吃透基础再进阶爬虫 / 数据分析 / 后端等方向。
更多推荐




所有评论(0)