You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1973 lines
45 KiB

7 years ago
7 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
6 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
7 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
6 years ago
7 years ago
7 years ago
6 years ago
7 years ago
7 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
7 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
  1. Comprehensive Python Cheatsheet
  2. ===============================
  3. <sup>[Download text file](https://raw.githubusercontent.com/gto76/python-cheatsheet/master/README.md)
  4. or [Fork me on GitHub](https://github.com/gto76/python-cheatsheet).
  5. </sup>
  6. ![Monty Python](web/image_888.jpeg)
  7. Main
  8. ----
  9. ```python
  10. if __name__ == '__main__':
  11. main()
  12. ```
  13. List
  14. ----
  15. ```python
  16. <list> = <list>[from_inclusive : to_exclusive : step_size]
  17. ```
  18. ```python
  19. <list>.append(<el>)
  20. <list>.extend(<collection>)
  21. <list> += [<el>]
  22. <list> += <collection>
  23. ```
  24. ```python
  25. <list>.sort()
  26. <list>.reverse()
  27. <list> = sorted(<collection>)
  28. <iter> = reversed(<list>)
  29. ```
  30. ```python
  31. sum_of_elements = sum(<collection>)
  32. elementwise_sum = [sum(pair) for pair in zip(list_a, list_b)]
  33. sorted_by_second = sorted(<collection>, key=lambda el: el[1])
  34. sorted_by_both = sorted(<collection>, key=lambda el: (el[1], el[0]))
  35. flatter_list = list(itertools.chain.from_iterable(<list>))
  36. product_of_elems = functools.reduce(lambda out, x: out * x, <collection>)
  37. list_of_chars = list(<str>)
  38. ```
  39. ```python
  40. index = <list>.index(<el>) # Returns first index of item.
  41. <list>.insert(index, <el>) # Inserts item at index and moves the rest to the right.
  42. <el> = <list>.pop([index]) # Removes and returns item at index or from the end.
  43. <list>.remove(<el>) # Removes first occurrence of item or raises ValueError.
  44. <list>.clear() # Removes all items.
  45. ```
  46. Dictionary
  47. ----------
  48. ```python
  49. <view> = <dict>.keys()
  50. <view> = <dict>.values()
  51. <view> = <dict>.items()
  52. ```
  53. ```python
  54. value = <dict>.get(key, default=None) # Returns default if key does not exist.
  55. value = <dict>.setdefault(key, default=None) # Same, but also adds default to dict.
  56. <dict> = collections.defaultdict(<type>) # Creates a dict with default value of type.
  57. <dict> = collections.defaultdict(lambda: 1) # Creates a dict with default value 1.
  58. ```
  59. ```python
  60. <dict>.update(<dict>) # Or: dict_a = {**dict_a, **dict_b}.
  61. <dict> = dict(<collection>) # Creates a dict from coll. of key-value pairs.
  62. <dict> = dict(zip(keys, values)) # Creates a dict from two collections.
  63. <dict> = dict.fromkeys(keys [, value]) # Creates a dict from collection of keys.
  64. ```
  65. ```python
  66. value = <dict>.pop(key) # Removes item from dictionary.
  67. {k: v for k, v in <dict>.items() if k in keys} # Filters dictionary by keys.
  68. ```
  69. ### Counter
  70. ```python
  71. >>> from collections import Counter
  72. >>> colors = ['red', 'blue', 'yellow', 'blue', 'red', 'blue']
  73. >>> counter = Counter(colors)
  74. Counter({'blue': 3, 'red': 2, 'yellow': 1})
  75. >>> counter.most_common()[0]
  76. ('blue', 3)
  77. ```
  78. Set
  79. ---
  80. ```python
  81. <set> = set()
  82. ```
  83. ```python
  84. <set>.add(<el>)
  85. <set>.update(<collection>)
  86. <set> |= {<el>}
  87. <set> |= <set>
  88. ```
  89. ```python
  90. <set> = <set>.union(<coll.>) # Or: <set> | <set>
  91. <set> = <set>.intersection(<coll.>) # Or: <set> & <set>
  92. <set> = <set>.difference(<coll.>) # Or: <set> - <set>
  93. <set> = <set>.symmetric_difference(<coll.>) # Or: <set> ^ <set>
  94. <bool> = <set>.issubset(<coll.>) # Or: <set> <= <set>
  95. <bool> = <set>.issuperset(<coll.>) # Or: <set> >= <set>
  96. ```
  97. ```python
  98. <set>.remove(<el>) # Throws error.
  99. <set>.discard(<el>) # Doesn't throw error.
  100. ```
  101. ### Frozenset
  102. #### Is hashable, meaning it can be used as a key in dictionary or as an element in set.
  103. ```python
  104. <frozenset> = frozenset(<collection>)
  105. ```
  106. Range
  107. -----
  108. ```python
  109. <range> = range(to_exclusive)
  110. <range> = range(from_inclusive, to_exclusive)
  111. <range> = range(from_inclusive, to_exclusive, ±step_size)
  112. ```
  113. ```python
  114. from_inclusive = <range>.start
  115. to_exclusive = <range>.stop
  116. ```
  117. Enumerate
  118. ---------
  119. ```python
  120. for i, el in enumerate(<collection> [, i_start]):
  121. ...
  122. ```
  123. Named Tuple
  124. -----------
  125. * **Tuple is an immutable and hashable list.**
  126. * **Named tuple is its subclass with named elements.**
  127. ```python
  128. >>> from collections import namedtuple
  129. >>> Point = namedtuple('Point', 'x y')
  130. >>> p = Point(1, y=2)
  131. Point(x=1, y=2)
  132. >>> p[0]
  133. 1
  134. >>> p.x
  135. 1
  136. >>> getattr(p, 'y')
  137. 2
  138. >>> p._fields # Or: Point._fields
  139. ('x', 'y')
  140. ```
  141. Iterator
  142. --------
  143. **In this cheatsheet `'<collection>'` can also mean an iterator.**
  144. ```python
  145. from itertools import count, repeat, cycle, chain, islice
  146. ```
  147. ```python
  148. <iter> = iter(<collection>)
  149. <iter> = iter(<function>, to_exclusive) # Sequence of return values until 'to_exclusive'.
  150. <el> = next(<iter> [, default]) # Raises StopIteration or returns 'default' on end.
  151. ```
  152. ```python
  153. <iter> = count(start=0, step=1) # Returns incremented value endlessly.
  154. <iter> = repeat(<el> [, times]) # Returns element endlessly or 'times' times.
  155. <iter> = cycle(<collection>) # Repeats the sequence indefinitely.
  156. ```
  157. ```python
  158. <iter> = chain(<collection>, <collection>) # Empties collections in order.
  159. <iter> = chain.from_iterable(<collection>) # Empties collections inside a collection in order.
  160. ```
  161. ```python
  162. <iter> = islice(<collection>, to_exclusive)
  163. <iter> = islice(<collection>, from_inclusive, to_exclusive)
  164. <iter> = islice(<collection>, from_inclusive, to_exclusive, step_size)
  165. ```
  166. Generator
  167. ---------
  168. **Convenient way to implement the iterator protocol.**
  169. ```python
  170. def count(start, step):
  171. while True:
  172. yield start
  173. start += step
  174. ```
  175. ```python
  176. >>> counter = count(10, 2)
  177. >>> next(counter), next(counter), next(counter)
  178. (10, 12, 14)
  179. ```
  180. Type
  181. ----
  182. ```python
  183. <type> = type(<el>) # <class 'int'> / <class 'str'> / ...
  184. ```
  185. ```python
  186. from numbers import Integral, Rational, Real, Complex, Number
  187. <bool> = isinstance(<el>, Number)
  188. ```
  189. ```python
  190. <bool> = callable(<el>)
  191. ```
  192. String
  193. ------
  194. ```python
  195. <str> = <str>.strip() # Strips all whitespace characters from both ends.
  196. <str> = <str>.strip('<chars>') # Strips all passed characters from both ends.
  197. ```
  198. ```python
  199. <list> = <str>.split() # Splits on any whitespace character.
  200. <list> = <str>.split(sep=None, maxsplit=-1) # Splits on 'sep' str at most 'maxsplit' times.
  201. <str> = <str>.join(<list>) # Joins elements using string as separator.
  202. ```
  203. ```python
  204. <str> = <str>.replace(old, new [, count]) # Replaces 'old' with 'new' at most 'count' times.
  205. <bool> = <str>.startswith(<sub_str>) # Pass tuple of strings for multiple options.
  206. <bool> = <str>.endswith(<sub_str>) # Pass tuple of strings for multiple options.
  207. <int> = <str>.index(<sub_str>) # Returns start index of first match.
  208. ```
  209. ```python
  210. <bool> = <str>.isnumeric() # True if str contains only numeric characters.
  211. <list> = textwrap.wrap(<str>, width) # Nicely breaks string into lines.
  212. ```
  213. ### Char
  214. ```python
  215. <str> = chr(<int>) # Converts int to unicode char.
  216. <int> = ord(<str>) # Converts unicode char to int.
  217. ```
  218. ```python
  219. >>> ord('0'), ord('9')
  220. (48, 57)
  221. >>> ord('A'), ord('Z')
  222. (65, 90)
  223. >>> ord('a'), ord('z')
  224. (97, 122)
  225. ```
  226. Regex
  227. -----
  228. ```python
  229. import re
  230. <str> = re.sub(<regex>, new, text, count=0) # Substitutes all occurrences.
  231. <list> = re.findall(<regex>, text) # Returns all occurrences.
  232. <list> = re.split(<regex>, text, maxsplit=0) # Use brackets in regex to keep the matches.
  233. <Match> = re.search(<regex>, text) # Searches for first occurrence of pattern.
  234. <Match> = re.match(<regex>, text) # Searches only at the beginning of the text.
  235. <iter> = re.finditer(<regex>, text) # Returns all occurrences as match objects.
  236. ```
  237. * **Parameter `'flags=re.IGNORECASE'` can be used with all functions.**
  238. * **Parameter `'flags=re.DOTALL'` makes dot also accept newline.**
  239. * **Use `r'\1'` or `'\\\\1'` for backreference.**
  240. * **Use `'?'` to make operator non-greedy.**
  241. ### Match Object
  242. ```python
  243. <str> = <Match>.group() # Whole match.
  244. <str> = <Match>.group(1) # Part in first bracket.
  245. <tuple> = <Match>.groups() # All bracketed parts.
  246. <int> = <Match>.start() # Start index of a match.
  247. <int> = <Match>.end() # Exclusive end index of a match.
  248. ```
  249. ### Special Sequences
  250. **Expressions below hold true for strings that contain only ASCII characters. Use capital letter for negation.**
  251. ```python
  252. '\d' == '[0-9]' # Digit
  253. '\s' == '[ \t\n\r\f\v]' # Whitespace
  254. '\w' == '[a-zA-Z0-9_]' # Alphanumeric
  255. ```
  256. Format
  257. ------
  258. ```python
  259. <str> = f'{<el_1>}, {<el_2>}'
  260. <str> = '{}, {}'.format(<el_1>, <el_2>)
  261. ```
  262. ```python
  263. >>> Person = collections.namedtuple('Person', 'name height')
  264. >>> person = Person('Jean-Luc', 187)
  265. >>> f'{person.height}'
  266. '187'
  267. >>> '{p.height}'.format(p=person)
  268. '187'
  269. ```
  270. ### General Options
  271. ```python
  272. {<el>:<10} # '<el> '
  273. {<el>:>10} # ' <el>'
  274. {<el>:^10} # ' <el> '
  275. {<el>:->10} # '------<el>'
  276. {<el>:>0} # '<el>'
  277. ```
  278. ### String Options
  279. **`'!r'` calls object's repr() method, instead of format(), to get a string.**
  280. ```python
  281. {'abcde'!r:<10} # "'abcde' "
  282. ```
  283. ```python
  284. {'abcde':.3} # 'abc'
  285. {'abcde':10.3} # 'abc '
  286. ```
  287. ### Number Options
  288. ```python
  289. {1.23456:.3f} # '1.235'
  290. {1.23456:10.3f} # ' 1.235'
  291. ```
  292. ```python
  293. { 123456:10,} # ' 123,456'
  294. { 123456:10_} # ' 123_456'
  295. { 123456:+10} # ' +123456'
  296. {-123456:=10} # '- 123456'
  297. { 123456: } # ' 123456'
  298. {-123456: } # '-123456'
  299. ```
  300. ```python
  301. {65:c} # 'A'
  302. {3:08b} # '00000011' -> Binary with leading zeros.
  303. {3:0<8b} # '11000000' -> Binary with trailing zeros.
  304. ```
  305. #### Float presentation types:
  306. * **`'f'` - Fixed point: `.<precision>f`**
  307. * **`'%'` - Percent: `.<precision>%`**
  308. * **`'e'` - Exponent**
  309. #### Integer presentation types:
  310. * **`'c'` - character**
  311. * **`'b'` - binary**
  312. * **`'x'` - hex**
  313. * **`'X'` - HEX**
  314. Numbers
  315. -------
  316. ### Basic Functions
  317. ```python
  318. <num> = pow(<num>, <num>) # Or: <num> ** <num>
  319. <real> = abs(<num>)
  320. <int> = round(<real>)
  321. <real> = round(<real>, ±ndigits)
  322. ```
  323. ### Math
  324. ```python
  325. from math import e, pi
  326. from math import cos, acos, sin, asin, tan, atan, degrees, radians
  327. from math import log, log10, log2
  328. from math import inf, nan, isinf, isnan
  329. ```
  330. ### Statistics
  331. ```python
  332. from statistics import mean, median, variance, pvariance, pstdev
  333. ```
  334. ### Random
  335. ```python
  336. from random import random, randint, choice, shuffle
  337. <float> = random()
  338. <int> = randint(from_inclusive, to_inclusive)
  339. <el> = choice(<list>)
  340. shuffle(<list>)
  341. ```
  342. Combinatorics
  343. -------------
  344. * **Every function returns an iterator.**
  345. * **If you want to print the iterator, you need to pass it to the list() function!**
  346. ```python
  347. from itertools import product, combinations, combinations_with_replacement, permutations
  348. ```
  349. ```python
  350. >>> product([0, 1], repeat=3)
  351. [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1),
  352. (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
  353. ```
  354. ```python
  355. >>> product('ab', '12')
  356. [('a', '1'), ('a', '2'),
  357. ('b', '1'), ('b', '2')]
  358. ```
  359. ```python
  360. >>> combinations('abc', 2)
  361. [('a', 'b'), ('a', 'c'), ('b', 'c')]
  362. ```
  363. ```python
  364. >>> combinations_with_replacement('abc', 2)
  365. [('a', 'a'), ('a', 'b'), ('a', 'c'),
  366. ('b', 'b'), ('b', 'c'),
  367. ('c', 'c')]
  368. ```
  369. ```python
  370. >>> permutations('abc', 2)
  371. [('a', 'b'), ('a', 'c'),
  372. ('b', 'a'), ('b', 'c'),
  373. ('c', 'a'), ('c', 'b')]
  374. ```
  375. Datetime
  376. --------
  377. ```python
  378. from datetime import datetime
  379. now = datetime.now()
  380. now.month # 3
  381. now.strftime('%Y%m%d') # '20180315'
  382. now.strftime('%Y%m%d%H%M%S') # '20180315002834'
  383. <datetime> = datetime.strptime('2015-05-12 00:39', '%Y-%m-%d %H:%M')
  384. ```
  385. Arguments
  386. ---------
  387. ### Inside Function Call
  388. ```python
  389. <function>(<positional_args>) # f(0, 0)
  390. <function>(<keyword_args>) # f(x=0, y=0)
  391. <function>(<positional_args>, <keyword_args>) # f(0, y=0)
  392. ```
  393. ### Inside Function Definition
  394. ```python
  395. def f(<nondefault_args>): # def f(x, y)
  396. def f(<default_args>): # def f(x=0, y=0)
  397. def f(<nondefault_args>, <default_args>): # def f(x, y=0)
  398. ```
  399. Splat Operator
  400. --------------
  401. ### Inside Function Call
  402. **Splat expands collection into positional arguments, while splatty-splat expands dictionary into keyword arguments.**
  403. ```python
  404. args = (1, 2)
  405. kwargs = {'x': 3, 'y': 4, 'z': 5}
  406. func(*args, **kwargs)
  407. ```
  408. #### Is the same as:
  409. ```python
  410. func(1, 2, x=3, y=4, z=5)
  411. ```
  412. ### Inside Function Definition
  413. **Splat combines zero or more positional arguments into tuple, while splatty-splat combines zero or more keyword arguments into dictionary.**
  414. ```python
  415. def add(*a):
  416. return sum(a)
  417. ```
  418. ```python
  419. >>> add(1, 2, 3)
  420. 6
  421. ```
  422. #### Legal argument combinations:
  423. ```python
  424. def f(*args): # f(1, 2, 3)
  425. def f(x, *args): # f(1, 2, 3)
  426. def f(*args, z): # f(1, 2, z=3)
  427. def f(x, *args, z): # f(1, 2, z=3)
  428. ```
  429. ```python
  430. def f(**kwargs): # f(x=1, y=2, z=3)
  431. def f(x, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3)
  432. ```
  433. ```python
  434. 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)
  435. 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)
  436. def f(*args, y, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3)
  437. def f(x, *args, z, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3) | f(1, 2, z=3)
  438. ```
  439. ### Other Uses
  440. ```python
  441. <list> = [*<collection> [, ...]]
  442. <set> = {*<collection> [, ...]}
  443. <tuple> = (*<collection>, [...])
  444. <dict> = {**<dict> [, ...]}
  445. ```
  446. ```python
  447. head, *body, tail = <collection>
  448. ```
  449. Inline
  450. ------
  451. ### Lambda
  452. ```python
  453. <function> = lambda: <return_value>
  454. <function> = lambda <argument_1>, <argument_2>: <return_value>
  455. ```
  456. ### Comprehension
  457. ```python
  458. <list> = [i+1 for i in range(10)] # [1, 2, ..., 10]
  459. <set> = {i for i in range(10) if i > 5} # {6, 7, 8, 9}
  460. <iter> = (i+5 for i in range(10)) # (5, 6, ..., 14)
  461. <dict> = {i: i*2 for i in range(10)} # {0: 0, 1: 2, ..., 9: 18}
  462. ```
  463. ```python
  464. out = [i+j for i in range(10) for j in range(10)]
  465. ```
  466. #### Is the same as:
  467. ```python
  468. out = []
  469. for i in range(10):
  470. for j in range(10):
  471. out.append(i+j)
  472. ```
  473. ### Map, Filter, Reduce
  474. ```python
  475. from functools import reduce
  476. <iter> = map(lambda x: x + 1, range(10)) # (1, 2, ..., 10)
  477. <iter> = filter(lambda x: x > 5, range(10)) # (6, 7, 8, 9)
  478. <int> = reduce(lambda out, x: out + x, range(10)) # 45
  479. ```
  480. ### Any, All
  481. ```python
  482. <bool> = any(<collection>) # False if empty.
  483. <bool> = all(el[1] for el in <collection>) # True if empty.
  484. ```
  485. ### If - Else
  486. ```python
  487. <expression_if_true> if <condition> else <expression_if_false>
  488. ```
  489. ```python
  490. >>> [a if a else 'zero' for a in (0, 1, 0, 3)]
  491. ['zero', 1, 'zero', 3]
  492. ```
  493. ### Namedtuple, Enum, Class
  494. ```python
  495. from collections import namedtuple
  496. Point = namedtuple('Point', 'x y')
  497. point = Point(0, 0)
  498. ```
  499. ```python
  500. from enum import Enum
  501. Direction = Enum('Direction', 'n e s w')
  502. Cutlery = Enum('Cutlery', {'fork': 1, 'knife': 2, 'spoon': 3})
  503. ```
  504. ```python
  505. # Warning: Objects will share the objects that are initialized in the dictionary!
  506. Creature = type('Creature', (), {'p': Point(0, 0), 'd': Direction.n})
  507. creature = Creature()
  508. ```
  509. Closure
  510. -------
  511. **We have a closure in Python when:**
  512. * **A nested function references a value of its enclosing function and then**
  513. * **the enclosing function returns the nested function.**
  514. ```python
  515. def get_multiplier(a):
  516. def out(b):
  517. return a * b
  518. return out
  519. ```
  520. ```python
  521. >>> multiply_by_3 = get_multiplier(3)
  522. >>> multiply_by_3(10)
  523. 30
  524. ```
  525. * **If multiple nested functions within enclosing function reference the same value, that value gets shared.**
  526. * **To dynamically access function's first free variable use `'<function>.__closure__[0].cell_contents'`.**
  527. ### Partial
  528. ```python
  529. from functools import partial
  530. <function> = partial(<function> [, <arg_1>, <arg_2>, ...])
  531. ```
  532. ```python
  533. >>> multiply_by_3 = partial(operator.mul, 3)
  534. >>> multiply_by_3(10)
  535. 30
  536. ```
  537. ### Nonlocal
  538. **If variable is being assigned to anywhere in the scope, it is regarded as a local variable, unless it is declared as a 'global' or 'nonlocal'.**
  539. ```python
  540. def get_counter():
  541. i = 0
  542. def out():
  543. nonlocal i
  544. i += 1
  545. return i
  546. return out
  547. ```
  548. ```python
  549. >>> counter = get_counter()
  550. >>> counter(), counter(), counter()
  551. (1, 2, 3)
  552. ```
  553. Decorator
  554. ---------
  555. **A decorator takes a function, adds some functionality and returns it.**
  556. ```python
  557. @decorator_name
  558. def function_that_gets_passed_to_decorator():
  559. ...
  560. ```
  561. ### Debugger Example
  562. **Decorator that prints function's name every time it gets called.**
  563. ```python
  564. from functools import wraps
  565. def debug(func):
  566. @wraps(func)
  567. def out(*args, **kwargs):
  568. print(func.__name__)
  569. return func(*args, **kwargs)
  570. return out
  571. @debug
  572. def add(x, y):
  573. return x + y
  574. ```
  575. * **Wraps is a helper decorator that copies metadata of function add() to function out().**
  576. * **Without it `'add.__name__'` would return `'out'`.**
  577. ### LRU Cache
  578. **Decorator that caches function's return values. All function's arguments must be hashable.**
  579. ```python
  580. from functools import lru_cache
  581. @lru_cache(maxsize=None)
  582. def fib(n):
  583. return n if n < 2 else fib(n-2) + fib(n-1)
  584. ```
  585. * **Recursion depth is limited to 1000 by default. To increase it use `'sys.setrecursionlimit(<depth>)'`.**
  586. ### Parametrized Decorator
  587. ```python
  588. from functools import wraps
  589. def debug(print_result=False):
  590. def decorator(func):
  591. @wraps(func)
  592. def out(*args, **kwargs):
  593. result = func(*args, **kwargs)
  594. print(func.__name__, result if print_result else '')
  595. return result
  596. return out
  597. return decorator
  598. @debug(print_result=True)
  599. def add(x, y):
  600. return x + y
  601. ```
  602. Class
  603. -----
  604. ```python
  605. class <name>:
  606. def __init__(self, a):
  607. self.a = a
  608. def __repr__(self):
  609. class_name = self.__class__.__name__
  610. return f'{class_name}({self.a!r})'
  611. def __str__(self):
  612. return str(self.a)
  613. @classmethod
  614. def get_class_name(cls):
  615. return cls.__name__
  616. ```
  617. ### Constructor Overloading
  618. ```python
  619. class <name>:
  620. def __init__(self, a=None):
  621. self.a = a
  622. ```
  623. ### Inheritance
  624. ```python
  625. class Person:
  626. def __init__(self, name, age):
  627. self.name = name
  628. self.age = age
  629. class Employee(Person):
  630. def __init__(self, name, age, staff_num):
  631. super().__init__(name, age)
  632. self.staff_num = staff_num
  633. ```
  634. ### Comparable
  635. * **If eq() method is not overridden, it returns `'id(self) == id(other)'`, which is the same as `'self is other'`.**
  636. * **That means all objects compare not equal by default.**
  637. ```python
  638. class MyComparable:
  639. def __init__(self, a):
  640. self.a = a
  641. def __eq__(self, other):
  642. if isinstance(other, type(self)):
  643. return self.a == other.a
  644. return False
  645. ```
  646. ### Hashable
  647. * **Hashable object needs both hash() and eq() methods and it's hash value should never change.**
  648. * **Hashable objects that compare equal must have the same hash value, meaning default hash() that returns `'id(self)'` will not do.**
  649. * **That is why Python automatically makes classes unhashable if you only implement eq().**
  650. ```python
  651. class MyHashable:
  652. def __init__(self, a):
  653. self.__a = copy.deepcopy(a)
  654. @property
  655. def a(self):
  656. return self.__a
  657. def __eq__(self, other):
  658. if isinstance(other, type(self)):
  659. return self.a == other.a
  660. return False
  661. def __hash__(self):
  662. return hash(self.a)
  663. ```
  664. ### Sequence
  665. * **Methods do not depend on each other, so they can be skipped if not needed.**
  666. * **Any object with defined getitem() is considered iterable, even if it lacks iter().**
  667. ```python
  668. class MySequence:
  669. def __init__(self, a):
  670. self.a = a
  671. def __len__(self):
  672. return len(self.a)
  673. def __getitem__(self, i):
  674. return self.a[i]
  675. def __iter__(self):
  676. for el in self.a:
  677. yield el
  678. ```
  679. ### Callable
  680. ```python
  681. class Counter:
  682. def __init__(self):
  683. self.i = 0
  684. def __call__(self):
  685. self.i += 1
  686. return self.i
  687. ```
  688. ```python
  689. >>> counter = Counter()
  690. >>> counter(), counter(), counter()
  691. (1, 2, 3)
  692. ```
  693. ### Withable
  694. ```python
  695. class MyOpen():
  696. def __init__(self, filename):
  697. self.filename = filename
  698. def __enter__(self):
  699. self.file = open(self.filename)
  700. return self.file
  701. def __exit__(self, *args):
  702. self.file.close()
  703. ```
  704. ```python
  705. >>> with open('test.txt', 'w') as file:
  706. ... file.write('Hello World!')
  707. >>> with MyOpen('test.txt') as file:
  708. ... print(file.read())
  709. Hello World!
  710. ```
  711. ### Copy
  712. ```python
  713. from copy import copy, deepcopy
  714. <object> = copy(<object>)
  715. <object> = deepcopy(<object>)
  716. ```
  717. Enum
  718. ----
  719. ```python
  720. from enum import Enum, auto
  721. class <enum_name>(Enum):
  722. <member_name_1> = <value_1>
  723. <member_name_2> = <value_2_a>, <value_2_b>
  724. <member_name_3> = auto()
  725. @classmethod
  726. def get_member_names(cls):
  727. return [a.name for a in cls.__members__.values()]
  728. ```
  729. ```python
  730. <member> = <enum>.<member_name>
  731. <member> = <enum>['<member_name>']
  732. <member> = <enum>(<value>)
  733. name = <member>.name
  734. value = <member>.value
  735. ```
  736. ```python
  737. list_of_members = list(<enum>)
  738. member_names = [a.name for a in <enum>]
  739. member_values = [a.value for a in <enum>]
  740. random_member = random.choice(list(<enum>))
  741. ```
  742. ### Inline
  743. ```python
  744. Cutlery = Enum('Cutlery', ['fork', 'knife', 'spoon'])
  745. Cutlery = Enum('Cutlery', 'fork knife spoon')
  746. Cutlery = Enum('Cutlery', {'fork': 1, 'knife': 2, 'spoon': 3})
  747. ```
  748. #### Functions can not be values, so they must be wrapped:
  749. ```python
  750. from functools import partial
  751. LogicOp = Enum('LogicOp', {'AND': partial(lambda l, r: l and r),
  752. 'OR' : partial(lambda l, r: l or r)})
  753. ```
  754. Exceptions
  755. ----------
  756. ```python
  757. while True:
  758. try:
  759. x = int(input('Please enter a number: '))
  760. except ValueError:
  761. print('Oops! That was no valid number. Try again...')
  762. else:
  763. print('Thank you.')
  764. break
  765. ```
  766. ### Raising Exception
  767. ```python
  768. raise ValueError('A very specific message!')
  769. ```
  770. ### Finally
  771. ```python
  772. >>> try:
  773. ... raise KeyboardInterrupt
  774. ... finally:
  775. ... print('Goodbye, world!')
  776. Goodbye, world!
  777. Traceback (most recent call last):
  778. File "<stdin>", line 2, in <module>
  779. KeyboardInterrupt
  780. ```
  781. Print
  782. -----
  783. ```python
  784. print(<el_1>, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
  785. ```
  786. * **Use `'file=sys.stderr'` for errors.**
  787. ### Pretty Print
  788. ```python
  789. >>> from pprint import pprint
  790. >>> pprint(dir())
  791. ['__annotations__',
  792. '__builtins__',
  793. '__doc__', ...]
  794. ```
  795. Input
  796. -----
  797. * **Reads a line from user input or pipe if present.**
  798. * **Trailing newline gets stripped.**
  799. * **Prompt string is printed to the standard output before reading input.**
  800. ```python
  801. <str> = input(prompt=None)
  802. ```
  803. #### Prints lines until EOF:
  804. ```python
  805. while True:
  806. try:
  807. print(input())
  808. except EOFError:
  809. break
  810. ```
  811. Command Line Arguments
  812. ----------------------
  813. ```python
  814. import sys
  815. script_name = sys.argv[0]
  816. arguments = sys.argv[1:]
  817. ```
  818. ### Argparse
  819. ```python
  820. from argparse import ArgumentParser, FileType
  821. p = ArgumentParser(description=<str>)
  822. p.add_argument('-<short_name>', '--<name>', action='store_true') # Flag
  823. p.add_argument('-<short_name>', '--<name>', type=<type>) # Option
  824. p.add_argument('<name>', type=<type>, nargs=1) # Argument
  825. p.add_argument('<name>', type=<type>, nargs='+') # Arguments
  826. args = p.parse_args()
  827. value = args.<name>
  828. ```
  829. * **Use `'help=<str>'` for argument description.**
  830. * **Use `'type=FileType(<mode>)'` for files.**
  831. Open
  832. ----
  833. **Opens file and returns a corresponding file object.**
  834. ```python
  835. <file> = open('<path>', mode='r', encoding=None)
  836. ```
  837. ### Modes
  838. * **`'r'` - Read (default).**
  839. * **`'w'` - Write (truncate).**
  840. * **`'x'` - Write or fail if the file already exists.**
  841. * **`'a'` - Append.**
  842. * **`'w+'` - Read and write (truncate).**
  843. * **`'r+'` - Read and write from the start.**
  844. * **`'a+'` - Read and write from the end.**
  845. * **`'t'` - Text mode (default).**
  846. * **`'b'` - Binary mode.**
  847. ### Seek
  848. ```python
  849. <file>.seek(0) # Move to the start of the file.
  850. <file>.seek(offset) # Move 'offset' chars/bytes from the start.
  851. <file>.seek(offset, <anchor>) # Anchor: 0 start, 1 current pos., 2 end.
  852. ```
  853. ### Read Text from File
  854. ```python
  855. def read_file(filename):
  856. with open(filename, encoding='utf-8') as file:
  857. return file.readlines()
  858. ```
  859. ### Write Text to File
  860. ```python
  861. def write_to_file(filename, text):
  862. with open(filename, 'w', encoding='utf-8') as file:
  863. file.write(text)
  864. ```
  865. Path
  866. ----
  867. ```python
  868. from os import path, listdir
  869. <bool> = path.exists('<path>')
  870. <bool> = path.isfile('<path>')
  871. <bool> = path.isdir('<path>')
  872. <list> = listdir('<path>')
  873. ```
  874. ```python
  875. >>> from glob import glob
  876. >>> glob('../*.gif')
  877. ['1.gif', 'card.gif']
  878. ```
  879. ### Pathlib
  880. ```python
  881. from pathlib import Path
  882. cwd = Path()
  883. <Path> = Path('<path>' [, '<path>', <Path>, ...])
  884. <Path> = <Path> / '<dir>' / '<file>'
  885. ```
  886. ```python
  887. <bool> = <Path>.exists()
  888. <bool> = <Path>.is_file()
  889. <bool> = <Path>.is_dir()
  890. <iter> = <Path>.iterdir()
  891. <iter> = <Path>.glob('<pattern>')
  892. ```
  893. ```python
  894. <str> = str(<Path>) # Returns path as string.
  895. <tup.> = <Path>.parts # Returns all components as strings.
  896. <Path> = <Path>.resolve() # Returns absolute path without symlinks.
  897. ```
  898. ```python
  899. <str> = <Path>.name # Final component.
  900. <str> = <Path>.stem # Final component without extension.
  901. <str> = <Path>.suffix # Final component's extension.
  902. <Path> = <Path>.parent # Path without final component.
  903. ```
  904. Command Execution
  905. -----------------
  906. ```python
  907. import os
  908. <str> = os.popen(<command>).read()
  909. ```
  910. ### Subprocess
  911. ```python
  912. >>> import subprocess
  913. >>> a = subprocess.run(['ls', '-a'], stdout=subprocess.PIPE)
  914. >>> a.stdout
  915. b'.\n..\nfile1.txt\nfile2.txt\n'
  916. >>> a.returncode
  917. 0
  918. ```
  919. CSV
  920. ---
  921. ```python
  922. import csv
  923. ```
  924. ### Read Rows from CSV File
  925. ```python
  926. def read_csv_file(filename):
  927. with open(filename, encoding='utf-8') as file:
  928. return csv.reader(file, delimiter=';')
  929. ```
  930. ### Write Rows to CSV File
  931. ```python
  932. def write_to_csv_file(filename, rows):
  933. with open(filename, 'w', encoding='utf-8') as file:
  934. writer = csv.writer(file, delimiter=';')
  935. writer.writerows(rows)
  936. ```
  937. JSON
  938. ----
  939. ```python
  940. import json
  941. <str> = json.dumps(<object>, ensure_ascii=True, indent=None)
  942. <object> = json.loads(<str>)
  943. ```
  944. #### To preserve order use:
  945. ```python
  946. from collections import OrderedDict
  947. <object> = json.loads(<str>, object_pairs_hook=OrderedDict)
  948. ```
  949. ### Read Object from JSON File
  950. ```python
  951. def read_json_file(filename):
  952. with open(filename, encoding='utf-8') as file:
  953. return json.load(file)
  954. ```
  955. ### Write Object to JSON File
  956. ```python
  957. def write_to_json_file(filename, an_object):
  958. with open(filename, 'w', encoding='utf-8') as file:
  959. json.dump(an_object, file, ensure_ascii=False, indent=2)
  960. ```
  961. Pickle
  962. ------
  963. ```python
  964. import pickle
  965. <bytes> = pickle.dumps(<object>)
  966. <object> = pickle.loads(<bytes>)
  967. ```
  968. ### Read Object from File
  969. ```python
  970. def read_pickle_file(filename):
  971. with open(filename, 'rb') as file:
  972. return pickle.load(file)
  973. ```
  974. ### Write Object to File
  975. ```python
  976. def write_to_pickle_file(filename, an_object):
  977. with open(filename, 'wb') as file:
  978. pickle.dump(an_object, file)
  979. ```
  980. SQLite
  981. ------
  982. ```python
  983. import sqlite3
  984. db = sqlite3.connect('<path>')
  985. ...
  986. db.close()
  987. ```
  988. ### Read
  989. ```python
  990. cursor = db.execute('<query>')
  991. if cursor:
  992. <tuple> = cursor.fetchone() # First row.
  993. <list> = cursor.fetchall() # Remaining rows.
  994. ```
  995. ### Write
  996. ```python
  997. db.execute('<query>')
  998. db.commit()
  999. ```
  1000. Bytes
  1001. -----
  1002. **Bytes object is immutable sequence of single bytes. Mutable version is called 'bytearray'.**
  1003. ```python
  1004. <bytes> = b'<str>'
  1005. <int> = <bytes>[<index>]
  1006. <bytes> = <bytes>[<slice>]
  1007. <ints> = list(<bytes>)
  1008. <bytes> = b''.join(<coll_of_bytes>)
  1009. ```
  1010. ### Encode
  1011. ```python
  1012. <bytes> = <str>.encode(encoding='utf-8')
  1013. <bytes> = <int>.to_bytes(<length>, byteorder='big|little', signed=False)
  1014. <bytes> = bytes.fromhex('<hex>')
  1015. ```
  1016. ### Decode
  1017. ```python
  1018. <str> = <bytes>.decode(encoding='utf-8')
  1019. <int> = int.from_bytes(<bytes>, byteorder='big|little', signed=False)
  1020. <hex> = <bytes>.hex()
  1021. ```
  1022. ### Read Bytes from File
  1023. ```python
  1024. def read_bytes(filename):
  1025. with open(filename, 'rb') as file:
  1026. return file.read()
  1027. ```
  1028. ### Write Bytes to File
  1029. ```python
  1030. def write_bytes(filename, bytes_obj):
  1031. with open(filename, 'wb') as file:
  1032. file.write(bytes_obj)
  1033. ```
  1034. Struct
  1035. ------
  1036. * **Module that performs conversions between Python values and a C struct, represented as a Python bytes object.**
  1037. * **Machine’s native type sizes and byte order are used by default.**
  1038. ```python
  1039. from struct import pack, unpack, iter_unpack, calcsize
  1040. <bytes> = pack('<format>', <value_1> [, <value_2>, ...])
  1041. <tuple> = unpack('<format>', <bytes>)
  1042. <tuples> = iter_unpack('<format>', <bytes>)
  1043. ```
  1044. ### Example
  1045. ```python
  1046. >>> pack('>hhl', 1, 2, 3)
  1047. b'\x00\x01\x00\x02\x00\x00\x00\x03'
  1048. >>> unpack('>hhl', b'\x00\x01\x00\x02\x00\x00\x00\x03')
  1049. (1, 2, 3)
  1050. >>> calcsize('>hhl')
  1051. 8
  1052. ```
  1053. ### Format
  1054. #### For standard sizes start format string with:
  1055. * **`'='` - native byte order**
  1056. * **`'<'` - little-endian**
  1057. * **`'>'` - big-endian**
  1058. #### Use capital letter for unsigned type. Standard sizes are in brackets:
  1059. * **`'x'` - pad byte**
  1060. * **`'c'` - char (1)**
  1061. * **`'h'` - short (2)**
  1062. * **`'i'` - int (4)**
  1063. * **`'l'` - long (4)**
  1064. * **`'q'` - long long (8)**
  1065. * **`'f'` - float (4)**
  1066. * **`'d'` - double (8)**
  1067. Array
  1068. -----
  1069. **List that can hold only elements of predefined type. Available types are listed above.**
  1070. ```python
  1071. from array import array
  1072. <array> = array('<typecode>' [, <collection>])
  1073. ```
  1074. Memory View
  1075. -----------
  1076. **Used for accessing the internal data of an object that supports the buffer protocol.**
  1077. ```python
  1078. <memoryview> = memoryview(<bytes> / <bytearray> / <array>)
  1079. <memoryview>.release()
  1080. ```
  1081. Deque
  1082. -----
  1083. **Thread-safe list with efficient appends and pops from either side. Pronounced "deck".**
  1084. ```python
  1085. from collections import deque
  1086. <deque> = deque(<collection>, maxlen=None)
  1087. ```
  1088. ```python
  1089. <deque>.appendleft(<el>)
  1090. <el> = <deque>.popleft()
  1091. ```
  1092. ```python
  1093. <deque>.extendleft(<collection>) # Collection gets reversed.
  1094. <deque>.rotate(n=1) # Rotates elements to the right.
  1095. ```
  1096. Threading
  1097. ---------
  1098. ```python
  1099. from threading import Thread, RLock
  1100. ```
  1101. ### Thread
  1102. ```python
  1103. thread = Thread(target=<function>, args=(<first_arg>, ))
  1104. thread.start()
  1105. ...
  1106. thread.join()
  1107. ```
  1108. ### Lock
  1109. ```python
  1110. lock = RLock()
  1111. lock.acquire()
  1112. ...
  1113. lock.release()
  1114. ```
  1115. Introspection
  1116. -------------
  1117. **Inspecting code at runtime.**
  1118. ### Variables
  1119. ```python
  1120. <list> = dir() # Names of in-scope variables.
  1121. <dict> = locals() # Dict of local variables. Also vars().
  1122. <dict> = globals() # Dict of global variables.
  1123. ```
  1124. ### Attributes
  1125. ```python
  1126. <dict> = vars(<object>)
  1127. <bool> = hasattr(<object>, '<attr_name>')
  1128. value = getattr(<object>, '<attr_name>')
  1129. setattr(<object>, '<attr_name>', value)
  1130. ```
  1131. ### Parameters
  1132. ```python
  1133. from inspect import signature
  1134. sig = signature(<function>)
  1135. no_of_params = len(sig.parameters)
  1136. param_names = list(sig.parameters.keys())
  1137. ```
  1138. Metaprograming
  1139. --------------
  1140. **Code that generates code.**
  1141. ### Type
  1142. **Type is the root class. If only passed the object it returns it's type (class). Otherwise it creates a new class.**
  1143. ```python
  1144. <class> = type(<class_name>, <parents_tuple>, <attributes_dict>)
  1145. ```
  1146. ```python
  1147. >>> Z = type('Z', (), {'a': 'abcde', 'b': 12345})
  1148. >>> z = Z()
  1149. ```
  1150. ### Meta Class
  1151. **Class that creates class.**
  1152. ```python
  1153. def my_meta_class(name, parents, attrs):
  1154. attrs['a'] = 'abcde'
  1155. return type(name, parents, attrs)
  1156. ```
  1157. #### Or:
  1158. ```python
  1159. class MyMetaClass(type):
  1160. def __new__(cls, name, parents, attrs):
  1161. attrs['a'] = 'abcde'
  1162. return type.__new__(cls, name, parents, attrs)
  1163. ```
  1164. ### Metaclass Attribute
  1165. **When class is created it checks if it has metaclass defined. If not, it recursively checks if any of his parents has it defined and eventually comes to type.**
  1166. ```python
  1167. class MyClass(metaclass=MyMetaClass):
  1168. b = 12345
  1169. ```
  1170. ```python
  1171. >>> MyClass.a, MyClass.b
  1172. ('abcde', 12345)
  1173. ```
  1174. Operator
  1175. --------
  1176. ```python
  1177. from operator import add, sub, mul, truediv, floordiv, mod, pow, neg, abs
  1178. from operator import eq, ne, lt, le, gt, ge
  1179. from operator import not_, and_, or_
  1180. from operator import itemgetter, attrgetter, methodcaller
  1181. ```
  1182. ```python
  1183. import operator as op
  1184. product_of_elems = functools.reduce(op.mul, <collection>)
  1185. sorted_by_second = sorted(<collection>, key=op.itemgetter(1))
  1186. sorted_by_both = sorted(<collection>, key=op.itemgetter(1, 0))
  1187. LogicOp = enum.Enum('LogicOp', {'AND': op.and_, 'OR' : op.or_})
  1188. last_el = op.methodcaller('pop')(<list>)
  1189. ```
  1190. Eval
  1191. ----
  1192. ### Basic
  1193. ```python
  1194. >>> from ast import literal_eval
  1195. >>> literal_eval('1 + 2')
  1196. 3
  1197. >>> literal_eval('[1, 2, 3]')
  1198. [1, 2, 3]
  1199. >>> literal_eval('abs(1)')
  1200. ValueError: malformed node or string
  1201. ```
  1202. ### Using Abstract Syntax Trees
  1203. ```python
  1204. import ast
  1205. from ast import Num, BinOp, UnaryOp
  1206. import operator as op
  1207. LEGAL_OPERATORS = {ast.Add: op.add, # <el> + <el>
  1208. ast.Sub: op.sub, # <el> - <el>
  1209. ast.Mult: op.mul, # <el> * <el>
  1210. ast.Div: op.truediv, # <el> / <el>
  1211. ast.Pow: op.pow, # <el> ** <el>
  1212. ast.BitXor: op.xor, # <el> ^ <el>
  1213. ast.USub: op.neg} # - <el>
  1214. def evaluate(expression):
  1215. root = ast.parse(expression, mode='eval')
  1216. return eval_node(root.body)
  1217. def eval_node(node):
  1218. node_type = type(node)
  1219. if node_type == Num:
  1220. return node.n
  1221. if node_type not in [BinOp, UnaryOp]:
  1222. raise TypeError(node)
  1223. operator_type = type(node.op)
  1224. if operator_type not in LEGAL_OPERATORS:
  1225. raise TypeError(f'Illegal operator {node.op}')
  1226. operator = LEGAL_OPERATORS[operator_type]
  1227. if node_type == BinOp:
  1228. left, right = eval_node(node.left), eval_node(node.right)
  1229. return operator(left, right)
  1230. elif node_type == UnaryOp:
  1231. operand = eval_node(node.operand)
  1232. return operator(operand)
  1233. ```
  1234. ```python
  1235. >>> evaluate('2 ^ 6')
  1236. 4
  1237. >>> evaluate('2 ** 6')
  1238. 64
  1239. >>> evaluate('1 + 2 * 3 ** (4 ^ 5) / (6 + -7)')
  1240. -5.0
  1241. ```
  1242. Coroutine
  1243. ---------
  1244. * **Similar to generator, but generator pulls data through the pipe with iteration, while coroutine pushes data into the pipeline with send().**
  1245. * **Coroutines provide more powerful data routing possibilities than iterators.**
  1246. * **If you built a collection of simple data processing components, you can glue them together into complex arrangements of pipes, branches, merging, etc.**
  1247. ### Helper Decorator
  1248. * **All coroutines must be "primed" by first calling next().**
  1249. * **Remembering to call next() is easy to forget.**
  1250. * **Solved by wrapping coroutines with a decorator:**
  1251. ```python
  1252. def coroutine(func):
  1253. def out(*args, **kwargs):
  1254. cr = func(*args, **kwargs)
  1255. next(cr)
  1256. return cr
  1257. return out
  1258. ```
  1259. ### Pipeline Example
  1260. ```python
  1261. def reader(target):
  1262. for i in range(10):
  1263. target.send(i)
  1264. target.close()
  1265. @coroutine
  1266. def adder(target):
  1267. while True:
  1268. item = (yield)
  1269. target.send(item + 100)
  1270. @coroutine
  1271. def printer():
  1272. while True:
  1273. item = (yield)
  1274. print(item)
  1275. reader(adder(printer())) # 100, 101, ..., 109
  1276. ```
  1277. <br><br>
  1278. Libraries
  1279. =========
  1280. Progress Bar
  1281. ------------
  1282. ```python
  1283. # $ pip3 install tqdm
  1284. from tqdm import tqdm
  1285. from time import sleep
  1286. for i in tqdm([1, 2, 3]):
  1287. sleep(0.2)
  1288. for i in tqdm(range(100)):
  1289. sleep(0.02)
  1290. ```
  1291. Plot
  1292. ----
  1293. ```python
  1294. # $ pip3 install matplotlib
  1295. from matplotlib import pyplot
  1296. pyplot.plot(<data_1> [, <data_2>, ...])
  1297. pyplot.savefig(<filename>, transparent=True)
  1298. pyplot.show()
  1299. ```
  1300. Table
  1301. -----
  1302. #### Prints CSV file as ASCII table:
  1303. ```python
  1304. # $ pip3 install tabulate
  1305. from tabulate import tabulate
  1306. import csv
  1307. with open(<filename>, encoding='utf-8') as file:
  1308. lines = csv.reader(file, delimiter=';')
  1309. headers = [header.title() for header in next(lines)]
  1310. table = tabulate(lines, headers)
  1311. print(table)
  1312. ```
  1313. Curses
  1314. ------
  1315. ```python
  1316. # $ pip3 install curses
  1317. from curses import wrapper
  1318. def main():
  1319. wrapper(draw)
  1320. def draw(screen):
  1321. screen.clear()
  1322. screen.addstr(0, 0, 'Press ESC to quit.')
  1323. while screen.getch() != 27:
  1324. pass
  1325. def get_border(screen):
  1326. from collections import namedtuple
  1327. P = namedtuple('P', 'x y')
  1328. height, width = screen.getmaxyx()
  1329. return P(width-1, height-1)
  1330. ```
  1331. Scraping
  1332. --------
  1333. ```python
  1334. # $ pip3 install requests beautifulsoup4
  1335. >>> import requests
  1336. >>> from bs4 import BeautifulSoup
  1337. >>> url = 'https://en.wikipedia.org/wiki/Python_(programming_language)'
  1338. >>> page = requests.get(url)
  1339. >>> doc = BeautifulSoup(page.text, 'html.parser')
  1340. >>> table = doc.find('table', class_='infobox vevent')
  1341. >>> rows = table.find_all('tr')
  1342. >>> link = rows[11].find('a')['href']
  1343. >>> ver = rows[6].find('div').text.split()[0]
  1344. >>> link, ver
  1345. ('https://www.python.org/', '3.7.2')
  1346. ```
  1347. Web
  1348. ---
  1349. ```python
  1350. # $ pip3 install bottle
  1351. from bottle import run, route, post, template, request, response
  1352. import json
  1353. ```
  1354. ### Run
  1355. ```python
  1356. run(host='localhost', port=8080)
  1357. run(host='0.0.0.0', port=80, server='cherrypy')
  1358. ```
  1359. ### Static Request
  1360. ```python
  1361. @route('/img/<image>')
  1362. def send_image(image):
  1363. return static_file(image, 'images/', mimetype='image/png')
  1364. ```
  1365. ### Dynamic Request
  1366. ```python
  1367. @route('/<sport>')
  1368. def send_page(sport):
  1369. return template('<h1>{{title}}</h1>', title=sport)
  1370. ```
  1371. ### REST Request
  1372. ```python
  1373. @post('/odds/<sport>')
  1374. def odds_handler(sport):
  1375. team = request.forms.get('team')
  1376. home_odds, away_odds = 2.44, 3.29
  1377. response.headers['Content-Type'] = 'application/json'
  1378. response.headers['Cache-Control'] = 'no-cache'
  1379. return json.dumps([team, home_odds, away_odds])
  1380. ```
  1381. #### Test:
  1382. ```python
  1383. # $ pip3 install requests
  1384. >>> import requests
  1385. >>> url = 'http://localhost:8080/odds/football'
  1386. >>> data = {'team': 'arsenal f.c.'}
  1387. >>> response = requests.post(url, data=data)
  1388. >>> response.json()
  1389. ['arsenal f.c.', 2.44, 3.29]
  1390. ```
  1391. Profile
  1392. -------
  1393. ### Basic
  1394. ```python
  1395. from time import time
  1396. start_time = time() # Seconds since Epoch.
  1397. ...
  1398. duration = time() - start_time
  1399. ```
  1400. ### High Performance
  1401. ```python
  1402. from time import perf_counter as pc
  1403. start_time = pc() # Seconds since restart.
  1404. ...
  1405. duration = pc() - start_time
  1406. ```
  1407. ### Timing a Snippet
  1408. ```python
  1409. from timeit import timeit
  1410. timeit('"-".join(str(a) for a in range(100))',
  1411. number=10000, globals=globals(), setup='pass')
  1412. ```
  1413. ### Line Profiler
  1414. ```python
  1415. # $ pip3 install line_profiler
  1416. @profile
  1417. def main():
  1418. a = [*range(10000)]
  1419. b = {*range(10000)}
  1420. main()
  1421. ```
  1422. #### Usage:
  1423. ```text
  1424. $ kernprof -lv test.py
  1425. Line # Hits Time Per Hit % Time Line Contents
  1426. ==============================================================
  1427. 1 @profile
  1428. 2 def main():
  1429. 3 1 1128.0 1128.0 27.4 a = [*range(10000)]
  1430. 4 1 2994.0 2994.0 72.6 b = {*range(10000)}
  1431. ```
  1432. ### Call Graph
  1433. #### Generates a PNG image of a call graph with highlighted bottlenecks:
  1434. ```python
  1435. # $ pip3 install pycallgraph
  1436. from pycallgraph import output, PyCallGraph
  1437. from datetime import datetime
  1438. time_str = datetime.now().strftime('%Y%m%d%H%M%S')
  1439. filename = f'profile-{time_str}.png'
  1440. drawer = output.GraphvizOutput(output_file=filename)
  1441. with PyCallGraph(output=drawer):
  1442. <code_to_be_profiled>
  1443. ```
  1444. NumPy
  1445. -----
  1446. **Array manipulation mini language. Can run up to one hundred times faster than equivalent Python code.**
  1447. ```python
  1448. # $ pip3 install numpy
  1449. import numpy as np
  1450. ```
  1451. ```python
  1452. <array> = np.array(<list>)
  1453. <array> = np.arange(from_inclusive, to_exclusive, step_size)
  1454. <array> = np.ones(<shape>)
  1455. <array> = np.random.randint(from_inclusive, to_exclusive, <shape>)
  1456. ```
  1457. ```python
  1458. <array>.shape = <shape>
  1459. <view> = <array>.reshape(<shape>)
  1460. <view> = np.broadcast_to(<array>, <shape>)
  1461. ```
  1462. ```python
  1463. <array> = <array>.sum(axis=None)
  1464. indexes = <array>.argmin(axis=None)
  1465. ```
  1466. * **Shape is a tuple of dimension sizes.**
  1467. * **Axis is an index of dimension that gets collapsed. Leftmost dimension has index 0.**
  1468. ### Indexing
  1469. ```bash
  1470. <el> = <2d_array>[0, 0] # First element.
  1471. <1d_view> = <2d_array>[0] # First row.
  1472. <1d_view> = <2d_array>[:, 0] # First column. Also [..., 0].
  1473. <3d_view> = <2d_array>[None, :, :] # Expanded by dimension of size 1.
  1474. ```
  1475. ```bash
  1476. <1d_array> = <2d_array>[<1d_row_indexes>, <1d_column_indexes>]
  1477. <2d_array> = <2d_array>[<2d_row_indexes>, <2d_column_indexes>]
  1478. ```
  1479. ```bash
  1480. <2d_bools> = <2d_array> > 0
  1481. <1d_array> = <2d_array>[<2d_bools>]
  1482. ```
  1483. * **If row and column indexes differ in shape, they are combined with broadcasting.**
  1484. ### Broadcasting
  1485. **Broadcasting is a set of rules by which NumPy functions operate on arrays of different sizes and/or dimensions.**
  1486. ```python
  1487. left = [[0.1], [0.6], [0.8]] # Shape: (3, 1)
  1488. right = [ 0.1 , 0.6 , 0.8 ] # Shape: (3)
  1489. ```
  1490. #### 1. If array shapes differ in length, left-pad the smaller shape with ones:
  1491. ```python
  1492. left = [[0.1], [0.6], [0.8]] # Shape: (3, 1)
  1493. right = [[0.1 , 0.6 , 0.8]] # Shape: (1, 3) <- !
  1494. ```
  1495. #### 2. If any dimensions differ in size, expand the ones that have size 1 by duplicating their elements:
  1496. ```python
  1497. left = [[0.1, 0.1, 0.1], [0.6, 0.6, 0.6], [0.8, 0.8, 0.8]] # Shape: (3, 3) <- !
  1498. right = [[0.1, 0.6, 0.8], [0.1, 0.6, 0.8], [0.1, 0.6, 0.8]] # Shape: (3, 3) <- !
  1499. ```
  1500. #### 3. If neither non-matching dimension has size 1, rise an error.
  1501. ### Example
  1502. #### For each point returns index of its nearest point (`[0.1, 0.6, 0.8] => [1, 2, 1]`):
  1503. ```python
  1504. >>> points = np.array([0.1, 0.6, 0.8])
  1505. [ 0.1, 0.6, 0.8]
  1506. >>> wrapped_points = points.reshape(3, 1)
  1507. [[ 0.1],
  1508. [ 0.6],
  1509. [ 0.8]]
  1510. >>> distances = wrapped_points - points
  1511. [[ 0. , -0.5, -0.7],
  1512. [ 0.5, 0. , -0.2],
  1513. [ 0.7, 0.2, 0. ]]
  1514. >>> distances = np.abs(distances)
  1515. [[ 0. , 0.5, 0.7],
  1516. [ 0.5, 0. , 0.2],
  1517. [ 0.7, 0.2, 0. ]]
  1518. >>> i = np.arange(3)
  1519. [0, 1, 2]
  1520. >>> distances[i, i] = np.inf
  1521. [[ inf, 0.5, 0.7],
  1522. [ 0.5, inf, 0.2],
  1523. [ 0.7, 0.2, inf]]
  1524. >>> distances.argmin(1)
  1525. [1, 2, 1]
  1526. ```
  1527. Image
  1528. -----
  1529. ```python
  1530. # $ pip3 install pillow
  1531. from PIL import Image
  1532. ```
  1533. #### Creates PNG image of rainbow gradient:
  1534. ```python
  1535. width = 100
  1536. height = 100
  1537. size = width * height
  1538. pixels = [255 * i/size for i in range(size)]
  1539. img = Image.new('HSV', (width, height))
  1540. img.putdata([(int(a), 255, 255) for a in pixels])
  1541. img.convert(mode='RGB').save('test.png')
  1542. ```
  1543. #### Adds noise to a PNG image:
  1544. ```python
  1545. from random import randint
  1546. add_noise = lambda value: max(0, min(255, value + randint(-20, 20)))
  1547. img = Image.open('test.png').convert(mode='HSV')
  1548. img.putdata([(add_noise(h), s, v) for h, s, v in img.getdata()])
  1549. img.convert(mode='RGB').save('test.png')
  1550. ```
  1551. ### Modes
  1552. * **`'1'` - 1-bit pixels, black and white, stored with one pixel per byte.**
  1553. * **`'L'` - 8-bit pixels, greyscale.**
  1554. * **`'RGB'` - 3x8-bit pixels, true color.**
  1555. * **`'RGBA'` - 4x8-bit pixels, true color with transparency mask.**
  1556. * **`'HSV'` - 3x8-bit pixels, Hue, Saturation, Value color space.**
  1557. Audio
  1558. -----
  1559. ```python
  1560. import wave
  1561. from struct import pack, iter_unpack
  1562. ```
  1563. ### Read Frames from WAV File
  1564. ```python
  1565. def read_wav_file(filename):
  1566. with wave.open(filename, 'rb') as wf:
  1567. frames = wf.readframes(wf.getnframes())
  1568. return [a[0] for a in iter_unpack('<h', frames)]
  1569. ```
  1570. ### Write Frames to WAV File
  1571. ```python
  1572. def write_to_wav_file(filename, frames_int, mono=True):
  1573. frames_short = (pack('<h', a) for a in frames_int)
  1574. with wave.open(filename, 'wb') as wf:
  1575. wf.setnchannels(1 if mono else 2)
  1576. wf.setsampwidth(2)
  1577. wf.setframerate(44100)
  1578. wf.writeframes(b''.join(frames_short))
  1579. ```
  1580. ### Examples
  1581. #### Saves a sine wave to a mono WAV file:
  1582. ```python
  1583. from math import pi, sin
  1584. frames_f = (sin(i * 2 * pi * 440 / 44100) for i in range(100000))
  1585. frames_i = (int(a * 30000) for a in frames_f)
  1586. write_to_wav_file('test.wav', frames_i)
  1587. ```
  1588. #### Adds noise to a mono WAV file:
  1589. ```python
  1590. from random import randint
  1591. add_noise = lambda value: max(-32768, min(32767, value + randint(-500, 500)))
  1592. frames_i = (add_noise(a) for a in read_wav_file('test.wav'))
  1593. write_to_wav_file('test.wav', frames_i)
  1594. ```
  1595. #### Plays Popcorn:
  1596. ```python
  1597. # $ pip3 install simpleaudio
  1598. import simpleaudio, math, struct
  1599. from itertools import chain, repeat
  1600. F = 44100
  1601. P1 = '71♪,69,,71♪,66,,62♪,66,,59♪,,,'
  1602. P2 = '71♪,73,,74♪,73,,74,,71,,73♪,71,,73,,69,,71♪,69,,71,,67,,71♪,,,'
  1603. get_pause = lambda seconds: repeat(0, int(seconds * F))
  1604. sin_f = lambda i, hz: math.sin(i * 2 * math.pi * hz / F)
  1605. get_wave = lambda hz, seconds: (sin_f(i, hz) for i in range(int(seconds * F)))
  1606. get_hz = lambda key: 8.176 * 2 ** (int(key) / 12)
  1607. parse_n = lambda note: (get_hz(note[:2]), 0.25 if '♪' in note else 0.125)
  1608. get_note = lambda note: get_wave(*parse_n(note)) if note else get_pause(0.125)
  1609. frames_i = chain.from_iterable(get_note(n) for n in f'{P1}{P1}{P2}'.split(','))
  1610. frames_b = b''.join(struct.pack('<h', int(a * 30000)) for a in frames_i)
  1611. simpleaudio.play_buffer(frames_b, 1, 2, F)
  1612. ```
  1613. Basic Script Template
  1614. ---------------------
  1615. ```python
  1616. #!/usr/bin/env python3
  1617. #
  1618. # Usage: .py
  1619. #
  1620. from collections import namedtuple
  1621. from enum import Enum
  1622. import re
  1623. import sys
  1624. def main():
  1625. pass
  1626. ###
  1627. ## UTIL
  1628. #
  1629. def read_file(filename):
  1630. with open(filename, encoding='utf-8') as file:
  1631. return file.readlines()
  1632. if __name__ == '__main__':
  1633. main()
  1634. ```