在用户输入的函数和词典中使用用户输入

时间:2017-10-04 19:51:23

标签: python python-3.x dictionary

def make_movie(movie_name = input("What is your favorite movie? "),studio = input("What studio is it under? "), running_time = + input("Do you know the running time? If not just type in 'no'")):
    if running_time == 'no':
        movie = {'movie name': movie_name, 'studio': studio, 'running time': running_time}
        print(movie)
    else:
        movie = {'movie name': movie_name, 'studio': studio}
        print(movie)
    return movie
make_movie()

我的老师给了我们这个问题:

  
      
  1. 电影:编写一个名为make_movie()的函数,用于构建描述电影的字典。该函数应该包含电影名称和制作电影的工作室,它应该返回包含这两条信息的字典。使用此功能可以制作三个代表不同电影的词典。打印每个返回值以显示字典正确存储电影信息。
  2.         

    一个。添加一个可选参数到make_movie(),允许您存储   该       电影的运行时间。如果主叫行包含一个值       电影的运行时间,将该值添加到电影的字典中。做到       至少一个新的函数调用,包括电影的运行时间。

我坚持使用可选参数。如果人们不知道电影的运行时间,那么我根本不希望字典显示它。我做了这个函数,以便函数要求每个变量的用户输入,但是当它要求运行时,即使我输入了“没有”#39;它仍将在字典中显示运行时。

所以我的问题是,我的代码是否有任何变化可以让它起作用?

4 个答案:

答案 0 :(得分:1)

Oof,最大的问题是一个更常见的"陷阱"在Python中。作为函数头的一部分编写的代码(包括可选参数的默认值)仅调用一次,并且在函数定义时运行,而不是在运行时运行。当你在那里创建一个可变对象并在函数内部改变它时,这通常是一个问题,但是这里也会产生问题。想象:

Enter a thing: foobar
We're going to ask you to enter a thing now,
foobar

您希望从控制台看到:

input("Enter a thing: ")

但你实际得到的是:

echo

这是因为当您 定义 def echo(a=None): if a is None: a = input("Enter a thing: ") return a 时会调用incoming_dict['running time']行,而不是在您实际调用它时。正确实现这一目标的标准变化是:

def make_movie(name, studio, runningtime=0):
    return {'name': name, 'studio': studio, 'runningtime':runningtime}

def main():
    name = input("Movie name: ")
    studio = input("Studio: ")
    rtime = input("Running time: ")
    if not rtime:
        rtime = 0
    movie = make_movie(name, studio, rtime)

除此之外,我强烈建议你不要,正如你提到的那样,尝试从结果字典中删除电影的运行时间。像这样的函数的结果应该是标准的,如果我编写的代码需要其中一个电影词典,我就不必担心写[ {_id: 123, name:'first', category:'Vape', property:[ {key:'brand', values:'Eleaf'}, {key:'mechmode', values:'some'}, {key:'color', values:['red', 'blue']}, {key:'batrtype', values:'some2'}, ]}, {_id: 1234, name:'second', category:'Vape1', property:[ {key:'brand', values:'Eleaf1'}, {key:'mechmode', values:'some'}, {key:'color', values:['black']}, {key:'batrtype', values:'some2'} ]}, {_id: 12345, name:'third', category:'Vape3', property:[ {key:'brand', values:'Eleaf3'}, {key:'mechmode', values:'some'}, {key:'color', values:['green', 'yellow']}, {key:'batrtype', values:'some2'} ]}, {_id: 123456, name:'fourth', category:'Vape', property:[ {key:'brand', values:'Eleaf'}, {key:'mechmode', values:'some'}, {key:'color', values:['red', 'green']}, {key:'batrtype', values:'some2'} ]} ] 可能会引发KeyError。

虽然我们正在努力 - 为什么功能提示用户输入呢?在调用函数中执行此操作。

{category:'Vape', body:{brand:'Eleaf', color:'red'}}

答案 1 :(得分:1)

在函数的定义中使用等号时,如

def function(arg1=something, arg2=something_else):
    ...

用这些值调用函数。你在做什么是设置默认值,以便在没有相应参数的情况下调用函数。 Python会运行您编写的任何代码来代替somethingsomething_else,并将结果值存储为默认值。

所以在你的情况下,当你定义函数make_movie()时,作为定义过程的一部分,Python将运行那些input()调用以从用户那里获得一些输入。它将存储该输入并在没有参数的情况下调用make_movie()时使用它。您可以通过在脚本末尾添加一些没有参数的make_movie()调用来查看其工作原理 - 您将看到Python仅询问您每次输入一次,因为您将input()调用作为函数定义的一部分。

您应该做的是每次要呼叫make_movie()时要求用户输入,并将该输入传递给make_movie()功能。你可以通过写作来做到这一点,例如,

movie_name = input("What is your favorite movie? ")
...
make_movie(movie_name, ...)

当然,您需要用实际代码填写...,但这是每次调用具有不同参数的函数的方法。当你调用函数时,你必须指定参数的值。

当然,您不应该让您的函数具有movie_name之类的默认值。当某人(可能是您)试图使用您的函数而不指定电影名称或其他必需参数时,您希望Python注意并抱怨。这样做的方法是 not ,包括函数定义中的默认值。在我上面的小例子中,我可以写

def function(arg1, arg2=something_else):
    ...

那样arg1是必需的参数,而arg2仍然是可选的。或者我可以写

def function(arg1, arg2):
    ...

这样就需要arg1arg2

您应该能够毫不费力地找出代码中的相应更改!

答案 2 :(得分:0)

这里有逻辑错误。你的if-else语句是倒退的,就是这样。这里的简单修复只是改变:

if running_time == 'no'

if running_time != 'no'

或者你可以改变输出来纠正这个

答案 3 :(得分:0)

def make_movie(movie_name, studio, running_time=""):
    if running_time:
        movie = {'movie name': movie_name, 'studio': studio, 'running time': running_time}
        print(movie)
    else:
        movie = {'movie name': movie_name, 'studio': studio}
        print(movie)
    return movie
name = input("What is your favorite movie? ")
studio =  input("What studio is it under? ")
runtime = input("Do you know the running time? If not just press enter ")
make_movie(name, studio, runtime)

这是一个固定版本。请注意,这里我仍然使用一个在电影的运行时间内传递的调用,即使该字符串为空。