我是编码的新手,我正在研究一个问题,要求找到句子中最短的单词。我很困惑之间的区别:
def find_short(s):
for x in s.split():
return min(len(x))
和
def find_short(s):
return min(len(x) for x in s.split())
是,因为前者给我一个错误,而后者似乎工作正常。他们实际上不是一回事吗?
答案 0 :(得分:2)
他们实际上不是一回事吗?
不,它们不是一回事。如果s
等于"hello world"
,则在第一次迭代中,x
将是"hello"
。这里有两件事是错误的:
min(len(x))
就像说min(5)
一样,这不仅是传递给min(..)
的错误参数,而且没有任何意义。您希望传递一个元素列表,min
将根据这些元素来计算最小值。第二种方法实际上是正确的。 See this answer of mine了解如何解释它。简而言之,您正在计算每个单词的长度,将其放入列表(实际上是一个生成器),然后要求min对它进行最小计算。
有一种更简单的方法来查看第二个表达式为何起作用。尝试打印以下结果:
print([len(x) for x in s.split()])
答案 1 :(得分:1)
不,他们不是一回事。
在第一段代码中,您输入for
周期并尝试计算第一个单词长度的min
。 min(5)
没有意义,对吗?即使可以计算,return
也会停止执行此函数(不会考虑其他单词的长度)。
在第二个单词中,len(x) for x in s.split()
是generator expression,它产生句子中所有单词的长度。 min
将计算此序列的最小元素。
答案 2 :(得分:1)
函数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())
在min里面,您有len(x) for x in s.split()
,它将返回所有长度的数组并将其提供给min
。然后,使用该数组,min
将能够返回最小的数组。
答案 3 :(得分:1)
是的,给出的示例非常不同。
第一个示例有效地说明:
取字符串
s
,用空格分割,然后取每个单词x
,找到并返回x
长度的最小值。
第二个示例有效地说明:
在
len(x) for x in s.split()
生成的列表中查找最小值。
第一个示例会产生错误,因为min
函数希望比较至少2个或更多元素,并且仅提供1个。
第二个示例之所以有效,是因为len(x) for x in s.split()
生成的列表将一个字符串(如"Python types with ducks?"
转换为一个单词长度列表(在我的示例中,它将字符串转换为{{1 }})。生成的列表(这也就是为什么它被称为生成器的原因)是[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
语句之前检查是否具有所需的值
答案 4 :(得分:0)
这里主要有两个错误。
首先,似乎您正在返回字符串的长度,而不是字符串本身。
例如,您的函数将返回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之类的参数作为min的参数,这将返回最小值。
如果您想返回最短的单词,可以尝试:
def find_short(s):
y = s.split()
y.sort(key=lambda a: len(a))
return y[0]