我是一名编程新手,正在解决一个问题,要求在句子中找到最短的单词。我不明白以下两种方法的区别:
def find_short(s):
for x in s.split():
return min(len(x))
and
def find_short(s):
return min(len(x) for x in s.split())
因为前者给我一个错误,而后者似乎工作正常。它们不是基本上相同的东西吗?
我是一名编程新手,正在解决一个问题,要求在句子中找到最短的单词。我不明白以下两种方法的区别:
def find_short(s):
for x in s.split():
return min(len(x))
and
def find_short(s):
return min(len(x) for x in s.split())
因为前者给我一个错误,而后者似乎工作正常。它们不是基本上相同的东西吗?
print([len(x) for x in s.split()])
min
接受一个数组作为参数。def find_short(s):
for x in s.split():
return min(len(x))
min
被调用一次,用于第一个单词的长度,因此它会崩溃,因为它期望一个数组。
你的第二个块有所不同。
"def find_short(s):
return min(len(x) for x in s.split())
len(x) for x in s.split()
,它将返回一个包含所有长度的数组并将其传递给 min
。然后,使用这个数组,min
将能够返回最小值。
第一个示例有效地说明:
取字符串
s
,按空格分割,然后取每个单词x
,返回仅包含x
长度的最小值。
第二个例子的意思是:
在由
s.split()
生成的列表中找到len(x)
的最小值。
那个第一个例子出现错误是因为
min
函数需要比较至少2个或以上的元素,但只提供了1个。len(x) for x in s.split()
生成的列表将字符串转换为单词长度列表(例如,它会将字符串转换为[6, 5, 4, 6]
)。这个生成的列表(也是为什么它被称为生成器)是min
函数用来查找列表中最小值的内容。
如果你希望第一个示例按照你的期望工作,还有另一种编写方式,如下所示
def find_short(s):
min_length = float("inf")
for x in s.split():
if len(x) < min_length:
min_length = len(x)
return min_length
旁注:
跟在 return
关键字后面的任何值都是函数“输出”的内容,因此不会再执行任何代码。
例如,在您的第一个示例中(假设没有生成错误),无论您给它什么字符串,循环只会执行一次,因为它没有检查您是否确实找到了想要的值。我的意思是,每当您的代码遇到一个 return
语句时,这意味着您的函数已经“完成”了。
这就是为什么在我的示例 find_short
函数中,我有一个 if
语句来检查我是否拥有我想要的值,然后才会提交到完全退出函数的 return
语句。
这里主要有两个错误。
首先,似乎你返回的是字符串的长度,而不是字符串本身。
因此,你的函数将返回4而不是'book',例如。
我会简短地介绍如何修复它。
但回答你的问题:
min()是一个期望可迭代对象(类似于数组)的函数。
在你的第一种方法中,你正在拆分文本,并为每个单词调用return min(len(word))
。
因此,如果调用成功,它将在第一次迭代时返回。
但它并不成功,因为min(3)会抛出异常,3不可迭代。
在你的第二种方法中,你正在创建一个参数列表以供min函数使用。
因此,你的代码首先解析len(x) for x in s.split()
,返回像3、2、3、4、1、3、5这样的参数列表,然后返回最小值。
如果你想返回最短的单词,可以尝试:
def find_short(s):
y = s.split()
y.sort(key=lambda a: len(a))
return y[0]
'dog'
,还是最短单词的长度,例如3
? - Alex Hall