在Python中,如何判断函数返回的值?
我正在调试我写的这个程序。对于给定的单词、手和单词列表,如何判断它返回的是真还是假?我尝试初始化一个变量失败,然后修改它并打印它的值。它没有打印,所以我不知道它的行为是否像它应该的那样。感谢您的帮助 我有一个函数load_words(),它返回一个单词列表。我知道word在word_列表中(我检查过),所以只是想看看word是否完全由字典中的键组成,在本例中不是,所以它应该返回False 还有,.keys()和.iterrkeys()之间的区别是什么?是否有更好的方法在hand中循环,可能是使用字母、hand.iteritems()中的值 更新我希望在我的函数中使用此函数,但它给出了一个关键错误,即使它本身工作正常在Python中,如何判断函数返回的值?,python,dictionary,boolean,Python,Dictionary,Boolean,我正在调试我写的这个程序。对于给定的单词、手和单词列表,如何判断它返回的是真还是假?我尝试初始化一个变量失败,然后修改它并打印它的值。它没有打印,所以我不知道它的行为是否像它应该的那样。感谢您的帮助 我有一个函数load_words(),它返回一个单词列表。我知道word在word_列表中(我检查过),所以只是想看看word是否完全由字典中的键组成,在本例中不是,所以它应该返回False 还有,.keys()和.iterrkeys()之间的区别是什么?是否有更好的方法在hand中循环,可能是使用
def update_hand(hand, word):
"""
Assumes that 'hand' has all the letters in word.
In other words, this assumes that however many times
a letter appears in 'word', 'hand' has at least as
many of that letter in it.
Updates the hand: uses up the letters in the given word
and returns the new hand, without those letters in it.
Has no side effects: does not modify hand.
word: string
hand: dictionary (string -> int)
returns: dictionary (string -> int)
"""
for letter in [list(i) for i in word.split('\n')][0]:
if letter in hand.keys():
hand[letter] = hand[letter]-1
if hand[letter] <= 0:
del hand[letter]
display_hand(hand)
return hand
def更新手(手,字):
"""
假设“手”包含单词中的所有字母。
换言之,这假设
“word”、“hand”中出现的字母至少有
那封信中有很多是我写的。
更新手:使用给定单词中的字母
并返回新的手,没有这些字母。
没有副作用:不修改手。
字:字符串
手:字典(字符串->整数)
返回:字典(字符串->整型)
"""
对于[list(i)for i in word.split('\n')][0]中的字母:
如果字母在手。键():
手[信]=手[信]-1
如果手写[字母],它没有打印出来的原因是因为您在它打印之前返回了函数。这意味着程序在到达print
语句之前停止。例如:
def foo(x):
return x
print x
foo("asdf")
if word in word_list:
for letter in word:
if letter in hand.keys():
return True
else:
return False
else:
return False
将不返回任何内容,而:
def foo(x):
print x
return x
foo("asdf")
将打印:
asdf
因此,之前的所有语句都返回
。否则,它将不会执行
关于你的第二个澄清,这篇文章已经有了你的答案:
在Python2中,iter(d.keys())
和d.iterkeys()
并不完全相同,尽管它们的行为相同。在第一种情况下,keys()
将返回字典键列表的副本,iter
随后将返回该列表上的迭代器对象,而第二种情况下,不会生成完整键列表的副本
请注意,Python 3也没有.iterkeys()
。Python 3使用以前的.iterkeys()
作为新的.keys()
最后,我将按照严重程度的降序来回顾代码的一般错误以及您希望实现的目标
您的代码只检查一个字母
[list(i)for i in word.split('\n')][0]
不是从一个单词中获取所有字母的方式
您应该首先返回短代码,这样就不会有大的缩进块
您的代码只检查一个字母
在for循环中,在选中第一个单词后,立即返回True。您应该在循环完成后返回True
for letter in word:
if letter not in hand.keys():
return False
return True
列表理解
你的列表理解是不需要的(我稍后会告诉你为什么),也不需要如此复杂,仅仅为了从一个单词中获得字母。例如
[list(i) for i in word.split('\n')][0]
实际上只有这样:
list(word)
事实上,您应该直接迭代这个单词(正如我上面所做的),它会一个接一个地返回字母:
for letter in word:
# code...
先返回短代码
通常我不喜欢大块高度缩进的代码。您可以做的是首先让短代码返回。例如:
def foo(x):
return x
print x
foo("asdf")
if word in word_list:
for letter in word:
if letter in hand.keys():
return True
else:
return False
else:
return False
可以简单地写为:
if word not in word_list:
return False
for letter in word:
if letter in hand.keys():
return True
else:
return False
不过,这只是我的看法。其他一些人可能更喜欢else
语句,以便知道何时执行代码
您的最终代码如下所示:
def is_valid_word(word, hand, word_list):
if word not in word_list:
return False
for letter in word:
if letter not in hand.keys():
return False
return True
干净,对吗?但是,我假设您正在制作一个类似于拼字游戏的游戏,因此您可以计算手上的单词是否与您选择的单词相符。如果单词中的字母数小于或等于您手中的字母数,您可以添加一些计数:
def is_valid_word(word, hand, word_list):
if word not in word_list:
return False
# This makes the word into a "unique list"
letters = set(word)
for letter in letters:
if hand[letter] < word.count(letter):
return False
return True
它没有打印出来的原因是,您在函数print
s之前返回了该函数。这意味着程序在到达print
语句之前停止。例如:
def foo(x):
return x
print x
foo("asdf")
if word in word_list:
for letter in word:
if letter in hand.keys():
return True
else:
return False
else:
return False
将不返回任何内容,而:
def foo(x):
print x
return x
foo("asdf")
将打印:
asdf
因此,之前的所有语句都返回
。否则,它将不会执行
关于你的第二个澄清,这篇文章已经有了你的答案:
在Python2中,iter(d.keys())
和d.iterkeys()
并不完全相同,尽管它们的行为相同。在第一种情况下,keys()
将返回字典键列表的副本,iter
随后将返回该列表上的迭代器对象,而第二种情况下,不会生成完整键列表的副本
请注意,Python 3也没有.iterkeys()
。Python 3使用以前的.iterkeys()
作为新的.keys()
最后,我将按照严重程度的降序来回顾代码的一般错误以及您希望实现的目标
您的代码只检查一个字母
[list(i)for i in word.split('\n')][0]
不是从一个单词中获取所有字母的方式
您应该首先返回短代码,这样就不会有大的缩进块
您的代码只检查一个字母
在for循环中,在选中第一个单词后,立即返回True。您应该在循环完成后返回True
for letter in word:
if letter not in hand.keys():
return False
return True
列表理解
你的列表理解是不需要的(我稍后会告诉你为什么),也不需要如此复杂,仅仅为了从一个单词中获得字母。例如
[list(i) for i in word.split('\n')][0]
实际上只有这样:
list(word)
事实上,您应该迭代