前言

安装

由于篇幅有限, 请参考网络上的教程 (python推荐使用anaconda)

代码仓库

gitee

如何运行

以打印hello world为例

1
2
3
# main.py文件
name = input("请输入你的名字:")
print(f"你好, {name}!")
1
python main.py

变量定义和数据类型

变量是一个指向内存中某个地址的标识符, 一般用来存放数据.
数据类型就是表示某个变量的类型, 类型决定这个变量在内存中所占的空间大小.
赋值就是将数据(值)存放到变量所指向的地址中, 后续就可以用这个变量来获取该数据

1
2
3
4
5
6
7
8
# 示例: 定义不同类型的变量
name = "Alice" # 字符串类型
age = 25 # 整数类型
height = 1.68 # 浮点类型
is_student = True # 布尔类型

print(f"{name} 的年龄是 {age},身高 {height} 米,是否是学生: {is_student}")

数组array/列表list/字典dict|map/集合set/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 定义一个列表
fruits = ["apple", "banana", "cherry"]

# 添加元素
fruits.append("orange") # 在末尾添加
fruits.insert(1, "grape") # 在索引1的位置插入

# 删除元素
fruits.remove("banana") # 按值删除
del fruits[0] # 按索引删除

# 修改元素
fruits[1] = "kiwi"

# 遍历列表
for fruit in fruits:
print(fruit)

# 定义一个字典
person = {
"name": "Alice",
"age": 25,
"is_student": True
}

# 添加/修改键值对
person["email"] = "alice@example.com"
person["age"] = 26

# 删除键值对
del person["is_student"]

# 遍历字典
for key, value in person.items():
print(f"{key}: {value}")

# 定义一个集合
unique_numbers = {1, 2, 3, 4, 5}

# 添加元素
unique_numbers.add(6)

# 删除元素
unique_numbers.remove(3) # 如果元素不存在会报错
unique_numbers.discard(10) # 如果元素不存在不会报错

# 集合运算
a = {1, 2, 3}
b = {3, 4, 5}
print(a.union(b)) # 并集: {1, 2, 3, 4, 5}
print(a.intersection(b)) # 交集: {3}
print(a.difference(b)) # 差集: {1, 2}

流程控制

流程控制就是定义我们程序的执行顺序

顺序

顺序执行就从上到下依次执行, 这个是我们程序的正常执行流程

选择

选择就是根据满足不同的条件来执行不同的代码
选择的流程分为单分支和多分支

单分支

单分支指的是只有一个分支节点, 只有一次条件判断

1
2
3
4
# 示例: 单分支 if 语句
score = 85
if score >= 60:
print("恭喜,考试通过!")

多分支

多分支则是有多个分支节点, 多个条件判断 (if-elif-else | switch-case)

1
2
3
4
5
6
7
8
9
10
# 示例: 多分支 if-elif-else 语句
score = 75
if score >= 90:
print("成绩为 A")
elif score >= 80:
print("成绩为 B")
elif score >= 70:
print("成绩为 C")
else:
print("成绩为 D")

循环

循环表示一个重复执行的过程

1
2
3
4
5
6
7
8
9
10
# 示例: for 循环遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)

# 示例: while 循环打印 1 到 5
i = 1
while i <= 5:
print(i)
i += 1

函数

函数的本质是一个闭包, 有自己的作用域
我们可以用函数定义一段代码, 接收0或多个输入, 执行函数体内的代码, 在结束时返回0或多个输出
使用函数可以提取公共逻辑, 简化我们的代码

1
2
3
4
5
6
# 示例: 定义一个函数并调用
def greet(name):
return f"你好, {name}!"

message = greet("Alice")
print(message)

类/结构体

类/结构体

类是一个包含了数据和方法(函数)的抽象结构, 我们可以定义它, 要使用类, 需要将类实例化, 其实就是在内存中开辟指定大小的空间来保存它
类的大小取决于内部定义什么数据(比如int), 编译器会自动根据数据大小来决定分配多少空间
一个类可以有多个实例化对象, 也就是有多个不同变量, 但是这些变量都和这个类的结构一致

1
2
3
4
5
6
7
8
9
10
11
12
# 示例: 定义一个类并创建实例
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def introduce(self):
print(f"我是 {self.name}, 我今年 {self.age} 岁。")

# 创建对象
p1 = Person("Alice", 25)
p1.introduce()

接口

接口(Interface)语法是一种定义行为规范的方式。它描述了某个类型应该具备哪些方法(函数),但不关心这些方法具体怎么实现。

接口是一种 抽象的契约(contract):

  • 它只定义方法名、参数和返回值。
  • 不包含任何具体实现(逻辑代码)。
  • 一个类型只要实现了接口中定义的所有方法,就被称为“实现了该接口”。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 示例: 使用 abc 模块模拟接口
from abc import ABC, abstractmethod

class Animal(ABC):
@abstractmethod
def speak(self):
pass

class Dog(Animal):
def speak(self):
return "汪汪!"

class Cat(Animal):
def speak(self):
return "喵喵!"

# 调用
dog = Dog()
cat = Cat()
print(dog.speak()) # 输出: 汪汪!
print(cat.speak()) # 输出: 喵喵!

框架

为了简化开发, 程序员会提取公共逻辑, 封装成函数, 或者封装成类和方法, 简化开发, 在这个不断简化的过程中就诞生了框架
不过以我的理解, 库(library)是提取公共方法和类的工具集合, 用户可以以自己的喜好添加很多不同的库来使用; 而框架(framework)
更像是定义了一套项目规范和模板,然后用户在框架的基础上遵守框架约定的标准或结构进行开发; 不过很多时候这个界限不是很清晰,
两个词经常混用

web

我们目前写的程序都是在本地运行的, 为了让世界各地的用户也能使用, 就需要开放到网络, 而web框架, 就是封装了语言本身提供的网络库,
然后提供了开放网络服务的各种方法

python语言常用的web框架为flask|fastapi|django, 我们这里用fastapi举例

1
pip install fastapi uvicorn -i https://pypi.tuna.tsinghua.edu.cn/simple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from fastapi import FastAPI

# 创建 FastAPI 实例
app = FastAPI()

# 定义根路由
@app.get("/")
def read_root():
return {"message": "欢迎来到 FastAPI 世界!"}

# 启动命令:uvicorn main:app --reload
import uvicorn

if __name__ == '__main__':
# main是文件名称, : app 是实例变量名
uvicorn.run(app='app:app', host="127.0.0.1", port=8080, reload=True)

访问localhost:8080查看
Swagger UI:http://127.0.0.1:8000/docs
ReDoc:http://127.0.0.1:8000/redoc

db

我们目前都是使用变量来存储数据, 但是变量的数据是放在内存中的, 一旦程序停止, 内存中的数据就会被回收, 下一次启动程序,
操作系统分配的也可能是另一个内存空间, 所以我们需要持久化存储我们的数据, 这就需要用到数据库系统

我们这里以sqlalchemy为例

1
pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)

# 创建引擎和表
engine = create_engine('sqlite:///example.db')
Base.metadata.create_all(engine)

# 插入数据
Session = sessionmaker(bind=engine)
session = Session()
session.add(User(name="Charlie", age=30))
session.commit()

# 查询数据
users = session.query(User).all()
for user in users:
print(user.name, user.age)

扩展

  • AI方向:
    • 数据分析|机器学习|深度学习|强化学习
    • numpy(运算)|pandas(数据加载和处理)|matplotlib(可视化)
    • scikit-learn(机器学习)|tensorflow|pytorch(深度学习)
    • 实现各种机器学习模型|深度学习神经网络
    • langchain|llama-index 大模型应用
  • 多线程/微服务/反射-动态代理/文件操作/网络编程/
  • 框架的原理/手写
  • wasm/grpc

社群

你可以在这些平台联系我:


本站总访问量