Comprehensive Python Cheatsheet
===============================
[Download text file](https://raw.githubusercontent.com/gto76/python-cheatsheet/master/README.md)
or [Fork me on GitHub](https://github.com/gto76/python-cheatsheet).
![Monty Python](web/image_888.jpeg)
Main
----
```python
if __name__ == '__main__':
main()
```
List
----
```python
= [from_inclusive : to_exclusive : step_size]
```
```python
.append()
.extend()
+= []
+=
```
```python
.sort()
.reverse()
= sorted()
= reversed()
```
```python
sum_of_elements = sum()
elementwise_sum = [sum(pair) for pair in zip(list_a, list_b)]
sorted_by_second = sorted(, key=lambda el: el[1])
sorted_by_both = sorted(, key=lambda el: (el[1], el[0]))
flatter_list = list(itertools.chain.from_iterable())
product_of_elems = functools.reduce(lambda out, x: out * x, )
list_of_chars = list()
```
```python
index = .index() # Returns first index of item.
.insert(index, ) # Inserts item at index and moves the rest to the right.
= .pop([index]) # Removes and returns item at index or from the end.
.remove() # Removes first occurrence of item or raises ValueError.
.clear() # Removes all items.
```
Dictionary
----------
```python
= .keys()
= .values()
= .items()
```
```python
value = .get(key, default=None) # Returns default if key does not exist.
value = .setdefault(key, default=None) # Same, but also adds default to dict.
= collections.defaultdict() # Creates a dictionary with default value of type.
= collections.defaultdict(lambda: 1) # Creates a dictionary with default value 1.
```
```python
.update() # Or: dict_a = {**dict_a, **dict_b}.
= dict() # Initiates a dict from coll. of key-value pairs.
= dict(zip(keys, values)) # Initiates a dict from two collections.
= dict.fromkeys(keys [, value]) # Initiates a dict from collection of keys.
```
```python
value = .pop(key) # Removes item from dictionary.
{k: v for k, v in .items() if k in keys} # Filters dictionary by keys.
```
### Counter
```python
>>> from collections import Counter
>>> colors = ['red', 'blue', 'yellow', 'blue', 'red', 'blue']
>>> counter = Counter(colors)
Counter({'blue': 3, 'red': 2, 'yellow': 1})
>>> counter.most_common()[0]
('blue', 3)
```
Set
---
```python
= set()
```
```python
.add()
.update()
|= {}
|=
```
```python
= .union() # Or: |
= .intersection() # Or: &
= .difference() # Or: -
= .symmetric_difference() # Or: ^
= .issubset() # Or: <=
= .issuperset() # Or: >=
```
```python
.remove() # Throws error.
.discard() # Doesn't throw error.
```
### Frozenset
#### Is hashable, meaning it can be used as a key in dictionary.
```python
= frozenset()
```
Range
-----
```python
= range(to_exclusive)
= range(from_inclusive, to_exclusive)
= range(from_inclusive, to_exclusive, step_size)
= range(from_inclusive, to_exclusive, -step_size)
```
```python
from_inclusive = .start
to_exclusive = .stop
```
Enumerate
---------
```python
for i, el in enumerate( [, i_start]):
...
```
Named Tuple
-----------
```python
>>> from collections import namedtuple
>>> Point = namedtuple('Point', 'x y')
>>> p = Point(1, y=2)
Point(x=1, y=2)
>>> p[0]
1
>>> p.x
1
>>> getattr(p, 'y')
2
>>> p._fields # Or: Point._fields
('x', 'y')
```
Iterator
--------
```python
= iter()
= iter(, to_exclusive)
```
#### Reads input until it reaches an empty line:
```python
for line in iter(input, ''):
...
```
#### Same, but prints a message every time:
```python
from functools import partial
for line in iter(partial(input, 'Please enter value: '), ''):
...
```
### Next
**Returns next item. If there are no more items it raises StopIteration exception or returns default if specified.**
```python
= next( [, default])
```
#### Skips first item:
```python
next()
for element in :
...
```
Generator
---------
**Convenient way to implement the iterator protocol.**
```python
def count(start, step):
while True:
yield start
start += step
```
```python
>>> counter = count(10, 2)
>>> next(counter), next(counter), next(counter)
(10, 12, 14)
```
Itertools
---------
* **Every function returns an iterator and can accept any collection and/or iterator.**
* **If you want to print the iterator, you need to pass it to the list() function!**
```python
from itertools import islice, count, repeat, cycle, chain
```
```python
= islice(, to_exclusive)
= islice(, from_inclusive, to_exclusive)
= islice(, from_inclusive, to_exclusive, step_size)
```
```python
= count(start=0, step=1) # Counter.
= repeat( [, times]) # Returns element endlesly or times times.
= cycle() # Repeats the sequence indefinately.
```
```python
= chain(, [, ...]) # Empties sequences in order.
= chain.from_iterable() # Empties sequences inside a sequence in order.
```
Type
----
```python
= type() # / / ...
```
```python
from numbers import Number, Integral, Real, Rational, Complex
= isinstance(, Number)
```
```python
= callable()
```
String
------
```python
= .strip() # Strips all whitespace characters from both ends.
= .strip('') # Strips all passed characters from both ends.
```
```python
= .split() # Splits on any whitespace character.
= .split(sep=None, maxsplit=-1) # Splits on 'sep' str at most 'maxsplit' times.
= .join() # Joins elements using string as separator.
```
```python
= .replace(old_str, new_str)
= .startswith() # Pass tuple of strings for multiple options.
= .endswith() # Pass tuple of strings for multiple options.
= .index() # Returns start index of first match.
= .isnumeric() # True if str contains only numeric characters.
= textwrap.wrap(, width) # Nicely breaks string into lines.
```
### Char
```python
= chr() # Converts int to unicode char.
= ord() # Converts unicode char to int.
```
```python
>>> ord('0'), ord('9')
(48, 57)
>>> ord('A'), ord('Z')
(65, 90)
>>> ord('a'), ord('z')
(97, 122)
```
Regex
-----
```python
import re
= re.sub(, new, text, count=0) # Substitutes all occurrences.
= re.findall(, text) # Returns all occurrences.
= re.split(, text, maxsplit=0) # Use brackets in regex to keep the matches.
= re.search(, text) # Searches for first occurrence of pattern.
= re.match(, text) # Searches only at the beginning of the text.
= re.finditer(, text) # Returns all occurrences as match objects.
```
* **Parameter `'flags=re.IGNORECASE'` can be used with all functions.**
* **Parameter `'flags=re.DOTALL'` makes dot also accept newline.**
* **Use `r'\1'` or `'\\\\1'` for backreference.**
* **Use `'?'` to make operator non-greedy.**
### Match Object
```python
= .group() # Whole match.
= .group(1) # Part in first bracket.
= .groups() # All bracketed parts.
= .start() # Start index of a match.
= .end() # Exclusive end index of a match.
```
### Special Sequences
**Expressions below hold true for strings that contain only ASCII characters. Use capital letter for negation.**
```python
'\d' == '[0-9]' # Digit
'\s' == '[ \t\n\r\f\v]' # Whitespace
'\w' == '[a-zA-Z0-9_]' # Alphanumeric
```
Format
------
```python
= f'{}, {}'
= '{}, {}'.format(, )
```
```python
>>> Person = namedtuple('Person', 'name height')
>>> person = Person('Jean-Luc', 187)
>>> f'{person.height}'
'187'
>>> '{p.height}'.format(p=person)
'187'
```
### General Options
```python
{:<10} # ' '
{:>10} # ' '
{:^10} # ' '
{:->10} # '------'
{:>0} # ''
```
### String Options
**`'!r'` calls object's repr() method, instead of format(), to get a string.**
```python
{'abcde'!r:<10} # "'abcde' "
```
```python
{'abcde':.3} # 'abc'
{'abcde':10.3} # 'abc '
```
### Number Options
```python
{1.23456:.3f} # '1.235'
{1.23456:10.3f} # ' 1.235'
```
```python
{ 123456:10,} # ' 123,456'
{ 123456:10_} # ' 123_456'
{ 123456:+10} # ' +123456'
{-123456:=10} # '- 123456'
{ 123456: } # ' 123456'
{-123456: } # '-123456'
```
```python
{65:c} # 'A'
{3:08b} # '00000011' -> Binary with leading zeros.
{3:0<8b} # '11000000' -> Binary with trailing zeros.
```
#### Float presentation types:
* **`'f'` - Fixed point: `.f`**
* **`'%'` - Percent: `.%`**
* **`'e'` - Exponent**
#### Integer presentation types:
* **`'c'` - character**
* **`'b'` - binary**
* **`'x'` - hex**
* **`'X'` - HEX**
Numbers
-------
### Basic Functions
```python
= pow(, ) # Or: **
= abs()
= round( [, ndigits])
```
### Constants
```python
from math import e, pi
```
### Trigonometry
```python
from math import cos, acos, sin, asin, tan, atan, degrees, radians
```
### Logarithm
```python
from math import log, log10, log2
= log( [, base]) # Base e, if not specified.
```
### Infinity, nan
```python
from math import inf, nan, isinf, isnan
```
#### Or:
```python
float('inf'), float('nan')
```
### Statistics
```python
from statistics import mean, median, variance, pvariance, pstdev
```
### Random
```python
from random import random, randint, choice, shuffle
= random()
= randint(from_inclusive, to_inclusive)
= choice()
shuffle()
```
Combinatorics
-------------
* **Every function returns an iterator.**
* **If you want to print the iterator, you need to pass it to the list() function!**
```python
from itertools import combinations, combinations_with_replacement, permutations, product
```
```python
>>> combinations('abc', 2)
[('a', 'b'), ('a', 'c'), ('b', 'c')]
>>> combinations_with_replacement('abc', 2)
[('a', 'a'), ('a', 'b'), ('a', 'c'),
('b', 'b'), ('b', 'c'),
('c', 'c')]
>>> permutations('abc', 2)
[('a', 'b'), ('a', 'c'),
('b', 'a'), ('b', 'c'),
('c', 'a'), ('c', 'b')]
>>> product('ab', '12')
[('a', '1'), ('a', '2'),
('b', '1'), ('b', '2')]
>>> product([0, 1], repeat=3)
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1),
(1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
```
Datetime
--------
```python
from datetime import datetime
now = datetime.now()
now.month # 3
now.strftime('%Y%m%d') # '20180315'
now.strftime('%Y%m%d%H%M%S') # '20180315002834'
= datetime.strptime('2015-05-12 00:39', '%Y-%m-%d %H:%M')
```
Arguments
---------
### Inside Function Call
```python
() # f(0, 0)
() # f(x=0, y=0)
(, ) # f(0, y=0)
```
### Inside Function Definition
```python
def f(): # def f(x, y)
def f(): # def f(x=0, y=0)
def f(, ): # def f(x, y=0)
```
Splat Operator
--------------
### Inside Function Call
**Splat expands collection into positional arguments, while splatty-splat expands dictionary into keyword arguments.**
```python
args = (1, 2)
kwargs = {'x': 3, 'y': 4, 'z': 5}
func(*args, **kwargs)
```
#### Is the same as:
```python
func(1, 2, x=3, y=4, z=5)
```
### Inside Function Definition
**Splat combines zero or more positional arguments into tuple, while splatty-splat combines zero or more keyword arguments into dictionary.**
```python
def add(*a):
return sum(a)
```
```python
>>> add(1, 2, 3)
6
```
#### Legal argument combinations with calls:
```python
def f(*args): # f(1, 2, 3)
def f(x, *args): # f(1, 2, 3)
def f(*args, z): # f(1, 2, z=3)
def f(x, *args, z): # f(1, 2, z=3)
```
```python
def f(**kwargs): # f(x=1, y=2, z=3)
def f(x, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3)
```
```python
def f(*args, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3) | f(1, 2, z=3) | f(1, 2, 3)
def f(x, *args, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3) | f(1, 2, z=3) | f(1, 2, 3)
def f(*args, y, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3)
def f(x, *args, z, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3) | f(1, 2, z=3)
```
### Other Uses
```python
>>> a = (1, 2, 3)
>>> [*a]
[1, 2, 3]
```
```python
>>> head, *body, tail = [1, 2, 3, 4]
>>> body
[2, 3]
```
Inline
------
### Lambda
```python
= lambda:
= lambda , :
```
### Comprehension
```python
= [i+1 for i in range(10)] # [1, 2, ..., 10]
= {i for i in range(10) if i > 5} # {6, 7, 8, 9}
= {i: i*2 for i in range(10)} # {0: 0, 1: 2, ..., 9: 18}
= (i+5 for i in range(10)) # (5, 6, ..., 14)
```
```python
out = [i+j for i in range(10) for j in range(10)]
```
#### Is the same as:
```python
out = []
for i in range(10):
for j in range(10):
out.append(i+j)
```
### Map, Filter, Reduce
```python
from functools import reduce
= map(lambda x: x + 1, range(10)) # (1, 2, ..., 10)
= filter(lambda x: x > 5, range(10)) # (6, 7, 8, 9)
= reduce(lambda out, x: out + x, range(10)) # 45
```
### Any, All
```python
= any() # False if empty.
= all(el[1] for el in ) # True if empty.
```
### If - Else
```python
if else
```
```python
>>> [a if a else 'zero' for a in (0, 1, 0, 3)]
['zero', 1, 'zero', 3]
```
### Namedtuple, Enum, Class
```python
from collections import namedtuple
Point = namedtuple('Point', 'x y')
point = Point(0, 0)
```
```python
from enum import Enum
Direction = Enum('Direction', 'n e s w')
Cutlery = Enum('Cutlery', {'fork': 1, 'knife': 2, 'spoon': 3})
```
```python
# Warning: Objects will share the objects that are initialized in the dictionary!
Creature = type('Creature', (), {'p': Point(0, 0), 'd': Direction.n})
creature = Creature()
```
Closure
-------
**We have a closure in Python when:**
* **A nested function references a value of its enclosing function and then**
* **the enclosing function returns the nested function.**
```python
def get_multiplier(a):
def out(b):
return a * b
return out
```
```python
>>> multiply_by_3 = get_multiplier(3)
>>> multiply_by_3(10)
30
```
* **If multiple nested functions within enclosing function reference the same value, that value gets shared.**
* **To dynamically access function's first free variable use `'.__closure__[0].cell_contents'`.**
### Partial
```python
from functools import partial