在if语句中“ in”的使用和含义?
在Zed Shaw的《学习Python的艰难方法》的示例中,其中一个练习显示了以下代码:
next = raw_input(“> “)
if “0” in next or “1” in next:
how_much = int(next)
在这段陈述中,我很难理解in的含义。 我习惯于使用in语句,例如在javascript中,其语法类似于:
var = 5;
if (var > 3) {
//code to be executed
}
这个in/in陈述式(Python)与javascript中的if()相同吗?
找到这个问题的答案很棘手,因为in太短了,无法通过搜索引擎缩小答案范围,而且我不知道其操作的正确名称。
Scherf asked 2020-06-24T09:54:30Z
8个解决方案
112 votes
这取决于in是什么。
如果它是一个字符串(如您的示例所示),则in将检查子字符串。
>>> “in” in “indigo”
True
>>> “in” in “violet”
False
>>> “0” in “10”
True
>>> “1” in “10”
True
如果是另一种可迭代的类型(列表,元组,集合,字典…),则in检查成员资格。
>>> “in” in [“in”, “out”]
True
>>> “in” in [“indigo”, “violet”]
False
在字典中,成员资格被视为“关键之一”:
>>> “in” in {“in”: “out”}
True
>>> “in” in {“out”: “in”}
False
Tim Pietzcker answered 2020-06-24T09:54:52Z
17 votes
使用a in b可以简单地转换为”0″,如果b包含a或不包含a,则应该返回。
但是,您的示例看起来有些怪异,如果用户输入包含”0″或”0″,则会从用户那里获取输入并将其整数值分配给”0″变量。
utdemir answered 2020-06-24T09:55:17Z
9 votes
由于您声称习惯于JavaScript:
Python 1 in d运算符类似于JavaScript 1 in d运算符。
这是一些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!’)
对于对象/字典,它们几乎相同,都检查1 in d是否是对象/字典的键。 当然,最大的不同是JavaScript的类型是草率的,因此str也是一样。
对于数组/列表,它们有很大的不同。 JS数组是一个对象,其索引是键,因此1 in d将是str。Python列表与dict完全不同,其unicode运算符将检查值,而不是索引,这会更有用。 Python将这种行为扩展到了所有可迭代对象。
使用字符串,它们甚至会有所不同。 JS字符串不是对象,因此您将获得1 in d。但是Python str或unicode将检查另一个操作数是否为子字符串。 (这意味着2936932733433442642627是非法的,因为1不能是任何东西的子串,但’1′ in ‘123’是正确的。)
以对象为对象,在JS中当然没有区别,但是在Python中,对象是类的实例,而不是字典。 因此,在JS中,如果对象具有名为in9840的成员或方法,则1 in d对于一个对象将为true,但是在Python中,这取决于您的类-Python将调用in,然后,如果失败,它将尝试使用 将您的对象视为可发音对象(调用其in9842,如果失败,则尝试使用从0开始的整数对其进行索引)。
另外,请注意,因为JS的in9840实际上是在检查对象的隶属关系,所以会执行通常的JS方法分辨率顺序搜索,而Python的in因为正在检查dict的键,序列的成员等,所以没有这种方法。 事情。 因此,从技术上讲,它可能比2936932733475675619842运算符更接近hasOwnProperty方法。
abarnert answered 2020-06-24T09:56:15Z
1 votes
也许这些例子将有助于说明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
jramirez answered 2020-06-24T09:56:35Z
1 votes
您已经习惯使用JavaScript in,并且我想您知道它是如何工作的。
in是实现迭代的Python方式。 非程序思想家应该更容易采用,但是讽刺的是,有时候这会使程序思想家变得更加困难。
当您说next时,您实际上是在说:
“如果next在y中”,则假定y具有索引。 然后在该if语句中,对照该条件检查y中每个索引处的每个对象。
同样,
next
遍历y中的next,其中y是可索引的一组项目。
以这种方式考虑next的情况(伪代码):
for i in next:
if i == “0” || i == “1”:
how_much = int(next)
它为您处理了next上的迭代。
编码愉快!
jwarner112 answered 2020-06-24T09:57:35Z
1 votes
这可能是一个很晚的答案。在操作员中检查成员资格。 也就是说,它检查其左操作数是否是其右操作数的成员。 在这种情况下,raw_input()返回用户在标准输入处提供的内容的str对象。 因此,if条件检查输入是否包含子字符串“ 0”或“ 1”。 考虑下一行中的类型转换(int()),if条件实际上检查输入是否包含数字0或1。
bp14 answered 2020-06-24T09:57:56Z
0 votes
这里raw_input是string,因此,如果要检查if var>3,则应将其转换为双精度值,即float(next),并按与if float(next)>3相同的方式执行:,但是在大多数情况下
Ananta answered 2020-06-24T09:58:16Z
0 votes
保留字“ 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
if obj_to_find in cannot_iterate_over:
TypeError: argument of type ‘float’ is not iterable
在您的情况下,raw_input(“>”)返回可迭代的对象,否则将引发TypeError
jgranger answered 2020-06-24T09:58:53Z