之前写Python截取列表数据,我一直用最笨的循环写法,写完总觉得代码冗余又啰嗦,但又懒得深究有没有更简便的方式。直到最近做实操练习,彻底摸透了Python列表和切片的核心用法,还手写了字符串去空格工具函数,最后顺带实操了兼容OpenAI协议的DeepSeek大模型接口,打通了基础语法到大模型调用的完整链路。
👇
完整文章地址:https://juejin.cn/post/7644513055293980706

今天不整教科书式的干货,就聊聊我一步步试错、搞懂这些知识点的全过程,都是实打实的实操体验。

先曝光我之前的“笨代码”

需求很简单:取出列表的前三个元素。我最开始的第一反应,就是写for循环遍历取值,现在回看真的太繁琐了。

# 我之前的蠢写法,老老实实循环取值
L = ["张三", "李四", "王五", "小红"]
r = []
n = 3
for i in range(n):
    r.append(L[i])

print(r)

这段代码能跑通,结果也没问题,但说实话,完全不符合Python简洁的风格。明明一行代码能搞定的事,我硬生生写了五六行,这也是我下定决心学切片的契机。

搞懂Python List:它和JS数组真的不一样

在学切片之前,我重新捋了下Python列表的核心特性,终于明白为什么Python做数据分析、机器学习这么吃香。

Python里基本不用Java/C++那种固定长度、固定类型的数组,list就是Python的万能容器。它和JS的数组很像,不用提前指定容量,也不约束元素类型,随便增删改查,灵活性拉满。

这里顺便聊个我的小感悟:很多人说JS借鉴了Python的特性,这点我深表认同。但两者的定位差距特别大:

JS的核心优势是页面交互、前端展示,它的Number类型没有精细的浮点数、高精度支持,根本不适合做复杂数值计算;而Python的list灵活度更高,搭配各类语法糖,天生适配数据分析、爬虫、AI建模这类场景。

切片语法:Python最香的语法糖,没有之一

切片(Slice)就是专门用来解决「截取容器部分元素」的需求,直接把我之前的循环代码碾压得体无完肤。不用循环、不用判断,一行代码搞定所有截取场景。

我把自己实操测试的常用场景都整理好了,覆盖日常90%的使用需求:

L = ["张三", "李四", "王五", "小红"]
# 基础切片:左闭右开
print(L[0:3]) 
# 起始索引为0可省略,最简写法
print(L[:3])  
# 截取索引1-2的元素
print(L[1:3]) 
# 倒数两个元素
print(L[-2:]) 

# 超长列表切片测试
L2 = list(range(100))
print(L2[:10])    # 前10个元素
print(L2[-10:])   # 后10个元素
print(L2[:10:2])  # 前10个元素,步长2
print(L2[::5])    # 全列表,每5个取一个

# 字符串也支持切片!这点超级好用
print('ABCDEFG'[:3])
print('ABCDEFG'[::2])

说实话,切片的规则我记了很久才吃透: [起始索引:结束索引:步长],左闭右开,默认从0开始、默认步长1。不用手动循环,不用处理边界,Python底层直接封装好了,这也是它简洁的核心原因。

手写trim函数:用切片吃透双指针逻辑

学会切片之后,我不想只停留在简单取值,于是挑战了一个经典实操:手写字符串去首尾空格的trim函数。

Python自带的strip()方法可以直接去空格,但只会用内置方法太没长进了。我试着用「双指针+切片」手动实现,过程踩了个大坑。

先看极简的内置方法(日常开发够用)

def trim(s):
    return s.strip()

print(trim("   hello world "))

手写双指针版本(吃透底层逻辑)

我的思路很简单:左指针从头部找非空格位置,右指针从尾部找非空格位置,最后用切片截取中间有效内容

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里重点说我的踩坑点!我最开始写的时候,右指针直接用s[right],疯狂报索引越界错误。后来才反应过来,right初始值是字符串长度,数组索引最大是长度-1,所以必须取s[right-1]

# 手写去首尾空格 核心:双指针+切片
def trim(s):
    left = 0
    # 左指针往右移,跳过开头空格
    while left < len(s) and s[left] == ' ':
        left += 1
    
    right = len(s)
    # 右指针往左移,跳过结尾空格
    while right > left and s[right-1] == ' ': # 坑点!必须right-1
        right -= 1
    
    # 切片截取有效字符串
    return s[left:right]

print( trim("   hello world ") )

写完瞬间通透了,切片不只是简单取值,搭配双指针可以实现很多字符串、数组的基础算法,性价比拉满。

进阶实操:调用DeepSeek大模型(兼容OpenAI接口)

搞定基础语法后,我顺势实操了大模型接口调用,也是近期学到的实用知识点。

这里说个行业小常识:现在很多主流大模型(DeepSeek、Gemini、Claude)都兼容OpenAI接口协议,不用改大量代码,替换接口地址和模型名就能直接用,适配性极强。

我这次用的是DeepSeek模型,基于Transformer架构,和OpenAI底层逻辑一致,非常适合新手练手LLM接口调用。同时也实操了精准Prompt工程,通过约束步骤、格式,让大模型输出标准化内容。

# 导入OpenAI兼容客户端
from openai import OpenAI

# 实例化客户端,对接DeepSeek接口
client = OpenAI(
    api_key="sk-665d3142ca9d480c9c6823c67f0cbe00",
    base_url="https://api.deepseek.com/v1"
)

COMPLETION_MODEL = "deepseek-chat"

# 精细化Prompt:分步骤+约束格式,精准控制输出
prompt = """
Consideration product: 工厂现货PVC充气青蛙夜市地摊热卖充气玩具放光蛙儿童水上玩具
1. Compose human readable product title used on Amazon in english within 20 words.
2. Write 5 selling points for the products in Amazon
3. Evaluate a price range for this product in U.S.

Output the result in json format with three properties called title, selling_point and price_range
"""

# 封装请求函数
def get_response(prompt):
    response = client.chat.completions.create(
        model = COMPLETION_MODEL,
        messages= [
            { "role":"user", "content": prompt }
        ]
    ) 
    return response.choices[0].message.content

# 调用输出结果
print(get_response(prompt))

聊聊Prompt的核心逻辑,新手必看

这次实战我最大的收获,除了代码写法,还有Prompt工程的基础思维。

以前我写Prompt都是随便写,模型输出的内容乱七八糟。这次刻意规范了写法,效果肉眼可见的变好:

目标清晰化:明确告知模型需要完成3项具体任务

1. Compose human readable product title used on Amazon in english within 20 words.
2. Write 5 selling points for the products in Amazon
3. Evaluate a price range for this product in U.S.

步骤拆分:把复杂的商品文案、定价任务拆分成独立小点

2. Write 5 selling points for the products in Amazon
3. Evaluate a price range for this product in U.S.

格式约束:强制输出JSON格式,固定字段名,方便后续代码解析调用

Output the result in json format with three properties called title, selling_point and price_range

说白了,LLM不会猜你的心思,你描述的越具体、约束越严格,输出结果越贴合需求。标准化的输出格式,也是后续对接自动化业务的关键。

本次学习我踩的3个致命小坑

整理一下我实操时反复报错的问题,大家可以直接避坑:

  1. 重复定义同名函数:代码里两次写了get_response函数,后定义的会覆盖前者,调试半天发现代码没生效,纯属粗心问题。

  2. 切片索引越界:手写trim函数时,右指针未-1,直接读取超出字符串长度的索引,导致程序报错崩溃。

  3. LLM代码语法疏漏:最开始写模型调用代码时,参数末尾漏了逗号,Python对语法格式极其严格,直接解析失败。

最后复盘3个核心收获

学完这一整套内容,没有空洞的大道理,只有最实在的感悟:

第一,能用切片绝不写循环。切片是Python的核心优雅写法,简化代码、减少bug,是区分新手和熟练者的小细节。

第二,不要依赖内置方法躺平。会用strip()不算本事,手写实现底层逻辑,才能真正吃透双指针和切片的核心原理。

第三,大模型调用核心是协议兼容+精准Prompt。主流模型基本都兼容OpenAI协议,换模型成本极低,而高质量Prompt才能输出可用的标准化结果。

当然这些工具也不是万能的:复杂的多层级数据截取,切片会略显混乱;过于简单的Prompt,再强大的模型也输出不了精准结果,实操中还是要按需选择。

如果你也刚学Python基础、刚开始接触大模型接口开发,或者也踩过这些低级坑,欢迎评论区聊聊你的学习经历,咱们互相交流一起进步~

更多推荐