if语句中“in”的用法和含义?

2024-05-13 11:07:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在Zed Shaw的Learn Python the Hard Way中的一个示例中,其中一个练习显示以下代码:

next = raw_input("> ")
if "0" in next or "1" in next:
    how_much = int(next)

我很难理解这句话中in的意思。我习惯于使用if语句,比如在javascript中,语法如下:

var = 5;
if (var > 3) {
    //code  to be executed
}

这个if/in语句(在python中)是否与javascript中的if()语句相同?

找到这个问题的答案是很棘手的,因为in是一个很短的字符串,通过搜索引擎可以缩小答案的范围,而且我不知道它的操作的正确名称。


Tags: the答案代码in示例ifvar语句
3条回答

使用a in b简单地转换为b.__contains__(a),如果b包含a或不包含a,则应该返回。

但是,您的示例看起来有点奇怪,它接受来自用户的输入,如果输入包含"0""1",则将其整数值赋给how_much变量

既然你声称习惯了JavaScript:

Python^{}运算符与JavaScript^{}运算符类似。

下面是一些JavaScript:

var d = {1: 2, 3: 4};
if (1 in d) {
    alert('true!');
}

以及等效的Python:

d = {1: 2, 3: 4}
if 1 in d:
    print('true!')

对于objects/dict,它们几乎是相同的,都检查1是否是object/dict的一个键。当然,最大的区别是JavaScript是草率类型的,所以'1' in d也同样正确。

对于数组/列表,它们非常不同。JS数组是一个对象,其索引是键,因此1 in [3, 4, 5]将是true。Python列表与dict完全不同,它的in运算符检查的是,而不是索引,后者往往更有用。Python将此行为扩展到所有iterable。

有了弦,它们就更不一样了。JS字符串不是对象,因此您将得到一个TypeError。但是Pythonstrunicode将检查另一个操作数是否是子字符串。(这意味着1 in '123'是非法的,因为1不能是任何子字符串,但是'1' in '123'是真的。)

对象作为对象,在JS中当然没有区别,但在Python中,对象是类的实例,而不是dict。因此,在JS中,1 in d对于一个名为'1'的成员或方法是正确的,但在Python中,这取决于您的类,它的意思是Python将调用d.__contains__(1),然后,如果失败,它将尝试将您的对象用作可发出的对象(通过调用它的__iter__,如果失败,则尝试使用从0开始的整数对其进行索引)。

另外,请注意JS的in,因为它实际上是在检查对象成员身份,所以执行通常的JS方法解析顺序搜索,而Python的in,因为它检查dict的键、序列的成员等,所以不执行这种操作。所以,从技术上讲,它可能比in运算符更接近^{}方法。

这取决于next是什么。

如果是字符串(如您的示例中所示),则in检查子字符串。

>>> "in" in "indigo"
True
>>> "in" in "violet"
False
>>> "0" in "10"
True
>>> "1" in "10"
True

如果是另一种iterable(list、tuple、set、dictionary…),则in检查成员身份。

>>> "in" in ["in", "out"]
True
>>> "in" in ["indigo", "violet"]
False

在词典中,成员资格被视为“关键因素之一”:

>>> "in" in {"in": "out"}
True
>>> "in" in {"out": "in"}
False

相关问题 更多 >