Python “的用法和含义;在;在if语句中?

Python “的用法和含义;在;在if语句中?,python,Python,在Zed Shaw的《艰苦学习Python》中的一个示例中,其中一个练习显示以下代码: next = raw_input("> ") if "0" in next or "1" in next: how_much = int(next) 我很难理解这句话中的含义。我习惯于使用if语句,例如在javascript中,其中的语法类似于: var = 5; if (var > 3) { //code to be executed } 语句(python中)中的if/是

在Zed Shaw的《艰苦学习Python》中的一个示例中,其中一个练习显示以下代码:

next = raw_input("> ")
if "0" in next or "1" in next:
    how_much = int(next)
我很难理解这句话中
的含义。我习惯于使用
if
语句,例如在javascript中,其中的语法类似于:

var = 5;
if (var > 3) {
    //code  to be executed
}
语句(python中)中的
if
/
是否与javascript中的
if()
相同


要找到这个问题的答案很难,因为
中的
字符串非常短,无法通过搜索引擎缩小答案的范围,而且我不知道其操作的正确名称。

这取决于
下一步是什么

如果它是一个字符串(如您的示例中所示),那么
中的
将检查子字符串

>>> "in" in "indigo"
True
>>> "in" in "violet"
False
>>> "0" in "10"
True
>>> "1" in "10"
True
如果它是一种不同类型的iterable(列表、元组、集合、字典…),那么
中的
将检查成员资格

>>> "in" in ["in", "out"]
True
>>> "in" in ["indigo", "violet"]
False
在字典中,成员资格被视为“关键之一”:


在b
中使用
a可以简单地转换为
b.uu包含uuu(a)
,如果b包含或不包含a,则返回


但是,您的示例看起来有点奇怪,它接受用户的输入,并将其整数值分配给
变量,如果输入包含
“0”
“1”

,这些示例可能有助于说明
中的
功能。它基本上转化为
此项目是否在其他项目中?

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

>>> 3 in listOfNums:
>>> True

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

>>> 66 in listOfNums:
>>> False

您已经习惯于使用javascript
if
,我想您知道它是如何工作的

中的
是一种python式的迭代实现方式。非程序性思考者应该更容易接受,但讽刺的是,这有时会让程序性思考者更难接受

当你说
如果x在y中
,你实际上是在说:

“如果
x
位于
y
”,则假定
y
具有索引。在该
if
语句中,根据条件检查
y
中每个索引处的每个对象

同样地

y轴中x轴的

迭代
y
中的
x
,其中
y
是可索引的项目集

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

它为您处理下一步的迭代


快乐编码

这里的
raw\u input
string
,因此如果您想检查,
如果var>3
,那么您应该将next转换为double,即
float(next)
并按照
如果float(next)>3
的方法进行操作,但在大多数情况下,保留字“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
回溯(最近一次呼叫最后一次):
文件“/home/jgranger/workspace/sandbox/src/csv_File_creator.py”,第43行,在
如果obj_to_find in无法迭代:
TypeError:类型为“float”的参数不可编辑

在您的情况下,原始输入(“>”)返回iterable对象,否则它将抛出TypeError,因为您声称使用JavaScript:

var d = {1: 2, 3: 4};
if (1 in d) {
    alert('true!');
}
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的键入很随意,因此d
中的
'1'也同样正确

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

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

对象作为对象,在JS中当然没有区别,但在Python中,对象是类的实例,而不是dict。因此,在JS中,如果对象具有名为
'1'
的成员或方法,则d
中的
1对于该对象将为真,但在Python中,Python调用
d的含义取决于您的类(通过调用它的
\uuuu iter\uuuu
,如果调用失败,则尝试使用从
0
开始的整数对其进行索引)


另外,请注意,JS在
中的
,因为它实际上是在检查对象成员身份,所以会执行通常的JS方法解析顺序搜索,而Python在
中的
,因为它是在检查dict的键、序列的成员等,所以不会执行此类操作。因此,从技术上讲,它可能比中的
更接近该方法e> 接线员。

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

它也可能有助于使用操作符搜索Google——例如,“operator”中的“python”
在最初的几个结果中准确地给出了您需要的内容。在最近的python(2.6+),您不应该使用
next
作为变量名。如果您习惯使用JavaScript,您将覆盖内置函数,您怎么可能不知道它也有运算符?
d = {1: 2, 3: 4}
if 1 in d:
    print('true!')