我正在用Python编写一个程序来查找数组中最短和最长的字符串,例如,这是find_shortest
def find_shortest(words):
N = len(words)
shortest = words[0]
i = 1
while i < N:
if len(shortest) >= len(words[i]): #Change only this line for find_longest
shortest = words[i]
i += 1
return shortest
我的问题是 find_longest 函数与 find_shortest 函数相同,只是 find_longest 使用 <= sign instead of >=。我不想复制粘贴 find_shortest 函数来制作 find_longest 但我别无选择。在这种情况下如何避免复制粘贴和冗余?
您可以根据函数所处的“模式”创建一个比较函数来使用
def find(words, mode):
compare = (lambda x, y: x >= y) if mode == 'shortest' else (lambda x, y: x <= y)
N = len(words)
result = words[0]
i = 1
while i < N:
if compare(len(result), len(words[i])):
result = words[i]
i += 1
return result
其中
mode
是值 'shortest'
或 'longest'
。如果您愿意,可以简化为布尔值。为了清楚起见,我使用了字符串。
您可以基于函数参数,例如order参数,定义您想要执行的操作。放置一个 if 来标识操作是否:最短执行最短操作,如果不是,执行最长操作。它会添加一些逻辑,但可以帮助避免函数重复并且可以使用相同的作用域。
您可以添加一个标志作为参数,并根据它选择相应的比较,例如:
def find_shortest( words, short ):
shortest = words[ 0 ]
i = 1
while i < len( words ):
if short:
if len( shortest ) >= len( words[ i ] ):
shortest = words[ i ]
else:
if len( shortest ) <= len( words[ i ] ):
shortest = words[ i ]
i += 1
return shortest
word = "A short word are in Mexico"
words = word.split( " " )
print( find_shortest( words, True ))
print( find_shortest( words, False ))
可以通过 使用 for 循环迭代来简化该函数。
def find_shortest(words):
shortest = words[0]
for word in words:
if len(shortest) >= len(word):
shortest = word
return shortest
此时尝试重用这些琐碎的代码会导致代码变得更复杂、更慢;有时剪切和粘贴就可以了。
只要使用正常的方式,你几乎没有任何代码需要重复:
def find_shortest(words):
return min(words, key=len)
def find_longest(words):
return max(words, key=len)
我真的不会为此编写额外的函数,只需直接使用 min/max 即可。
(这些找到第一个最短/最长,而不是像你的那样最后一个。虽然你谈论“最”短,所以显然你没有联系。但如果你这样做并且很重要,你可以使用
min(reversed(words), key=len)
)。