10 ms·
Comprehensive Python Cheatsheet (2018)
- TBurette 8y agoI like the clean look and the overall way it is presented. The examples using angle brackets (eg.: <list>.append(<el>) ) is highly legible and the one column format is faster to scan.
- Singletoned 8y agoI came here to say exactly the opposite. The angle brackets mean that every single example is a syntax error. If you are going to write a cheatsheet with samples of Python code, why not write it in valid Python? This is clearly aimed at beginners as the samples are or very basic things, yet this is going to be confusing to them as they will think that `<list>` is syntax. Have a look at the Python docs for much better ways of doing this
- wenc 8y agoI think the author of this document is trying to differentiate between types (broad notions of course -- there's no type called 'num' in Python). The Python docs (example here[1]) on the other hand limit themselves to {}, [] and () to differentiate between dicts, lists and tuples, but doesn't really differentiate between these and the more generalized notions of collections/iterators/element, etc. As someone who codes in statically typed languages and has an intuitive sense of upcasting / downcasting / contravariance / covariance, this level of precision makes sense to me and enhances my appreciation for Python types. That said, I've also been writing Python professionally since 2005 so I'm comfortable with not worrying too much about types in Python -- with dynamic typing things just work as long as they have the right shape and behavior. [1] https://docs.python.org/3/library/threading.html#threading.Thread https://docs.python.org/3/library/threading.html#threading.T...
- Singletoned 8y agoBut he could achieve exactly the same thing by using descriptive variable names without the angle brackets. Admittedly he can't use `list` as it's a built-in but `a_list` or `list_` would be much better than `<list>`.
- pizzaburek 8y agoMy personal opinion is that `list_` is among the worst possible variable names (together with `bar` and `foo`). It's non-descriptive, ugly, hard to recognize, looks scary to beginners and maybe worst of all it's easy to forget the underscore when typing.
- Singletoned 8y agoThat's exactly what he's used, but with angle brackets around it. What do you think he should have done instead.
- wenc 8y agoGood point. For list, one could still use the name "lst" and get the point across.
- avip 8y agoVery good page. But the best python cheat sheet is help(the_thing). python has the second best ever help and discoverability (after Matlab of course!)
- Waterluvian 8y agoYes! And implementing this help text for your library is free. It just assembles the docstrings found in your code. And then your favourite text editor can use this for autocomplete and such as well. Treating docstrings as an actual reflectable part of a class/function and not just "comments to be ignored by a parser" is brilliant.
- legends2k 8y agoWhat to do `help(thing)` you need to know what the _thing_ is. With Python, many times I vaguely know something but dunno what it is exactly. This cheatsheet solves that!
- legends2k 8y agoBut. to do `help(thing)` you need to know what the _thing_ is. With Python, many times I vaguely know something but dunno what it is exactly. This cheatsheet solves that!
- avip 8y agoYou can call help on anything. Here I am asking for help on something I have no clue about: >>> from server.db import db >>> help(db) help on Client in module google.cloud.firestore_v1beta1.client object: class Client(google.cloud.client.ClientWithProject) | Client(project=None, credentials=None, database='(default)') | | Client for interacting with Google Cloud Firestore API. | | .. note:: | | Since the Cloud Firestore API requires the gRPC transport, no | ``_http`` argument is accepted by this class. ...
- projectramo 8y agoI think legends 2k means you may not know the name of a function you need to use in something you are trying to implement. Example: Suppose you didn't know that re was what you needed for regular expression, or suppose you forgot how iterators work etc.
- dvfjsdhgfv 8y agoCan we please change the current clickbait title (Best Python Cheatsheet Ever!) to the original one (Comprehensive Python Cheatsheet)?
- timdellinger 8y agoAgreed, although I'll note here that this was posted to /r/python under the clickbait version of the title, so the HN submitter was likely just passing it on from there.
- reacharavindh 8y agoNow, this I understand. I have to sit down and translate it to Rust :-)
- sametmax 8y agoNice, but why does this needs JS to be rendered ?
- pizzaburek 8y agoBecause it's rendered directly from README.md. That way it's easier for me, because I don't have to render it every time I make a change (I make a lot of little edits all the time), and project's Github page (https://github.com/gto76/python-cheatsheet https://github.com/gto76/python-cheatsheet) always has the same content as webpage.
- sametmax 8y agoThanks.
- explainplease 8y agoIt's quite annoying to have to enable JS for 3 different domains just to see something other than a blank page. It also prevents non-JS browsers and retrievers from seeing content. If you were to use e.g. org-mode for the source document, you could easily export to HTML automatically when the file is saved. You could also easily use a git hook to run e.g. pandoc to convert md to HTML automatically. There are many ways of automatically exporting HTML when you save the md source file. Please use one.
- pizzaburek 8y agoWill look into it, thanks for info.
- explainplease 8y agoThanks for being open to the idea (unlike the downvoters). HN is so tiresome.
- bo1024 8y agoI would also encourage the author and others to export static documents to HTML. As a user, I really appreciate it.
- omegote 8y agoThere are several items that are dubious at best. Why would you use no_duplicates = list(dict.fromkeys(<list>)) instead of no_duplicates = list(set(<list>)) ?
- pizzaburek 8y ago>>> list(dict.fromkeys([3, 2, 1])) [3, 2, 1] >>> list(set([3, 2, 1])) [1, 2, 3]
- carlmr 8y agoVery cool!
- misterdoubt 8y agoNeither dict nor set preserve order. This is a misleading snippet.
- woadwarrior01 8y agoIn Python 3.6+, dictionaries preserve insertion order. This is done by storing the keys, values (and cached hash values) in a separate array, and the hashtable is a succinct array of indexes into this array. This results in more compact dictionaries, which are also a bit faster because of it's cache friendliness. Preserving insertion order is a happy side effect of this. This optimization can also be applied to Python sets, but it hasn't been done yet.
- BerislavLopac 8y agoMore importantly, in Python 3.7 this exception has become the rule, i.e. it was introduced in the language specification
- dbcurtis 8y agoI am personally not a fan of details like this creeping into the language spec. CPython is not the only Python. This kind of spec creates unnecessary challenges for Micropython, for example. And of course there is Cython and others. It makes no sense to me that this should be in the language spec — you are essentially specifying a built in minefield of implementation bugs.
- alexanderdmitri 8y agoI like your linux cheat sheet too. Thanks for sharing!
- gjvc 8y agoif __name__ == '__main__': main() is better as if __name__ == '__main__': sys.exit( main() )
- Nanocurrency 8y agoFor those wondering why, like I did, here's why: https://stackoverflow.com/questions/5280203/what-does-this-mean-exit-main https://stackoverflow.com/questions/5280203/what-does-this-m...
- nszceta 8y agoEmpty set literal: {*()}
- pizzaburek 8y agoMIND = BLOWN
- BerislavLopac 8y agoConsidering it has the same number of characters as the idiomatic set(), its only value is in curiosity as a special case of collection unpacking.
- vram22 8y agoIn the section "Inline -> Comprehension", isn't this: <iter> = (i+5 for i in range(10)) # (5, 6, ..., 14) really a generator expression?
- pizzaburek 8y agoYes, although there is a saying that "every generator is an iterator, but not every iterator is a generator". But then again generator has a bunch of methods (close, gi_frame, gi_yieldfrom, throw, gi_code, gi_running, send) that iterators don't have... I really don't know if <iter> is correct enough here, or should I use <genr> (that I don't use anywhere else and could be confusing).
- x3tm 8y agoI would've written: <iter> = ( f(i) for i in <gen>) where f() is some function of i.
- fencepost 8y agoSeems to me that perhaps this should be a Show HN since it's submitted by the creator. Also, for me the main link won't actually display and I can't be bothered to track down why, but the Github source (https://github.com/gto76/python-cheatsheet https://github.com/gto76/python-cheatsheet) displays just fine.
- basil-rash 8y agoIs it just me or is dict#setdefualt a terribly named function? I just learned of it here, and I was excited that it would set the default value for the dictionary, when instead it performs something like: (self, key, default) => self[key] = (key in self ? self[key] : default) I'd prefer something like "dict#createifnotexists", but better.
- deleted 8y ago[deleted]
- BerislavLopac 8y agoOr get_or_create, to follow Django's example.
- ac29 8y agoAre you maybe looking for a defaultdict? https://docs.python.org/3.7/library/collections.html#collections.defaultdict https://docs.python.org/3.7/library/collections.html#collect...
- basil-rash 8y agoI'm aware of defaultdict, but when I saw that method on dict I got excited because I thought it meant I didn't need defaultdict anymore.
- plg 8y agoSo to get a list of unique values you suggest I convert to a dictionary and then convert back to a list? Is this the Python way? I dunno it seems like acrobatics no_duplicates = list(dict.fromkeys(<list>))
- occams_chainsaw 8y agoEasier: no_duplicates = set(<list>)
- dagw 8y agoExcept that won't return a list. You need list(set(<list>)). Also using set means you lose list ordering, which isn't the case when using dict (assuming python 3.6 or higher). That being said, and not that it should ever make a difference, list(set(<list>)) is 2-3 times faster than list(dict.fromkeys(<list>))
- gorb314 8y agoI like the basic script template that the author provides. However, when I start development of new code I always use a script that starts off with traceback and pdb, something like this: #!/usr/bin/env python import traceback import pdb import sys def main(): # some WIP code that maybe raises an exception raise BaseException("oh no, exception!") return 0 if __name__ == "__main__": try: ret = main() except: traceback.print_exc() pdb.post_mortem() sys.exit(ret) This means that whenever an uncaught exception gets raised, I immediately get told what happened (full backtrace) plus I get dumped into the debugger, from where I can inspect why this happened. I liberally sprinkle assert()s through my code, so this gives me a good edit-run-debug cycle to work with.
- smittywerben 8y agoThis is pretty smart. When I'm making one-off scripts I use the interactive flag python -i script.py I've programmed Python for years and never knew this. I'm not sure how well this handles errors. Tab complete works, only thing that is missing is needing to wrap help(<func>) to see signatures. I'm enjoying the standard lib interpreter.
- ont 8y agoI use ipython for similar task. It has wrapper for 'help' function ('?' symbol after function name), tab completion and syntax highlighting. Also it has special %hist command for easy copy-paste code.
- smittywerben 8y agoI like IPython unless working with large arrays, because of weird memory issues I experienced (maybe they're fixed?). I miss the %run, !<cd, ls, pip>, %timeit magic and the IPython.terminal.debugger.set_trace(). If you're on linux it's not _that_ bad without it since the shell sort of acts like the notebook (with an equally horrible markup language). The help() and tab-complete and _ __ ___ for last 3 values works, time python <file>.py can benchmark, -i or pdb.set_trace does the debugging. It doesn't keep a persistent history though so the workflow is sort of different. So I use both, particularly for plots and images knowing IPython is very helpful for working with the notebooks.
- udev 8y agoSomething magical happens when you have a one page reference for a language or tool. I just end up learning it much faster. For me this is the best quick reference for Python (2.7 unfortunately): http://rgruet.free.fr/PQR27/PQR2.7.html http://rgruet.free.fr/PQR27/PQR2.7.html
- v4ult 8y agoThis is quite useful as I don't always remember syntax. Are there any available for Ruby or Linux?
- elmo2you 8y agoFor Linux, from the same author: https://gto76.github.io/linux-cheatsheet/ https://gto76.github.io/linux-cheatsheet/
- ngcc_hk 8y agoIs there a cheatsheet for cython to go with this ?