Python总是打印else语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python总是打印else语句相关的知识,希望对你有一定的参考价值。

我有这样的代码:

from tabulate import tabulate

def search_movie_title():
    movies = open('movies.txt','r').readlines()
    title = input("Input movie title: ").lower()
    for i in movies:
        movie = i.strip("
").split("|")
        if title == movie[0].lower():
            table = [['Name:',movie[0]],['Genre:',movie[1]],['Running:',movie[2]],['Director:',movie[3]],['Starring:', movie[4]],['Country:', movie[5]], ['Realised:', movie[6]]]
            print (tabulate(table))
        else:
            print("Nothing found! Try again.")
            search_movie_title()

像这样的文本文件:

A fistful of Dolars|Western|100|Sergio Leone|Clint Eastwood|Italia|1964
For a few dolars more|Western|130|Sergio Leone|Clint Eastwood|Italia|1965
The Good, the Bad and the Ugly|Western|179|Sergio Leone|Clint Eastwood|Italia|1966
March on the Drina|War movie|107|Zika Mitrovic|LJuba Tadic|Serbia|1964

如果我使用只使用if语句它工作“很好”,但如果我输入不存在的电影,那么程序只是停止运行,显而易见。

如果我使用ifelse它将始终打印else语句(文本文件中的第一行除外)

问题是:如何仅打印finded和电影以及如果找不到电影如何打印消息?

答案

你可以使用python for-else

from tabulate import tabulate

def search_movie_title():
    movies = open('movies.txt','r').readlines()
    title = input("Input movie title: ").lower()
    for i in movies:
        movie = i.strip("
").split("|")
        if title == movie[0].lower():
            table = [['Name:',movie[0]],['Genre:',movie[1]],['Running:',movie[2]],['Director:',movie[3]],['Starring:', movie[4]],['Country:', movie[5]], ['Realised:', movie[6]]]
            print (tabulate(table))
            break
    else:
        print("Nothing found! Try again.")

    # optionally add code here to be run regardless

else只有在for循环未被破坏时才会被执行。这样,无论是否找到电影,您都可以在之后添加运行的代码(而不是立即返回)

另一答案

使用next

movie = next((movie for movie in movies
              if movie.split('|')[0] == title),
             None)

if movie:
    movie = movie.strip().split('|')
    fields = ['Name:', 'Genre:', 'Running:', 'Director:', 'Starring:', 'Country:', 'Realised:']
    table = list(zip(fields, movie))
    print (tabulate(table))
else:
    print("Nothing found! Try again.")
另一答案

您必须确保迭代所有电影(for i in movies),直到您可以决定是否找到电影。所以:迭代所有电影,打印电影并从函数返回,如果你找到它。如果您在迭代完所有电影后仍未找到该电影,请让用户再试一次。

from tabulate import tabulate

def search_movie_title():
    movies = open('movies.txt','r').readlines()
    title = input("Input movie title: ").lower()
    for i in movies:
        movie = i.strip("
").split("|")
        if title == movie[0].lower():
            table = [['Name:',movie[0]],['Genre:',movie[1]],['Running:',movie[2]],['Director:',movie[3]],['Starring:', movie[4]],['Country:', movie[5]], ['Realised:', movie[6]]]
            print (tabulate(table))
            return

    print("Nothing found! Try again.")
    search_movie_title()

我建议只打印“Nothing found”,然后返回而不是递归调用函数。

另一答案

每次点击“其他”时,都会通过调用search_movie_title()重新启动搜索。除非你的搜索匹配movies的第一个条目,否则你将处于else子句的无限循环中。

如果for循环完成而没有找到匹配项,则删除else并执行该块。

以上是关于Python总是打印else语句的主要内容,如果未能解决你的问题,请参考以下文章

python python中的漂亮(或漂亮打印)JSON对象具有这一功能。在尝试了解什么时,我总是使用这个片段

Python 中的线性搜索 - 总是使用 else 语句

python常用代码

20个简洁的 JS 代码片段

在嵌套使用if语句时,C语言规定else总是和之前与其最近的if配对?

Python的条件判断语句------if/else语句