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

Python中退出For循环与枚举问题:电影列表程序故障求助

解决你的电影管理程序问题:无限循环与格式化输出优化

嘿,作为Python新手能推进训练营项目已经超棒啦!咱们一步步拆解你遇到的两个问题:

问题1:调用show_movies后程序无限重复

你的核心问题出在流程控制的递归调用和循环逻辑漏洞上:

  • 在add_movies函数末尾,你额外调用了menu()和add_movies(),这会让程序陷入无意义的递归循环,哪怕你选了列表功能,执行完也会强制回到添加电影的流程。
  • 主菜单循环里,执行完某个功能(比如show_movies)后,没有重新获取新的用户输入,会一直用之前的user_input值循环,导致流程卡死。

修复思路:

  • 移除add_movies里多余的menu()和add_movies()调用,让主菜单的循环来统一控制程序流转。
  • 把重复的菜单显示逻辑封装成独立函数,每次执行完操作后重新显示菜单并获取新输入。

问题2:用enumerate实现预期的格式化输出

你想要的带序号的电影详情格式,enumerate完全可以搞定!只需要在遍历电影列表时,用enumerate(movies, start=1)获取从1开始的序号,再按你想要的格式拼接输出即可。

修正后的完整代码

import sys
import random
import os

movies = []

def display_menu():
    print("Welcome to 'The Movie Program!!'")
    print("(A)dd movie to your list")
    print("(L)ist movies you've added")
    print("(S)earch for movies in your list")
    print("(Q)uit the program")  # 补上之前没显示的退出选项

def menu():
    global user_input
    display_menu()
    user_input = str(input("\nWhich function would you like to do?:\nSelection: ").capitalize())
    
    while user_input != 'Q':
        if user_input == 'A':
            add_movies()
        elif user_input == 'L':
            show_movies()
        elif user_input == 'S':
            search_movies()
        else:
            print("\n--Unknown command--Please try again.\n")
        
        # 每次操作后重新显示菜单、获取新输入
        display_menu()
        user_input = str(input("\nWhich function would you like to do?:\nSelection: ").capitalize())

def add_movies():
    while True:
        try:
            name = input('What is the title of the movie?: ').title()
            director = input("Who was the director of this movie?: ").title()
            year = int(input("What was the release year?: "))
            break
        except ValueError:
            print("Only numbers for year, please.")
    
    movies.append({
        "name": name,
        "director": director,
        "year": year
    })
    print(f"\n{name} added successfully!\n")

def show_movies():
    if not movies:
        print("\nNo movies in your list yet!\n")
        return
    
    print("\nYour Movie List:\n")
    # 使用enumerate生成从1开始的序号
    for idx, movie in enumerate(movies, start=1):
        print(f"{idx}. Name: {movie['name']}")
        print(f"   Director: {movie['director']}")
        print(f"   Year: {movie['year']}\n")

def search_movies():
    # 这里可以后续补充具体搜索逻辑,先保留你的基础实现
    print("\nThis is where you'd see a list of movies in your database\n")

# 启动程序
menu()

关键修改说明

  1. 解决无限循环:
    • 把重复的菜单显示代码封装成display_menu(),减少冗余。
    • 移除add_movies里的递归调用,让主menu()函数的循环全权控制流程。
    • 每次执行完功能后重新获取用户输入,确保流程能正常切换功能或退出。
  2. 实现预期格式化输出:
    • 用enumerate(movies, start=1)获取序号,按你想要的格式打印,给导演和年份加了缩进让排版更清晰。
    • 增加了空列表判断,避免空列表时输出混乱,友好提示用户添加电影。

现在运行程序,添加电影后选择(L)ist,就能得到你想要的输出格式啦!

内容的提问来源于stack exchange,提问作者EasyC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:42:47