Hidden features of Python
stackoverflow.com
stackoverflow.com
>>> {s: len(s) for s in ["one", "two", "three"]
{"one": 3, "two": 3, "three": 5} (defn map-comprehension [f sequence]
(reduce #(assoc %1 %2 (f %2)) {} sequence))
usage: user> (map-comprehension count ["one" "two" "three"])
{"three" 5, "two" 3, "one" 3} >>> dict((s, len(s)) for s in ["one", "two", "three"])
{'three': 5, 'two': 3, 'one': 3} (True + True) == 2
(sorry, one of my few pet-peeves after it bit me one time)It's just like Duck Typing- you're trading the need to explicitly specify an interface for the potential dangers of letting your interpreter "know what you mean".
If this is frequently a problem, well... there are a lot of strongly-typed languages out there waiting for you to give them a try.
Not in this case. In this case it results from:
1. Python historically not having booleans and using 0 and 1 instead
2. As a result, `bool` inherits from `int` for compatibility reasons
>>> issubclass(bool, int)
True
with False mapping to 0 and True to 1 for compatibility purposes >>> int(False), int(True)
(0, 1)
3. Add isn't overridden on bool >>> bool.__add__
<slot wrapper '__add__' of 'int' objects>
therefore, when adding two booleans you're really adding two integers.Most non-strongly-typed languages will not have the following behavior
>>> "foo" + 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'int' objectsIn that sense, Python is a very strongly typed language: from the top of my head, the only example of implicit type conversion in Python is the promotion of `int` to `long`, which has been removed from 3.x (all integer types were unified). All other conversions have to be explicit as far as I remember. That makes Python more strongly (but less statically) typed than Java (see the very strange overloading of the `+` operator when any operand is a string, as well as autoboxing since 1.5) and C# (C# allows for implicit type conversions, including in userland, and the cast operator doubles up as an explicit type conversion operator which I find terrible)
So no, it does not have a use :)
You can check if two out of three are true with
(bool1 + bool2 + bool3) >= 2
You can do
count_negatives = sum(number < 0 for number in numbers)
Sounds kinda like I'm making the same argument as Knuth in forcing '[]' over '()'.
True + True == False
might be a common interpretation. 1
+ 1
----
0 >>> issubclass(bool, int)
True
>>> isinstance(True, int)
True
>>> int(True)
1
>>> int(False)
0
>>> True == 1
True
>>> False == 0
TrueYes, I have heard of "batteries included" and all, but after working with Python for a year I still felt that the size of its library has been "hidden" from general programming public.
I love Python.
Runs a local SMTP server on port 2525. Very useful for debugging.
Now that's a feature I wish I knew about sooner. I've been using:
for item in a:
print a.index(item), item
which has always felt kludgy. import itertools
for (index, item) in zip(itertools.count(0), "hallo"):
print index, item
Itertools is worth checking out for other goodies, too. for i in range(len(a)):
print i, a[i](Ok, I didn't know about re.DEBUG)
EDIT: I'm not claiming this link is worthless. But I'd call it "great features of python" or simply "features of python"