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

时间:2013-11-04 19:40:44

标签: python

在Zed Shaw的学习Python困难之路的示例中,其中一个练习显示以下代码:

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是一个很短的字符串,可以通过搜索引擎缩小答案范围,而且我不知道其操作的正确名称。

8 个答案:

答案 0 :(得分:95)

这取决于next是什么。

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

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

如果它是一种不同类型的可迭代(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

答案 1 :(得分:15)

使用a in b只是转换为b.__contains__(a),如果b包括或不包含应该返回。

但是,您的示例看起来有点奇怪,如果输入包含how_much"0" "1"变量强>

答案 2 :(得分:8)

由于您声称自己习惯使用JavaScript:

Python in运算符类似于JavaScript in运算符。

这是一些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 / dicts,它们几乎相同,都检查1是否是对象/字典的键。当然,最大的区别在于JavaScript是一种类型,所以'1' in d也是如此。

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

使用字符串,它们会更加不同。 JS字符串不是对象,因此您将获得TypeError。但是Python strunicode将检查另一个操作数是否是子串。 (这意味着1 in '123'是非法的,因为1不能是任何事物的子串,但'1' in '123'是真的。)

将对象作为对象,在JS中当然没有区别,但在Python中,对象是类的实例,而不是dicts。所以,在JS中,1 in d对于一个对象是真的,如果它有一个名为'1'的成员或方法,但在Python中,它取决于你的类意味着什么 - Python会调用{{1}然后,如果失败,它会尝试将您的对象用作可编辑的(通过调用其d.__contains__(1),如果失败,则尝试使用从__iter__开始的整数对其进行索引。) / p>

另外,请注意JS的0,因为它实际上正在检查对象成员资格,通常是JS方法 - 解析 - 顺序搜索,而Python的in,因为它正在检查dict的键,序列的成员等没有这样的事情。因此,从技术上讲,它可能比in运算符更接近hasOwnProperty方法。

答案 3 :(得分:1)

这些例子可能有助于说明in的作用。它基本上转换为Is this item in this other item?

listOfNums = [ 1, 2, 3, 4, 5, 6, 45, 'j' ]

>>> 3 in listOfNums:
>>> True

>>> 'j' in listOfNums:
>>> True

>>> 66 in listOfNums:
>>> False

答案 4 :(得分:1)

您已习惯使用javascript if,我假设您知道它的工作原理。

in是实现迭代的 Pythonic 方式。对于非程序化的思考者而言应该更容易采用,但这有时会使程序化思想家更难以讽刺。

当你说if x in y时,你真的在​​说:

“如果xy”中,则假定y有索引。然后在那个if语句中,根据条件检查y中每个索引的每个对象。

类似地,

for x in y

x中遍历y,其中y是可转换的项目集。

以这种方式考虑if情况(伪代码):

for i in next:
    if i == "0" || i == "1":
        how_much = int(next)

它会照顾next上的迭代。

快乐的编码!

答案 5 :(得分:0)

此处raw_inputstring,因此,如果您想检查if var>3,那么您应该将其转换为双倍,即float(next),并按照if float(next)>3进行操作1}} :,但在大多数情况下

答案 6 :(得分:0)

保留字“in”用于查看可以迭代的对象。

list_obj = ['a', 'b', 'c']
tuple_obj = ('a', 1, 2.0)
dict_obj = {'a': 1, 'b': 2.0}
obj_to_find = 'c'
if obj_to_find in list_obj:
    print('Object {0} is in {1}'.format(obj_to_find, list_obj))
obj_to_find = 2.0
if obj_to_find in tuple_obj:
    print('Object {0} is in {1}'.format(obj_to_find, tuple_obj))
obj_to_find = 'b'
if obj_to_find in dict_obj:
    print('Object {0} is in {1}'.format(obj_to_find, dict_obj))

输出:

Object c is in ['a', 'b', 'c']
Object 2.0 is in ('a', 1, 2.0)
Object b is in {'a': 1, 'b': 2.0}

然而

cannot_iterate_over = 5.5
obj_to_find = 5.5
if obj_to_find in cannot_iterate_over:
    print('Object {0} is in {1}'.format(obj_to_find, cannot_iterate_over))

将抛出

Traceback (most recent call last):
File "/home/jgranger/workspace/sandbox/src/csv_file_creator.py", line 43, in <module>
if obj_to_find in cannot_iterate_over:
TypeError: argument of type 'float' is not iterable

在您的情况下,raw_input(“&gt;”)返回可迭代对象,否则将抛出TypeError

答案 7 :(得分:0)

这可能是一个很晚的答案。 in 操作员检查成员资格。也就是说,它检查其左操作数是否是其右操作数的成员。在这种情况下,raw_input()返回用户在标准输入处提供的对象的 str 对象。因此, if 条件检查输入是否包含子字符串“ 0”或“ 1”。考虑到下一行的类型转换( int()), if 条件实际上检查输入是否包含数字0或1。