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()
我的老师给了我们这个问题:
- 电影:编写一个名为make_movie()的函数,用于构建描述电影的字典。该函数应该包含电影名称和制作电影的工作室,它应该返回包含这两条信息的字典。使用此功能可以制作三个代表不同电影的词典。打印每个返回值以显示字典正确存储电影信息。
醇>一个。添加一个可选参数到make_movie(),允许您存储 该 电影的运行时间。如果主叫行包含一个值 电影的运行时间,将该值添加到电影的字典中。做到 至少一个新的函数调用,包括电影的运行时间。
我坚持使用可选参数。如果人们不知道电影的运行时间,那么我根本不希望字典显示它。我做了这个函数,以便函数要求每个变量的用户输入,但是当它要求运行时,即使我输入了“没有”#39;它仍将在字典中显示运行时。
所以我的问题是,我的代码是否有任何变化可以让它起作用?
答案 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会运行您编写的任何代码来代替something
和something_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):
...
这样就需要arg1
和arg2
。
您应该能够毫不费力地找出代码中的相应更改!
答案 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)
这是一个固定版本。请注意,这里我仍然使用一个在电影的运行时间内传递的调用,即使该字符串为空。