Use and meaning of "in" in an if statement?
You are used to using the javascript if
, and I assume you know how it works.
in
is a Pythonic way of implementing iteration. It's supposed to be easier for non-programmatic thinkers to adopt, but that can sometimes make it harder for programmatic thinkers, ironically.
When you say if x in y
, you are literally saying:
"if x
is in y
", which assumes that y
has an index. In that if
statement then, each object at each index in y
is checked against the condition.
Similarly,
for x in y
iterates through x
's in y
, where y
is that indexable set of items.
Think of the if
situation this way (pseudo-code):
for i in next:
if i == "0" || i == "1":
how_much = int(next)
It takes care of the iteration over next
for you.
Happy coding!
Since you claim to be used to JavaScript:
The Python in
operator is similar to the JavaScript in
operator.
Here's some JavaScript:
var d = {1: 2, 3: 4};
if (1 in d) {
alert('true!');
}
And the equivalent Python:
d = {1: 2, 3: 4}
if 1 in d:
print('true!')
With objects/dicts, they're nearly identical, both checking whether 1
is a key of the object/dict. The big difference, of course, is that JavaScript is sloppily-typed, so '1' in d
would be just as true.
With arrays/lists, they're very different. A JS array is an object, and its indexes are the keys, so 1 in [3, 4, 5]
will be true
. A Python list is completely different from a dict, and its in
operator checks the values, not the indexes, which tends to be more useful. And Python extends this behavior to all iterables.
With strings, they're even more different. A JS string isn't an object, so you will get a TypeError
. But a Python str
or unicode
will check whether the other operand is a substring. (This means 1 in '123'
is illegal, because 1
can't be a substring of anything, but '1' in '123'
is true.)
With objects as objects, in JS there is of course no distinction, but in Python, objects are instances of classes, not dicts. So, in JS, 1 in d
will be true for an object if it has a member or method named '1'
, but in Python, it's up to your class what it means—Python will call d.__contains__(1)
, then, if that fails, it tries to use your object as an utterable (by calling its __iter__
, and, if that fails, by trying to index it with integers starting from 0
).
Also, note that JS's in
, because it's actually checking for object membership, does the usual JS method-resolution-order search, while Python's in
, because it's checking for keys of a dict, members of a sequence, etc., does no such thing. So, technically, it's probably a bit closer to the hasOwnProperty
method than the in
operator.
It depends on what next
is.
If it's a string (as in your example), then in
checks for substrings.
>>> "in" in "indigo"
True
>>> "in" in "violet"
False
>>> "0" in "10"
True
>>> "1" in "10"
True
If it's a different kind of iterable (list, tuple, set, dictionary...), then in
checks for membership.
>>> "in" in ["in", "out"]
True
>>> "in" in ["indigo", "violet"]
False
In a dictionary, membership is seen as "being one of the keys":
>>> "in" in {"in": "out"}
True
>>> "in" in {"out": "in"}
False
Using a in b
is simply translates to b.__contains__(a)
, which should return if b includes a or not.
But, your example looks a little weird, it takes an input from user and assigns its integer value to how_much
variable if the input contains "0"
or "1"
.