下面的find_longest
类中的dict
方法在字典中找到最长的键值。
class LongestKey(dict):
def find_longest(self):
longest = None
for key in self:
if not longest or len(key) > len(longest):
longest = key
print(key)
a = LongestKey()
a["hi"] = 1
a["hello"] = 2
a["hey there"] = 3
a["greetings sir"] = 4
a.find_longest()
代码正在运行,但是我很难理解if not或语句背后的逻辑。我原来用
if len(key) > len(longest):
代替
if not longest or len(key) > len(longest):
,但会产生错误:TypeError: object of type 'NoneType' has no len()
。为什么是这样?非常感谢您的启发。
答案 0 :(得分:0)
这是因为您正在检查设置为longest
的{{1}}的长度。因此是错误。
示例
None
之所以没有得到该错误,是因为执行了x = None
print(len(x))
# output
TypeError: object of type 'NoneType' has no len()
,而第二个条件if not longest
却没有执行,因为第一个条件已经匹配。最重要的是,它起作用的原因是len(key) > len(longest)
的值在第二次迭代中发生了变化。
答案 1 :(得分:0)
首先,您声明变量<ContentPage.Content>
<ScrollView>
<StackLayout>
<BoxView BackgroundColor="Red" HeightRequest="600" WidthRequest="150" />
<Entry />
</StackLayout>
</ScrollView>
</ContentPage.Content>
并将其分配给longest
None
def find_longest(self):
longest = None
没有NoneType
。因此它导致了这一说法:
len()
它检查if not longest or len(key) > len(longest):
...
是否已更新
答案 2 :(得分:0)
为什么需要进行if not longest
检查是因为第一次运行循环时,longest
是None
,而您不能执行len(None)
。因此,您进行if not longest
检查,并且只有在False
时,才检查第二个条件。
longest
而不是-1
初始化为None
并将len(key)
与longest
(不是len(longest)
)进行比较来避免这种额外的检查。 。
类似这样的东西:
class LongestKey(dict):
def find_longest(self):
longest = -1
for key in self:
if len(key) > longest:
longest = len(key)
longest_key = key
print(longest_key) # <-- print longest key not just key.
注意:您的代码仅打印最后一个键,而每次可能都不是最长的键。在if
中,您需要更新最长密钥以及longest
的值,如图所示。
答案 3 :(得分:0)
这是为了防止在for
循环的第一次迭代过程中发生错误。
首先评估逻辑表达式的not longest
部分,如果它是True
,则不评估表达式的其余部分or len(key) > len(longest)
部分,并且该值整个表达式也将是True
。
之所以需要这样做,是因为最初longest
设置为None
,并且编写了逻辑表达式以防止下半部分的len(longest)
部分被求值,而{{1} }是因为TypeError
尚未长。
答案 4 :(得分:0)
做事时:
longest=None
您要确保对象最长具有'无值'或'空值'。在Python中,我们不需要先声明变量,因此Python中没有真正的 empty 变量。将变量设置为 None 不同于将其设置为默认的空值。一个值也不是什么,尽管它经常被用来表示空。 那么,如果对象为空,如何计算其长度呢?这就是这里使用的逻辑, longest 根本没有任何值,因此会引发错误:
TypeError: object of type 'NoneType' has no len()
使用时:
if not longest or len(key) > len(longest):
您要确保对象最长的值没有 None 。