You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将包含while循环的重复Python代码重构为函数?

我来帮你搞定这个重构问题!看起来你是在处理类似Spotify这类音乐API的播放列表分页数据,重复代码确实头疼,尤其是还要处理while循环的分页逻辑对吧?

重构后的函数实现

咱们可以把重复的文件操作、API请求和分页逻辑全部封装成一个可复用的函数,这样以后调用起来超方便:

import requests

def fetch_and_save_playlist_tracks(user, playlist_id, headers, config, start_file_count=0):
    """
    获取播放列表的所有曲目,分页保存到递增命名的JSON文件中
    参数说明:
        user: 目标用户的ID
        playlist_id: 要获取的播放列表ID
        headers: 请求头(要包含认证信息,比如Bearer Token)
        config: 包含global_url的配置对象
        start_file_count: 起始文件编号,默认从0开始
    """
    current_file_count = start_file_count
    # 初始化第一页的请求URL
    next_request_url = f"{config.global_url}/users/{user}/playlists/{playlist_id}/tracks"

    # 分页循环:只要还有下一页就继续请求
    while next_request_url:
        # 构造当前页的文件名,用with语句自动管理文件关闭,避免资源泄漏
        current_file_name = f"{current_file_count}_tracks.json"
        with open(current_file_name, "w+") as track_file:
            # 发送GET请求获取曲目数据
            track_response = requests.request("GET", next_request_url, headers=headers)
            # 把响应内容写入JSON文件
            track_file.write(track_response.text)
            print(f"成功保存页面数据到: {current_file_name}")
        
        # 解析响应,获取下一页的URL(大部分音乐API都会返回next字段标记下一页)
        response_json = track_response.json()
        next_request_url = response_json.get("next")
        # 文件编号递增,准备保存下一页
        current_file_count += 1
调用示例

用的时候只需要传入必要的参数就行,不用再写重复的代码:

# 直接调用函数,默认从0开始命名文件
fetch_and_save_playlist_tracks(user, playlist_id, headers, config)

# 如果想从编号10开始保存,就传入start_file_count参数
# fetch_and_save_playlist_tracks(user, playlist_id, headers, config, start_file_count=10)
额外优化建议
  • 如果你的API是用offset和limit来分页(而不是返回next URL),可以调整循环逻辑:
    def fetch_and_save_playlist_tracks(user, playlist_id, headers, config, start_file_count=0, limit=50):
        current_file_count = start_file_count
        offset = 0
        while True:
            request_url = f"{config.global_url}/users/{user}/playlists/{playlist_id}/tracks?limit={limit}&offset={offset}"
            track_response = requests.request("GET", request_url, headers=headers)
            response_json = track_response.json()
            items = response_json.get("items", [])
            
            with open(f"{current_file_count}_tracks.json", "w+") as track_file:
                track_file.write(track_response.text)
            
            # 如果返回的条目数小于limit,说明已经是最后一页了
            if len(items) < limit:
                break
            offset += limit
            current_file_count += 1
    
  • 可以加上异常处理,比如请求失败时捕获requests.exceptions.RequestException,避免程序直接崩溃。

内容的提问来源于stack exchange,提问作者Daniel O.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:23:34