【发布时间】:2021-03-06 04:45:45
【问题描述】:
所以,我正在研究一个 Python 函数,它接收一个数字列表作为参数并对其进行处理,就像这个例子一样:
def has_string(myList: list) -> str:
# Side cases
if myList == []:
return "Empty list can not be accepted as argument"
if myList contains any str object: # Here's the problem
return "Message: list contains at least one 'str' object"
return "Success, list contains only numeric values"
函数的用途:
-
不接受:
- 空列表 (
[]); - 非数字列表。
- 空列表 (
- 返回字符串消息。
我尝试了一些方法,例如:
-
if str in my_list: # return message -
if "" in my_list: # return message -
if my_list.count(""): # return message
然后尝试继续进行。我不想创建一个 for 循环并逐项检查,因为我想要一个不同的解决方案,它不需要通过所有索引来判断我的列表是否包含字符串。
正如我之前提到的,我在 if 块中尝试了一些不同的方法来检查它,但都没有奏效;即使有一个错误标准来停止它,程序仍然继续处理该列表。
非常感谢任何帮助,在此先感谢!
【问题讨论】:
-
没有某种循环是不可能的。您当然可以使循环非常简洁,但是如果不实际访问每个元素,就不可能测试每个元素的“类型”。一个这样的“干净”示例可能是
any(isinstance(i, str) for i in my_list) -
感谢您的回答!对我来说很有价值!那么,我可以在 if 块中使用它吗?即使它写在 if 块中,它会遍历列表吗?
-
any将返回True或False,所以可以在if语句中使用它。(isinstance(i, str) for i in my_list)被称为生成器表达式,它将遍历my_list。正如我之前所说,如果不以某种方式遍历它们,就无法检查列表的所有元素。通过使用any,一旦找到单个str,循环就会退出,因此在此之后不再继续,可以节省一点时间,但如果没有,它必须检查列表中的每个成员如果最后一个是字符串。 -
我还应该指出,使用列表调用
in实际上是在运行for循环来检查列表的每个元素以确定给定对象是否在列表中。对于此实例,无法避免for循环(无论该循环是您编写的循环,还是发生在幕后的循环)。 -
非常有趣的解释,谢谢!