在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
是一个很短的字符串,可以通过搜索引擎缩小答案范围,而且我不知道其操作的正确名称。
答案 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 str
或unicode
将检查另一个操作数是否是子串。 (这意味着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
时,你真的在说:
“如果x
在y
”中,则假定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_input
为string
,因此,如果您想检查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。