前言
本文只是很基础的 python 最精华的语法入门,帮助前端同学使用 python 实现一些 ai 工具。有了这些基础,遇到不会的,问 ai 也能看懂 ai 给的答案,这是这篇文章的目的:结合 javascript,对比 python的基础用法,用最快的速度,上手 python,快速进入到实战,而不是纠结于基础语法!
最后我们会写一个用 python 调用 deepseek 大模型的微型 demo。
承接之前的前端学习 ai 系列文章:
首先需要安装 python,大家可以直接问 ai。 因为我的 macOS 自带了 python,我就没有单独安装了(建议使用版本管理工具,例如 python 管理多版本)。
ai agent 中, python 毕竟是最主流的语言,大家可以熟悉一下基本语法,实在太简单了, 大概花费时间如下:
- 基本语法:5分钟
- 控制结果:2分钟
- 数据结构:5分钟
- 案例:3分钟
基本语法
变量的定义和命令规则
因为实在太简单了,大家看注释就知道意思
python
# 变量的定义
name = "Alice"
age = 25
height = 1.68
is_student = True
# 打印变量值
print(name)
print(age)
print(height)
print(is_student)
name = "张三"
print(name)
# 变量命名规则
# 简单理解跟 javascript 的差不多就行了
# 1. 变量名只能包含字母、数字、下划线
# 2. 变量名不能以数字开头
# 3. 变量名不能是 python 关键字
数据类型
python
# 数字类型
num1 = 10 # 整数(int)
num2 = 3.14 # 浮点数 (float)
# 字符串类型 (str)
name = "Alice"
message = 'Hello, world!'
# 布尔类型 (bool)
is_student = True
is_working = Fasle
这里注意:
- python 中的浮点数跟 javascript 的一致,都是双精度浮点数,占用 8字节,也就是 64 的内存。但同样的问题也有,就是都不精确,也就是会出现 0.1 + 0.2 不等于 0.3 的问题
- 然后字符串单引号很双引号是一样的效果,跟 javascript 一致
- 布尔类型不一样的是 python 中首字母大写。
如何获取数据类型, 使用 type,跟 javascript typeof 操作符类似。
python
num1 = 10 # 整数(int)
print(type(num1))
类型转换
跟javascript 中,使用 Number(xx) 转数字,使用 String() 转字符串类似。
python
# 将字符串转换为整数
num_str = "123"
num_int = int(num_str)
print(num_int)
# 将整数转为字符串
num_int = 456
num_str = str(num_int)
print(num_str)
# 将浮点数转换为整数(会丢失小数部分)
num_float = 3.14
num_int = int(num_float)
print(num_int)
算数运算符
python
# 加法
result = 10 + 5
print(result)
# 减法
result = 10 - 5
print(result)
# 乘法
result = 10 * 5
print(result)
# 除法
result = 10 / 5
print(result)
# 取整除
result = 10 // 3
print(result)
# 取余
result = 10 % 3
print(result)
# 幂计算
result = 2 ** 3
print(result)
跟 javascript 在取整除语法上有区别
- python 是 10 // 3
- 在 javascript 对应的是 Math.trunc(10 / 3)
比较运算符
这个没什么好说的,跟 javascript 基本一样,例如
- 10 == 5, 10 != 5, 10 > 5, 10 >= 5 等等
- 注意 python 没有 === 和 !==
逻辑运算符
这个区别有点大,我们细细来讲:
逻辑与 (AND)
python 用 and
python
# Python
x = 5
y = 10
if x > 0 and y < 20:
print("两个条件都满足") # 会执行
javascript
javascript
// JavaScript
let x = 5;
let y = 10;
if (x > 0 && y < 20) {
console.log("两个条件都满足"); // 会执行
}
逻辑或 (OR)
python 用 or
python
# Python
name = ""
default_name = "Guest"
display_name = name or default_name
print(display_name) # 输出: Guest
javascript
javascript
// JavaScript
let name = "";
let defaultName = "Guest";
let displayName = name || defaultName;
console.log(displayName); // 输出: Guest
逻辑非 (NOT)
python 用 not,也就是没有 javascript 的 ! 操作符。
Python
# Python
is_logged_in = False
if not is_logged_in:
print("请先登录") # 会执行
javascript
JavaScript
// JavaScript
let isLoggedIn = false;
if (!isLoggedIn) {
console.log("请先登录"); // 会执行
}
真假值判断差异
Python 的假值:
FalseNone0(整数)0.0(浮点数)""(空字符串)[](空列表)()(空元组){}(空字典)set()(空集合)
JavaScript 的假值:
false0(数字)""(空字符串)nullundefinedNaN0n(BigInt)
赋值运算符
跟 javascript 一样,但注意没有 ++, -- 这种运算符。
python
# 简单赋值
x = 10
# 加法赋值
x += 5
# 减法赋值
x -= 3
# 乘法赋值
x *= 2
# 除法赋值
x /= 4
输入输出
input 函数获取用户输入
python
name = input("请输入你的名字")
print("你好," + name + "!")
print() 函数打印内容
python
print("hello word!")
格式化输出,在 python 3.6 版本支持,跟前端的 `` 类似符号类似,python 使用的是 f。
- javascript 使用的是 ${} 嵌入变量, python 是 {} 嵌入变量
python
name = "Charlie"
age = 35
height = 1.75
# 直接嵌入变量
print(f"Hello, {name}!")
# 输出:Hello, Charlie!
if else 语句
跟 javascript 有区别,但也很简单,请看示例
python
score = 75
if score >= 90:
print("优秀")
elif score >= 70:
print("良好")
elif score >= 60:
print("及格")
else:
print("需努力");
条件是一个会产生布尔值(True或False)的表达式。- 冒号
:是必须的,表示一个代码块的开始。 - 缩进 (通常是 4 个空格)是 Python 标识代码块的方式,绝对不能省略或混用。
嵌套条件语句
python
age = 20
has_license = True
if age >= 18:
if has_license:
print("可以开车")
else:
print("不能开车")
else:
print("不能开车");
循环语句
跟 javascript 区别还挺大,没有 javascript 的中括号。
for 循环语法:
python
for 变量 in 可迭代对象:
# 执行的代码块
常用场景与示例:
遍历数组:
python
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
`print(fruit)
遍历字符串:
python
for char in "Hello":
print(char)
遍历 range 。range(n) 生成一个从 0 到 n-1 的整数序列。
python
for i in range(5):
print(i) // 输出:0 1 2 3 4
遍历字典(理解为javascript 的 {} 对象)
python
person = {"name": "Alice", "age": 25}
for key in person:
print(key, person[key])
while 循环语法
bash
while 条件:
# 执行的代码块
基本案例:
python
count = 0
while count < 5:
print(count)
count += 1
循环控制语句
跟 javascript 一样。
python
# break 语句
for i in range(10):
if i == 5:
break
print(i) // 0 1 2 3 4
python
# break 语句
for i in range(10):
if i % 2 == 0:
continue
print(i) // 1 3 5 7 9
数据结构
Python 常见的数据结构有四种:
- 列表 List: python语法:[1, 2, 'a']
- 相当于 javascript 的数组: [1, 2, 'a']
增加元素:
- 通过
append函方法,实现在尾部增加新元素。- javascript 是通过
push方法。
- javascript 是通过
python
l = [1,2,3,4]
l.append(5)
print(l)
删除元素:
- 通过
del关键字可以删除列表某个位置的元素- javascript 是通过 splice 方法
python
l = [1,2,3,4]
## 删除首个
del l[0]
## 删除最后一个(也就是倒数第一的意思)
del l[-1]
print(l)
最后一个元素在 python 可以用 -1 表示。
查找元素:
python
l = [1,2,3,4]
## 查找首个
print(l[0])
## 查找最后一个
print(l[-1])
## 查找下标是 1 到 下标 2 的元素(不包括 3 所以到 2)
print(l[1:3]) # [2, 3]
修改元素
python
l = [1,2,3,4]
l[0] = -1
print(l)
接下来看第二个数据类型:元祖
- 元祖 Tuple: (1, 2, 'a')
- 可以理解为就是列表,但是不能改。
- javascript没有对应的,JS 中通常用数组代替,通过
Object.freeze()模拟
python
t = (1,2,3)
t[0] = 1 # 报错,不能改
但可以循环遍历元祖。
接下来看第三个数据类型:字典
- 字典 Dict:{'a': 1, 'b': 2}
- 相当于 javascript 的 Object {a: 1, b: 2}
- Python 键可以是任意不可变类型;JS 键会自动转为字符串。
- Python 用
dict['a'];JS 可用.或[]
python
# key, 键,比如 First 和 Second 就是键
# value,值,比如 1 和 2 就是值
ab = {
"First": 1,
"Second": 2
}
print(ab)
字典支持以下操作:
- 增:通过
[]可以向字典内增加元素
python
# key, 键,比如 First 和 Second 就是键
# value,值,比如 1 和 2 就是值
ab = {
"First": 1,
"Second": 2
}
ab["Third"] = 3
print(ab)
- 删:通过
del可以向字典内删除元素
python
# key, 键,比如 First 和 Second 就是键
# value,值,比如 1 和 2 就是值
ab = {
"First": 1,
"Second": 2
}
del ab["Second"]
print(ab)
- 查:通过
[]可以向字典内查询元素
python
# key, 键,比如 First 和 Second 就是键
# value,值,比如 1 和 2 就是值
ab = {
"First": 1,
"Second": 2
}
print(ab["Second"])
还可以通过 in 关键字查找某个键是否在字典中
python
# key, 键,比如 First 和 Second 就是键
# value,值,比如 1 和 2 就是值
ab = {
"First": 1,
"Second": 2
}
print("Second" in ab) // True
- 改:通过赋值符号
=可以修改某个位置元素
python
# key, 键,比如 First 和 Second 就是键
# value,值,比如 1 和 2 就是值
ab = {
"First": 1,
"Second": 2
}
ab["First"] = 3
print(ab) // True
- 集合:Set:{1, 2, 3}
- 相当于 javascript 中的 Set, new Set([1, 2, 3]),也就是不存在重复的元素
注意集合是没有顺序,所以不能像列表那样通过下标查找
增加元素:
python
s = {1,2,3}
# 增加新的元素到集合中
s.add(6)
print(s)
删除元素:
python
s = {1,2,3}
# 增加新的元素到集合中
s.remove(3)
print(s)
查找是否元素在集合中:
python
s = {1,2,3}
# 增加新的元素到集合中
print(3 in s) # True
我们还可以求集合的交集,并集,差集
python
s1 = {1,2,3}
s2 = {2,3,4}
print(s1 & s2) # 交集 {2,3}
python
s1 = {1,2,3}
s2 = {2,3,4}
print(s1 | s2) # 并集 {1,2,3,4}
python
s1 = {1,2,3}
s2 = {2,3,4}
print(s1 ^ s2) # 差集 {1,4}
函数
使用 def 关键字定义,javascript 是使用 function 关键字。
示例:
python
def greet(name):
return f"Hello, {name}"
print(greet('ZhangSan')) # Hello, ZhangSan
注意 python 能返回多个值,我们举例
python
def add_and_subtract(x, y):
return x+y, x-y
sum,diff = add_and_subtract(10, 5)
print(sum, diff) # 15 5
同样 python 有作用域的概念,在函数里的属于局部变量。
匿名函数:Lambda 函数
有点像 javascript 中的箭头函数,是一种语法糖,能够快速定义函数
python
add = lambda x, y: x + y # 定义一个传参是 x,y 结果是和的函数
print(add(1,1)) # 2
上面的 lambda 函数相当于
python
def add(a, b):
return a+b
print(add(1,1)) # 2
函数作为参数传递
python 也支持将函数作为参数传给一个函数
python
def apply_function(func, value):
return func(value)
print(apply_function(lambda x: x * x, 5)) # 25
Python 模块介绍
- 模块是包含代码的文件,以单独命名空间组织逻辑,便于复用与维护
- 一个 .py 文件就是一个模块,模块名为文件名(不含扩展名)
- 导入后通过模块命名空间访问其函数、类、变量,避免命名冲突
例如,我们创建一个模块:
python
# utils.py
def add(a, b):
return a + b
PI = 3.14159
使用
python
import utils
print(utils.add(1, 2))
print(plus(1, 2))
我们还可以使用模块别名,跟 javascript 类似, 也是 as 关键字
python
import utils as util # utils 别名改为 util
print(util.add(1, 2))
还有一种 from ... import 可以导入模块语法如下
python
# 导入整个模块(不建议这么做)
from module_name import *
# 导入特定函数/类/变量
from module_name import function_name, ClassName, variable_name
# 导入并重命名
from module_name import original_name as alias_name
示例:
python
import math
# 使用时需要前缀
result = math.sqrt(25)
print(math.pi)
print(math.sin(math.radians(90)))
python
# 导入多个特定项目
from math import sqrt, pi, sin, cos
print(sqrt(9)) # 3.0
print(pi) # 3.141592653589793
print(sin(pi/2)) # 1.0
python 内置模块
-
os 模块:文件和目录操作
- 类似于 node.js 的 fs 模块
-
random 模块:生成随机数
- javascript 原生只有 Math,random 方法
例如:
python
import os
print(os.getcwd()) # 获取当前命令执行的目录
python
import random
print(random.randint(1,10)) # 获取包括1到10中的一个随机整数
python 面相对象编程
类与对象
废话不多说,直接上一个 javascript 的类和 python 相同的类,你就明白了
python
python
# Python 类定义
class Person:
# 构造函数
# self 相当于 javascript 中的 this
def __init__(self, name, age):
self.name = name
self.age = age
self._private_var = "internal" # 约定为私有(实际仍可访问)
# 实例方法
def greet(self):
return f"Hello, I'm {self.name}"
# 类方法
@classmethod
def from_birth_year(cls, name, birth_year):
import datetime
age = datetime.datetime.now().year - birth_year
return cls(name, age)
# 静态方法
@staticmethod
def is_adult(age):
return age >= 18
# 属性装饰器
@property
def adult(self):
return self.age >= 18
@adult.setter
def adult(self, value):
print("Cannot directly set adult status")
javascript
javascript
// JavaScript 类定义
class Person {
class_attr = "类属性" # 类属性
// 构造函数
constructor(name, age) {
this.name = name;
this.age = age;
this._privateVar = "internal"; // 约定为私有
}
// 实例方法
greet() {
return `Hello, I'm ${this.name}`;
}
// 静态方法
static fromBirthYear(name, birthYear) {
const age = new Date().getFullYear() - birthYear;
return new Person(name, age);
}
// Getter
get adult() {
return this.age >= 18;
}
// Setter
set adult(value) {
console.log("Cannot directly set adult status");
}
}
如何实例化呢,python 不用 new,就像函数一样调用
python
person1 = Person("张三", 30)
person1.greet()
这里需要注意:
- person1._privateVar 是得不到值 "internal"的,这是 python 内部的一种名称修饰机制,下划线属性或者函数,实例是不能直接访问到的,只能通过 实例名._类名._属性名访问,也就是
person1._Person._privateVar访问到 - @classmethod 在 python 中用来定义类方法,这里不能访问
self。 也就是 javascript 中的this - @staticmethod 在 python 中用来静态方法,不能访问实例(self)或者类,跟javascript 一致。
- 通过@property 装饰器定义 get 方法,通过
@属性名.setter定义 setter 方法。这个跟javascript 区别还是挺大的。
接下来看下面相对象的 3 个特征,在 python 中如何实现的
第一个是封装:
封装是将数据和操作数据的方法绑定在一起,隐藏内部实现细节,只暴露必要的接口。
对于 python 我们知道如何定义私有属性,共有属性即可
实现一个简单的示例
python
class BankAccount:
def __init__(self, balance):
self._balance = balance # _balance 是私有属性
def deposit(self, amount):
self._balance += amount
def withdraw(self, amount):
if self._balance >= amount:
selef._balance -= amount
else:
print("not enough")
def get_balance(self):
return self._balance
account = BankAccount(100)
account.deposit(50)
print(account.get_balance()) // 150
接着看继承特性
感觉很有 javascript 的既视感。。。。,也是调用父类的构造函数,完成子类的属性和方法的继承。
python
# 父类(基类)
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(f"{self.name} 正在吃东西")
def sleep(self):
print(f"{self.name} 正在睡觉")
def make_sound(self):
print(f"{self.name} 发出声音")
# 子类(派生类)
class Dog(Animal): # 继承Animal类
def __init__(self, name, breed):
super().__init__(name) # 调用父类的构造函数
self.breed = breed # 子类特有的属性
# 重写父类方法(多态)
def make_sound(self):
print(f"{self.name} 汪汪叫!")
# 子类特有的方法
def fetch(self):
print(f"{self.name} 正在接飞盘")
# 使用
dog = Dog("旺财", "金毛")
dog.eat() # 继承自父类
dog.sleep() # 继承自父类
dog.make_sound() # 重写的方法
dog.fetch() # 子类特有的方法
print(f"品种: {dog.breed}")
最后就是多态了,多态允许不同类的对象调用相同的方法时,表现不同的行为。python 通过方法重写来实现多态。
其实这个不用太关心,跟 javascript 类似, 也是通过方法重写来实现多态。实际上多态一般是在有类型的语言里比较适合,比如 typescript 可以实现对传参类型的不同(重载),声明不同的函数类型来实现多态。
python
class Animal:
def make_sound(self):
pass # 抽象方法,由子类实现
class Dog(Animal):
def make_sound(self):
return "汪汪汪!"
class Cat(Animal):
def make_sound(self):
return "喵喵喵!"
class Bird(Animal):
def make_sound(self):
return "啾啾啾!"
# 多态:同一接口,不同行为
def animal_sound(animal):
"""这个函数不知道具体的动物类型,只知道它会叫"""
return animal.make_sound()
# 创建不同的动物对象
animals = [Dog(), Cat(), Bird()]
# 统一调用相同的方法
for animal in animals:
print(animal_sound(animal))
# 输出:
# 汪汪汪!
# 喵喵喵!
# 啾啾啾!
调用 deepSeek 案例
1. 安装必要的库
在命令行/终端中输入:
bash
bash
pip install openai
2.申请 apikey
注意,要充值。。。可以自己充值 10 元,对于我们学来说,可以用很久很久了,当然你也可以充值 openai(chatgpt),用法是一模一样的,都兼容 openai 的 api,

创建好后,复制这个 key, 后面要用

3. 最简单的代码(复制粘贴就能用)
python
# 文件名:simple_deepseek.py
from openai import OpenAI
# 1. 替换成你的DeepSeek API密钥
# 获取地址:https://platform.deepseek.com/api_keys
api_key = "sk-你的API密钥在这里"
# 2. 连接到DeepSeek
client = OpenAI(
api_key=api_key,
base_url="https://api.deepseek.com"
)
# 3. 问一个问题
response = client.chat.completions.create(
model="deepseek-chat", # 使用免费模型
messages=[
{"role": "user", "content": "你好,用一句话介绍你自己"}
]
)
# 4. 打印回答
print("AI回答:", response.choices[0].message.content)
4.运行脚本
bash
python3 simple_deepseek.py
以下是我调用的结果:

最后如果你也学习跟前端相关的 ai 知识,还有学习 headless 组件库教程,node.js全栈(next.js, nest.js)欢迎加入我们交流群。