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.

2083 lines
49 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
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
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
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
6 years ago
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
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
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
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
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
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
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
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
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
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
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
  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(<coll.>, <coll.>, ...) # 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(<collection>) # 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 letters 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. {'abcde':.3} # 'abc'
  283. {'abcde':10.3} # 'abc '
  284. ```
  285. ### Float Options
  286. ```python
  287. {1.23456:.3f} # '1.235'
  288. {1.23456:10.3f} # ' 1.235'
  289. {1.23456:10.3e} # ' 1.235e+00'
  290. {1.23456:10.3%} # ' 123.456%'
  291. ```
  292. ### Int Options
  293. ```python
  294. { 123456:10,} # ' 123,456'
  295. { 123456:10_} # ' 123_456'
  296. { 123456:+10} # ' +123456'
  297. {-123456:=10} # '- 123456'
  298. { 123456: } # ' 123456'
  299. {-123456: } # '-123456'
  300. ```
  301. ```python
  302. {90:c} # 'Z'
  303. {90:X} # '5A'
  304. {3:08b} # '00000011'
  305. ```
  306. Numbers
  307. -------
  308. ### Basic Functions
  309. ```python
  310. <num> = pow(<num>, <num>) # Or: <num> ** <num>
  311. <real> = abs(<num>)
  312. <int> = round(<real>)
  313. <real> = round(<real>, ±ndigits)
  314. ```
  315. ### Math
  316. ```python
  317. from math import e, pi
  318. from math import cos, acos, sin, asin, tan, atan, degrees, radians
  319. from math import log, log10, log2
  320. from math import inf, nan, isinf, isnan
  321. ```
  322. ### Statistics
  323. ```python
  324. from statistics import mean, median, variance, pvariance, pstdev
  325. ```
  326. ### Random
  327. ```python
  328. from random import random, randint, choice, shuffle
  329. <float> = random()
  330. <int> = randint(from_inclusive, to_inclusive)
  331. <el> = choice(<list>)
  332. shuffle(<list>)
  333. ```
  334. Combinatorics
  335. -------------
  336. * **Every function returns an iterator.**
  337. * **If you want to print the iterator, you need to pass it to the list() function!**
  338. ```python
  339. from itertools import product, combinations, combinations_with_replacement, permutations
  340. ```
  341. ```python
  342. >>> product([0, 1], repeat=3)
  343. [(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1),
  344. (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
  345. ```
  346. ```python
  347. >>> product('ab', '12')
  348. [('a', '1'), ('a', '2'),
  349. ('b', '1'), ('b', '2')]
  350. ```
  351. ```python
  352. >>> combinations('abc', 2)
  353. [('a', 'b'), ('a', 'c'), ('b', 'c')]
  354. ```
  355. ```python
  356. >>> combinations_with_replacement('abc', 2)
  357. [('a', 'a'), ('a', 'b'), ('a', 'c'),
  358. ('b', 'b'), ('b', 'c'),
  359. ('c', 'c')]
  360. ```
  361. ```python
  362. >>> permutations('abc', 2)
  363. [('a', 'b'), ('a', 'c'),
  364. ('b', 'a'), ('b', 'c'),
  365. ('c', 'a'), ('c', 'b')]
  366. ```
  367. Datetime
  368. --------
  369. * **Module 'datetime' provides 'date' `<D>`, 'time' `<T>`, 'datetime' `<DT>` and 'timedelta' `<TD>` classes. All are immutable and hashable.**
  370. * **Time and datetime can be 'aware' `<a>`, meaning they have defined timezone, or 'naive' `<n>`, meaning they don't.**
  371. * **If object is naive it is presumed to be in system's timezone.**
  372. ```python
  373. from datetime import date, time, datetime, timedelta
  374. from dateutil.tz import UTC, tzlocal, gettz
  375. ```
  376. ### Constructors
  377. ```python
  378. <D> = date(year, month, day)
  379. <T> = time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, fold=0)
  380. <DT> = datetime(year, month, day, hour=0, minute=0, second=0, ...)
  381. <TD> = timedelta(days=0, seconds=0, microseconds=0, milliseconds=0,
  382. minutes=0, hours=0, weeks=0)
  383. ```
  384. * **Use `'<D/DT>.weekday()'` to get the day of the week (Mon == 0).**
  385. * **`'fold=1'` means second pass in case of time jumping back for one hour.**
  386. ### Now
  387. ```python
  388. <D/DTn> = D/DT.today() # Current local date or naive datetime.
  389. <DTn> = DT.utcnow() # Naive datetime from current UTC time.
  390. <DTa> = DT.now(<tz>) # Aware datetime from current tz time.
  391. ```
  392. ### Timezone
  393. ```python
  394. <tz> = UTC # UTC timezone.
  395. <tz> = tzlocal() # Local timezone.
  396. <tz> = gettz('<Cont.>/<City>') # Timezone from 'Continent/City_Name' str.
  397. ```
  398. ```python
  399. <DTa> = <DT>.astimezone(<tz>) # Datetime, converted to passed timezone.
  400. <Ta/DTa> = <T/DT>.replace(tzinfo=<tz>) # Unconverted object with new timezone.
  401. ```
  402. ### Encode
  403. ```python
  404. <D/T/DT> = D/T/DT.fromisoformat('<iso>') # Object from ISO string.
  405. <DT> = DT.strptime(<str>, '<format>') # Datetime from str, according to format.
  406. <D/DTn> = D/DT.fromordinal(<int>) # D/DTn from days since Christ.
  407. <DTa> = DT.fromtimestamp(<real>, <tz>) # DTa from seconds since Epoch in tz time.
  408. ```
  409. * **ISO strings come in following forms: `'YYYY-MM-DD'`, `'HH:MM:SS.ffffff[±<offset>]'`, or both separated by `'T'`.**
  410. * **On Unix systems Epoch is `'1970-01-01 00:00 UTC'`, `'1970-01-01 01:00 CET'`, ...**
  411. ### Decode
  412. ```python
  413. <str> = <D/T/DT>.isoformat() # ISO string representation.
  414. <str> = <D/T/DT>.strftime('<format>') # Custom string representation.
  415. <int> = <D/DT>.toordinal() # Days since Christ, ignoring time and tz.
  416. <float> = <DT>.timestamp() # Seconds since Epoch in local time or tz.
  417. ```
  418. ### Format
  419. ```python
  420. >>> dt = datetime.strptime('2015-05-14 23:39:00.00 +0200', '%Y-%m-%d %H:%M:%S.%f %z')
  421. >>> dt.strftime("%A %dth %B '%y, %I:%M%p %Z")
  422. "Thursday 14th May '15, 11:39PM UTC+02:00"
  423. ```
  424. #### Rest of the codes:
  425. * **`'a'` - Weekday, abbreviated name.**
  426. * **`'b'` - Month, abbreviated name.**
  427. Arguments
  428. ---------
  429. ### Inside Function Call
  430. ```python
  431. <function>(<positional_args>) # f(0, 0)
  432. <function>(<keyword_args>) # f(x=0, y=0)
  433. <function>(<positional_args>, <keyword_args>) # f(0, y=0)
  434. ```
  435. ### Inside Function Definition
  436. ```python
  437. def f(<nondefault_args>): # def f(x, y)
  438. def f(<default_args>): # def f(x=0, y=0)
  439. def f(<nondefault_args>, <default_args>): # def f(x, y=0)
  440. ```
  441. Splat Operator
  442. --------------
  443. ### Inside Function Call
  444. **Splat expands a collection into positional arguments, while splatty-splat expands a dictionary into keyword arguments.**
  445. ```python
  446. args = (1, 2)
  447. kwargs = {'x': 3, 'y': 4, 'z': 5}
  448. func(*args, **kwargs)
  449. ```
  450. #### Is the same as:
  451. ```python
  452. func(1, 2, x=3, y=4, z=5)
  453. ```
  454. ### Inside Function Definition
  455. **Splat combines zero or more positional arguments into a tuple, while splatty-splat combines zero or more keyword arguments into a dictionary.**
  456. ```python
  457. def add(*a):
  458. return sum(a)
  459. ```
  460. ```python
  461. >>> add(1, 2, 3)
  462. 6
  463. ```
  464. #### Legal argument combinations:
  465. ```python
  466. def f(*args): # f(1, 2, 3)
  467. def f(x, *args): # f(1, 2, 3)
  468. def f(*args, z): # f(1, 2, z=3)
  469. def f(x, *args, z): # f(1, 2, z=3)
  470. ```
  471. ```python
  472. def f(**kwargs): # f(x=1, y=2, z=3)
  473. def f(x, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3)
  474. ```
  475. ```python
  476. 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)
  477. 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)
  478. def f(*args, y, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3)
  479. def f(x, *args, z, **kwargs): # f(x=1, y=2, z=3) | f(1, y=2, z=3) | f(1, 2, z=3)
  480. ```
  481. ### Other Uses
  482. ```python
  483. <list> = [*<collection> [, ...]]
  484. <set> = {*<collection> [, ...]}
  485. <tuple> = (*<collection>, [...])
  486. <dict> = {**<dict> [, ...]}
  487. ```
  488. ```python
  489. head, *body, tail = <collection>
  490. ```
  491. Inline
  492. ------
  493. ### Lambda
  494. ```python
  495. <function> = lambda: <return_value>
  496. <function> = lambda <argument_1>, <argument_2>: <return_value>
  497. ```
  498. ### Comprehension
  499. ```python
  500. <list> = [i+1 for i in range(10)] # [1, 2, ..., 10]
  501. <set> = {i for i in range(10) if i > 5} # {6, 7, 8, 9}
  502. <iter> = (i+5 for i in range(10)) # (5, 6, ..., 14)
  503. <dict> = {i: i*2 for i in range(10)} # {0: 0, 1: 2, ..., 9: 18}
  504. ```
  505. ```python
  506. out = [i+j for i in range(10) for j in range(10)]
  507. ```
  508. #### Is the same as:
  509. ```python
  510. out = []
  511. for i in range(10):
  512. for j in range(10):
  513. out.append(i+j)
  514. ```
  515. ### Map, Filter, Reduce
  516. ```python
  517. from functools import reduce
  518. <iter> = map(lambda x: x + 1, range(10)) # (1, 2, ..., 10)
  519. <iter> = filter(lambda x: x > 5, range(10)) # (6, 7, 8, 9)
  520. <int> = reduce(lambda out, x: out + x, range(10)) # 45
  521. ```
  522. ### Any, All
  523. ```python
  524. <bool> = any(<collection>) # False if empty.
  525. <bool> = all(el[1] for el in <collection>) # True if empty.
  526. ```
  527. ### If - Else
  528. ```python
  529. <expression_if_true> if <condition> else <expression_if_false>
  530. ```
  531. ```python
  532. >>> [a if a else 'zero' for a in (0, 1, 0, 3)]
  533. ['zero', 1, 'zero', 3]
  534. ```
  535. ### Namedtuple, Enum, Class
  536. ```python
  537. from collections import namedtuple
  538. Point = namedtuple('Point', 'x y')
  539. point = Point(0, 0)
  540. ```
  541. ```python
  542. from enum import Enum
  543. Direction = Enum('Direction', 'n e s w')
  544. Cutlery = Enum('Cutlery', {'fork': 1, 'knife': 2, 'spoon': 3})
  545. ```
  546. ```python
  547. # Warning: Objects will share the objects that are initialized in the dictionary!
  548. Creature = type('Creature', (), {'p': Point(0, 0), 'd': Direction.n})
  549. creature = Creature()
  550. ```
  551. Closure
  552. -------
  553. **We have a closure in Python when:**
  554. * **A nested function references a value of its enclosing function and then**
  555. * **the enclosing function returns the nested function.**
  556. ```python
  557. def get_multiplier(a):
  558. def out(b):
  559. return a * b
  560. return out
  561. ```
  562. ```python
  563. >>> multiply_by_3 = get_multiplier(3)
  564. >>> multiply_by_3(10)
  565. 30
  566. ```
  567. * **If multiple nested functions within enclosing function reference the same value, that value gets shared.**
  568. * **To dynamically access function's first free variable use `'<function>.__closure__[0].cell_contents'`.**
  569. ### Partial
  570. ```python
  571. from functools import partial
  572. <function> = partial(<function> [, <arg_1>, <arg_2>, ...])
  573. ```
  574. ```python
  575. >>> import operator as op
  576. >>> multiply_by_3 = partial(op.mul, 3)
  577. >>> multiply_by_3(10)
  578. 30
  579. ```
  580. ### Nonlocal
  581. **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'.**
  582. ```python
  583. def get_counter():
  584. i = 0
  585. def out():
  586. nonlocal i
  587. i += 1
  588. return i
  589. return out
  590. ```
  591. ```python
  592. >>> counter = get_counter()
  593. >>> counter(), counter(), counter()
  594. (1, 2, 3)
  595. ```
  596. Decorator
  597. ---------
  598. **A decorator takes a function, adds some functionality and returns it.**
  599. ```python
  600. @decorator_name
  601. def function_that_gets_passed_to_decorator():
  602. ...
  603. ```
  604. ### Debugger Example
  605. **Decorator that prints function's name every time it gets called.**
  606. ```python
  607. from functools import wraps
  608. def debug(func):
  609. @wraps(func)
  610. def out(*args, **kwargs):
  611. print(func.__name__)
  612. return func(*args, **kwargs)
  613. return out
  614. @debug
  615. def add(x, y):
  616. return x + y
  617. ```
  618. * **Wraps is a helper decorator that copies metadata of function add() to function out().**
  619. * **Without it `'add.__name__'` would return `'out'`.**
  620. ### LRU Cache
  621. **Decorator that caches function's return values. All function's arguments must be hashable.**
  622. ```python
  623. from functools import lru_cache
  624. @lru_cache(maxsize=None)
  625. def fib(n):
  626. return n if n < 2 else fib(n-2) + fib(n-1)
  627. ```
  628. * **Recursion depth is limited to 1000 by default. To increase it use `'sys.setrecursionlimit(<depth>)'`.**
  629. ### Parametrized Decorator
  630. **A decorator that accepts arguments and returns a normal decorator that accepts a function.**
  631. ```python
  632. from functools import wraps
  633. def debug(print_result=False):
  634. def decorator(func):
  635. @wraps(func)
  636. def out(*args, **kwargs):
  637. result = func(*args, **kwargs)
  638. print(func.__name__, result if print_result else '')
  639. return result
  640. return out
  641. return decorator
  642. @debug(print_result=True)
  643. def add(x, y):
  644. return x + y
  645. ```
  646. Class
  647. -----
  648. ```python
  649. class <name>:
  650. def __init__(self, a):
  651. self.a = a
  652. def __repr__(self):
  653. class_name = self.__class__.__name__
  654. return f'{class_name}({self.a!r})'
  655. def __str__(self):
  656. return str(self.a)
  657. @classmethod
  658. def get_class_name(cls):
  659. return cls.__name__
  660. ```
  661. ### Constructor Overloading
  662. ```python
  663. class <name>:
  664. def __init__(self, a=None):
  665. self.a = a
  666. ```
  667. ### Inheritance
  668. ```python
  669. class Person:
  670. def __init__(self, name, age):
  671. self.name = name
  672. self.age = age
  673. class Employee(Person):
  674. def __init__(self, name, age, staff_num):
  675. super().__init__(name, age)
  676. self.staff_num = staff_num
  677. ```
  678. ```python
  679. >>> Employee.mro()
  680. [<class 'Employee'>, <class 'Person'>, <class 'object'>]
  681. ```
  682. ### Comparable
  683. * **If eq() method is not overridden, it returns `'id(self) == id(other)'`, which is the same as `'self is other'`.**
  684. * **That means all objects compare not equal by default.**
  685. ```python
  686. class MyComparable:
  687. def __init__(self, a):
  688. self.a = a
  689. def __eq__(self, other):
  690. if isinstance(other, type(self)):
  691. return self.a == other.a
  692. return False
  693. ```
  694. ### Hashable
  695. * **Hashable object needs both hash() and eq() methods and its hash value should never change.**
  696. * **Hashable objects that compare equal must have the same hash value, meaning default hash() that returns `'id(self)'` will not do.**
  697. * **That is why Python automatically makes classes unhashable if you only implement eq().**
  698. ```python
  699. class MyHashable:
  700. def __init__(self, a):
  701. self.__a = copy.deepcopy(a)
  702. @property
  703. def a(self):
  704. return self.__a
  705. def __eq__(self, other):
  706. if isinstance(other, type(self)):
  707. return self.a == other.a
  708. return False
  709. def __hash__(self):
  710. return hash(self.a)
  711. ```
  712. ### Sequence
  713. * **Methods do not depend on each other, so they can be skipped if not needed.**
  714. * **Any object with defined getitem() is considered iterable, even if it lacks iter().**
  715. ```python
  716. class MySequence:
  717. def __init__(self, a):
  718. self.a = a
  719. def __len__(self):
  720. return len(self.a)
  721. def __getitem__(self, i):
  722. return self.a[i]
  723. def __setitem__(self, i, value):
  724. self.a[i] = value
  725. def __iter__(self):
  726. for el in self.a:
  727. yield el
  728. ```
  729. ### Callable
  730. ```python
  731. class Counter:
  732. def __init__(self):
  733. self.i = 0
  734. def __call__(self):
  735. self.i += 1
  736. return self.i
  737. ```
  738. ```python
  739. >>> counter = Counter()
  740. >>> counter(), counter(), counter()
  741. (1, 2, 3)
  742. ```
  743. ### Withable
  744. ```python
  745. class MyOpen():
  746. def __init__(self, filename):
  747. self.filename = filename
  748. def __enter__(self):
  749. self.file = open(self.filename)
  750. return self.file
  751. def __exit__(self, *args):
  752. self.file.close()
  753. ```
  754. ```python
  755. >>> with open('test.txt', 'w') as file:
  756. ... file.write('Hello World!')
  757. >>> with MyOpen('test.txt') as file:
  758. ... print(file.read())
  759. Hello World!
  760. ```
  761. ### Copy
  762. ```python
  763. from copy import copy, deepcopy
  764. <object> = copy(<object>)
  765. <object> = deepcopy(<object>)
  766. ```
  767. Enum
  768. ----
  769. ```python
  770. from enum import Enum, auto
  771. class <enum_name>(Enum):
  772. <member_name_1> = <value_1>
  773. <member_name_2> = <value_2_a>, <value_2_b>
  774. <member_name_3> = auto()
  775. @classmethod
  776. def get_member_names(cls):
  777. return [a.name for a in cls.__members__.values()]
  778. ```
  779. ```python
  780. <member> = <enum>.<member_name>
  781. <member> = <enum>['<member_name>']
  782. <member> = <enum>(<value>)
  783. name = <member>.name
  784. value = <member>.value
  785. ```
  786. ```python
  787. list_of_members = list(<enum>)
  788. member_names = [a.name for a in <enum>]
  789. member_values = [a.value for a in <enum>]
  790. random_member = random.choice(list(<enum>))
  791. ```
  792. ### Inline
  793. ```python
  794. Cutlery = Enum('Cutlery', ['fork', 'knife', 'spoon'])
  795. Cutlery = Enum('Cutlery', 'fork knife spoon')
  796. Cutlery = Enum('Cutlery', {'fork': 1, 'knife': 2, 'spoon': 3})
  797. ```
  798. #### Functions can not be values, so they must be wrapped:
  799. ```python
  800. from functools import partial
  801. LogicOp = Enum('LogicOp', {'AND': partial(lambda l, r: l and r),
  802. 'OR' : partial(lambda l, r: l or r)})
  803. ```
  804. Exceptions
  805. ----------
  806. ```python
  807. while True:
  808. try:
  809. x = int(input('Please enter a number: '))
  810. except ValueError:
  811. print('Oops! That was no valid number. Try again...')
  812. else:
  813. print('Thank you.')
  814. break
  815. ```
  816. ### Raising Exception
  817. ```python
  818. raise ValueError('A very specific message!')
  819. ```
  820. ### Finally
  821. ```python
  822. >>> try:
  823. ... raise KeyboardInterrupt
  824. ... finally:
  825. ... print('Goodbye, world!')
  826. Goodbye, world!
  827. Traceback (most recent call last):
  828. File "<stdin>", line 2, in <module>
  829. KeyboardInterrupt
  830. ```
  831. Print
  832. -----
  833. ```python
  834. print(<el_1>, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
  835. ```
  836. * **Use `'file=sys.stderr'` for errors.**
  837. ### Pretty Print
  838. ```python
  839. >>> from pprint import pprint
  840. >>> pprint(dir())
  841. ['__annotations__',
  842. '__builtins__',
  843. '__doc__', ...]
  844. ```
  845. Input
  846. -----
  847. * **Reads a line from user input or pipe if present.**
  848. * **Trailing newline gets stripped.**
  849. * **Prompt string is printed to the standard output before reading input.**
  850. ```python
  851. <str> = input(prompt=None)
  852. ```
  853. #### Prints lines until EOF:
  854. ```python
  855. while True:
  856. try:
  857. print(input())
  858. except EOFError:
  859. break
  860. ```
  861. Command Line Arguments
  862. ----------------------
  863. ```python
  864. import sys
  865. script_name = sys.argv[0]
  866. arguments = sys.argv[1:]
  867. ```
  868. ### Argparse
  869. ```python
  870. from argparse import ArgumentParser, FileType
  871. p = ArgumentParser(description=<str>)
  872. p.add_argument('-<short_name>', '--<name>', action='store_true') # Flag
  873. p.add_argument('-<short_name>', '--<name>', type=<type>) # Option
  874. p.add_argument('<name>', type=<type>, nargs=1) # Argument
  875. p.add_argument('<name>', type=<type>, nargs='+') # Arguments
  876. args = p.parse_args()
  877. value = args.<name>
  878. ```
  879. * **Use `'help=<str>'` for argument description.**
  880. * **Use `'type=FileType(<mode>)'` for files.**
  881. Open
  882. ----
  883. **Opens a file and returns a corresponding file object.**
  884. ```python
  885. <file> = open('<path>', mode='r', encoding=None)
  886. ```
  887. ### Modes
  888. * **`'r'` - Read (default).**
  889. * **`'w'` - Write (truncate).**
  890. * **`'x'` - Write or fail if the file already exists.**
  891. * **`'a'` - Append.**
  892. * **`'w+'` - Read and write (truncate).**
  893. * **`'r+'` - Read and write from the start.**
  894. * **`'a+'` - Read and write from the end.**
  895. * **`'t'` - Text mode (default).**
  896. * **`'b'` - Binary mode.**
  897. ### File
  898. ```python
  899. <file>.seek(0) # Moves to the start of the file.
  900. <file>.seek(offset) # Moves 'offset' chars/bytes from the start.
  901. <file>.seek(offset, <anchor>) # Anchor: 0 start, 1 current pos., 2 end.
  902. ```
  903. ```python
  904. <str/bytes> = <file>.read(size=-1) # Reads 'size' chars/bytes or until EOF.
  905. <str/bytes> = <file>.readline() # Returns a line.
  906. <list> = <file>.readlines() # Returns a list of lines.
  907. <str/bytes> = next(<file>) # Returns a line using buffer. Do not mix.
  908. ```
  909. ```python
  910. <file>.write(<str/bytes>) # Writes a string or bytes object.
  911. <file>.writelines(<list>) # Writes a list of strings or bytes objects.
  912. ```
  913. * **Methods do not add or strip trailing newlines.**
  914. * **Changes are not written until file gets closed.**
  915. ### Read Text from File
  916. ```python
  917. def read_file(filename):
  918. with open(filename, encoding='utf-8') as file:
  919. return file.readlines()
  920. ```
  921. ### Write Text to File
  922. ```python
  923. def write_to_file(filename, text):
  924. with open(filename, 'w', encoding='utf-8') as file:
  925. file.write(text)
  926. ```
  927. Path
  928. ----
  929. ```python
  930. from os import path, listdir
  931. <bool> = path.exists('<path>')
  932. <bool> = path.isfile('<path>')
  933. <bool> = path.isdir('<path>')
  934. <list> = listdir('<path>')
  935. ```
  936. ```python
  937. >>> from glob import glob
  938. >>> glob('../*.gif')
  939. ['1.gif', 'card.gif']
  940. ```
  941. ### Pathlib
  942. ```python
  943. from pathlib import Path
  944. cwd = Path()
  945. <Path> = Path('<path>' [, '<path>', <Path>, ...])
  946. <Path> = <Path> / '<dir>' / '<file>'
  947. ```
  948. ```python
  949. <bool> = <Path>.exists()
  950. <bool> = <Path>.is_file()
  951. <bool> = <Path>.is_dir()
  952. <iter> = <Path>.iterdir()
  953. ```
  954. ```python
  955. <iter> = <Path>.glob('<pattern>')
  956. ```
  957. ```python
  958. <str> = str(<Path>) # Returns path as a string.
  959. <tup.> = <Path>.parts # Returns all components as strings.
  960. <Path> = <Path>.resolve() # Returns absolute Path without symlinks.
  961. ```
  962. ```python
  963. <str> = <Path>.name # Final component.
  964. <str> = <Path>.stem # Final component without extension.
  965. <str> = <Path>.suffix # Final component's extension.
  966. <Path> = <Path>.parent # Path without final component.
  967. ```
  968. Command Execution
  969. -----------------
  970. ```python
  971. import os
  972. <str> = os.popen(<command>).read()
  973. ```
  974. ### Subprocess
  975. ```python
  976. >>> import subprocess
  977. >>> a = subprocess.run(['ls', '-a'], stdout=subprocess.PIPE)
  978. >>> a.stdout
  979. b'.\n..\nfile1.txt\nfile2.txt\n'
  980. >>> a.returncode
  981. 0
  982. ```
  983. CSV
  984. ---
  985. ```python
  986. import csv
  987. ```
  988. ### Read Rows from CSV File
  989. ```python
  990. def read_csv_file(filename):
  991. with open(filename, encoding='utf-8') as file:
  992. return csv.reader(file, delimiter=';')
  993. ```
  994. ### Write Rows to CSV File
  995. ```python
  996. def write_to_csv_file(filename, rows):
  997. with open(filename, 'w', encoding='utf-8') as file:
  998. writer = csv.writer(file, delimiter=';')
  999. writer.writerows(rows)
  1000. ```
  1001. JSON
  1002. ----
  1003. ```python
  1004. import json
  1005. <str> = json.dumps(<object>, ensure_ascii=True, indent=None)
  1006. <object> = json.loads(<str>)
  1007. ```
  1008. ### Read Object from JSON File
  1009. ```python
  1010. def read_json_file(filename):
  1011. with open(filename, encoding='utf-8') as file:
  1012. return json.load(file)
  1013. ```
  1014. ### Write Object to JSON File
  1015. ```python
  1016. def write_to_json_file(filename, an_object):
  1017. with open(filename, 'w', encoding='utf-8') as file:
  1018. json.dump(an_object, file, ensure_ascii=False, indent=2)
  1019. ```
  1020. Pickle
  1021. ------
  1022. ```python
  1023. import pickle
  1024. <bytes> = pickle.dumps(<object>)
  1025. <object> = pickle.loads(<bytes>)
  1026. ```
  1027. ### Read Object from File
  1028. ```python
  1029. def read_pickle_file(filename):
  1030. with open(filename, 'rb') as file:
  1031. return pickle.load(file)
  1032. ```
  1033. ### Write Object to File
  1034. ```python
  1035. def write_to_pickle_file(filename, an_object):
  1036. with open(filename, 'wb') as file:
  1037. pickle.dump(an_object, file)
  1038. ```
  1039. SQLite
  1040. ------
  1041. ```python
  1042. import sqlite3
  1043. db = sqlite3.connect('<path>')
  1044. ...
  1045. db.close()
  1046. ```
  1047. ### Read
  1048. ```python
  1049. cursor = db.execute('<query>')
  1050. if cursor:
  1051. <tuple> = cursor.fetchone() # First row.
  1052. <list> = cursor.fetchall() # Remaining rows.
  1053. ```
  1054. ### Write
  1055. ```python
  1056. db.execute('<query>')
  1057. db.commit()
  1058. ```
  1059. Bytes
  1060. -----
  1061. **Bytes object is an immutable sequence of single bytes. Mutable version is called 'bytearray'.**
  1062. ```python
  1063. <bytes> = b'<str>'
  1064. <int> = <bytes>[<index>]
  1065. <bytes> = <bytes>[<slice>]
  1066. <ints> = list(<bytes>)
  1067. <bytes> = b''.join(<coll_of_bytes>)
  1068. ```
  1069. ### Encode
  1070. ```python
  1071. <bytes> = <str>.encode(encoding='utf-8')
  1072. <bytes> = <int>.to_bytes(<length>, byteorder='big|little', signed=False)
  1073. <bytes> = bytes.fromhex('<hex>')
  1074. ```
  1075. ### Decode
  1076. ```python
  1077. <str> = <bytes>.decode(encoding='utf-8')
  1078. <int> = int.from_bytes(<bytes>, byteorder='big|little', signed=False)
  1079. <hex> = <bytes>.hex()
  1080. ```
  1081. ### Read Bytes from File
  1082. ```python
  1083. def read_bytes(filename):
  1084. with open(filename, 'rb') as file:
  1085. return file.read()
  1086. ```
  1087. ### Write Bytes to File
  1088. ```python
  1089. def write_bytes(filename, bytes_obj):
  1090. with open(filename, 'wb') as file:
  1091. file.write(bytes_obj)
  1092. ```
  1093. Struct
  1094. ------
  1095. * **Module that performs conversions between Python values and a C struct, represented as a Python bytes object.**
  1096. * **Machine’s native type sizes and byte order are used by default.**
  1097. ```python
  1098. from struct import pack, unpack, iter_unpack, calcsize
  1099. <bytes> = pack('<format>', <value_1> [, <value_2>, ...])
  1100. <tuple> = unpack('<format>', <bytes>)
  1101. <tuples> = iter_unpack('<format>', <bytes>)
  1102. ```
  1103. ### Example
  1104. ```python
  1105. >>> pack('>hhl', 1, 2, 3)
  1106. b'\x00\x01\x00\x02\x00\x00\x00\x03'
  1107. >>> unpack('>hhl', b'\x00\x01\x00\x02\x00\x00\x00\x03')
  1108. (1, 2, 3)
  1109. >>> calcsize('>hhl')
  1110. 8
  1111. ```
  1112. ### Format
  1113. #### For standard sizes start format string with:
  1114. * **`'='` - native byte order**
  1115. * **`'<'` - little-endian**
  1116. * **`'>'` - big-endian**
  1117. #### Use capital letter for unsigned type. Standard sizes are in brackets:
  1118. * **`'x'` - pad byte**
  1119. * **`'c'` - char (1)**
  1120. * **`'h'` - short (2)**
  1121. * **`'i'` - int (4)**
  1122. * **`'l'` - long (4)**
  1123. * **`'q'` - long long (8)**
  1124. * **`'f'` - float (4)**
  1125. * **`'d'` - double (8)**
  1126. Array
  1127. -----
  1128. **List that can hold only elements of predefined type. Available types are listed above.**
  1129. ```python
  1130. from array import array
  1131. <array> = array('<typecode>' [, <collection>])
  1132. ```
  1133. Memory View
  1134. -----------
  1135. **Used for accessing the internal data of an object that supports the buffer protocol.**
  1136. ```python
  1137. <memoryview> = memoryview(<bytes> / <bytearray> / <array>)
  1138. <memoryview>.release()
  1139. ```
  1140. Deque
  1141. -----
  1142. **Thread-safe list with efficient appends and pops from either side. Pronounced "deck".**
  1143. ```python
  1144. from collections import deque
  1145. <deque> = deque(<collection>, maxlen=None)
  1146. ```
  1147. ```python
  1148. <deque>.appendleft(<el>)
  1149. <el> = <deque>.popleft()
  1150. ```
  1151. ```python
  1152. <deque>.extendleft(<collection>) # Collection gets reversed.
  1153. <deque>.rotate(n=1) # Rotates elements to the right.
  1154. ```
  1155. Threading
  1156. ---------
  1157. ```python
  1158. from threading import Thread, RLock
  1159. ```
  1160. ### Thread
  1161. ```python
  1162. thread = Thread(target=<function>, args=(<first_arg>, ))
  1163. thread.start()
  1164. ...
  1165. thread.join()
  1166. ```
  1167. ### Lock
  1168. ```python
  1169. lock = RLock()
  1170. lock.acquire()
  1171. ...
  1172. lock.release()
  1173. ```
  1174. Introspection
  1175. -------------
  1176. **Inspecting code at runtime.**
  1177. ### Variables
  1178. ```python
  1179. <list> = dir() # Names of variables in current scope.
  1180. <dict> = locals() # Dict of local variables. Also vars().
  1181. <dict> = globals() # Dict of global variables.
  1182. ```
  1183. ### Attributes
  1184. ```python
  1185. <dict> = vars(<object>)
  1186. <bool> = hasattr(<object>, '<attr_name>')
  1187. value = getattr(<object>, '<attr_name>')
  1188. setattr(<object>, '<attr_name>', value)
  1189. ```
  1190. ### Parameters
  1191. ```python
  1192. from inspect import signature
  1193. <sig> = signature(<function>)
  1194. no_of_params = len(<sig>.parameters)
  1195. param_names = list(<sig>.parameters.keys())
  1196. ```
  1197. Metaprograming
  1198. --------------
  1199. **Code that generates code.**
  1200. ### Type
  1201. **Type is the root class. If only passed the object it returns its type (class). Otherwise it creates a new class.**
  1202. ```python
  1203. <class> = type(<class_name>, <parents_tuple>, <attributes_dict>)
  1204. ```
  1205. ```python
  1206. >>> Z = type('Z', (), {'a': 'abcde', 'b': 12345})
  1207. >>> z = Z()
  1208. ```
  1209. ### Meta Class
  1210. **Class that creates class.**
  1211. ```python
  1212. def my_meta_class(name, parents, attrs):
  1213. attrs['a'] = 'abcde'
  1214. return type(name, parents, attrs)
  1215. ```
  1216. #### Or:
  1217. ```python
  1218. class MyMetaClass(type):
  1219. def __new__(cls, name, parents, attrs):
  1220. attrs['a'] = 'abcde'
  1221. return type.__new__(cls, name, parents, attrs)
  1222. ```
  1223. * **New() is a class method that gets called before init(). If it returns an instance of its class, then that instance gets passed to init() as a 'self' argument.**
  1224. * **It receives the same arguments as init(), except for the first one that specifies the desired class of returned instance ('MyMetaClass' in our case).**
  1225. * **New() can also be called directly, usually from a new() method of a child class (`'def __new__(cls): return super().__new__(cls)'`), in which case init() is not called.**
  1226. ### Metaclass Attribute
  1227. **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.**
  1228. ```python
  1229. class MyClass(metaclass=MyMetaClass):
  1230. b = 12345
  1231. ```
  1232. ```python
  1233. >>> MyClass.a, MyClass.b
  1234. ('abcde', 12345)
  1235. ```
  1236. Operator
  1237. --------
  1238. ```python
  1239. from operator import add, sub, mul, truediv, floordiv, mod, pow, neg, abs
  1240. from operator import eq, ne, lt, le, gt, ge
  1241. from operator import not_, and_, or_
  1242. from operator import itemgetter, attrgetter, methodcaller
  1243. ```
  1244. ```python
  1245. import operator as op
  1246. product_of_elems = functools.reduce(op.mul, <collection>)
  1247. sorted_by_second = sorted(<collection>, key=op.itemgetter(1))
  1248. sorted_by_both = sorted(<collection>, key=op.itemgetter(1, 0))
  1249. LogicOp = enum.Enum('LogicOp', {'AND': op.and_, 'OR' : op.or_})
  1250. last_el = op.methodcaller('pop')(<list>)
  1251. ```
  1252. Eval
  1253. ----
  1254. ### Basic
  1255. ```python
  1256. >>> from ast import literal_eval
  1257. >>> literal_eval('1 + 2')
  1258. 3
  1259. >>> literal_eval('[1, 2, 3]')
  1260. [1, 2, 3]
  1261. >>> literal_eval('abs(1)')
  1262. ValueError: malformed node or string
  1263. ```
  1264. ### Using Abstract Syntax Trees
  1265. ```python
  1266. import ast
  1267. from ast import Num, BinOp, UnaryOp
  1268. import operator as op
  1269. LEGAL_OPERATORS = {ast.Add: op.add, # <el> + <el>
  1270. ast.Sub: op.sub, # <el> - <el>
  1271. ast.Mult: op.mul, # <el> * <el>
  1272. ast.Div: op.truediv, # <el> / <el>
  1273. ast.Pow: op.pow, # <el> ** <el>
  1274. ast.BitXor: op.xor, # <el> ^ <el>
  1275. ast.USub: op.neg} # - <el>
  1276. def evaluate(expression):
  1277. root = ast.parse(expression, mode='eval')
  1278. return eval_node(root.body)
  1279. def eval_node(node):
  1280. node_type = type(node)
  1281. if node_type == Num:
  1282. return node.n
  1283. if node_type not in [BinOp, UnaryOp]:
  1284. raise TypeError(node)
  1285. operator_type = type(node.op)
  1286. if operator_type not in LEGAL_OPERATORS:
  1287. raise TypeError(f'Illegal operator {node.op}')
  1288. operator = LEGAL_OPERATORS[operator_type]
  1289. if node_type == BinOp:
  1290. left, right = eval_node(node.left), eval_node(node.right)
  1291. return operator(left, right)
  1292. elif node_type == UnaryOp:
  1293. operand = eval_node(node.operand)
  1294. return operator(operand)
  1295. ```
  1296. ```python
  1297. >>> evaluate('2 ^ 6')
  1298. 4
  1299. >>> evaluate('2 ** 6')
  1300. 64
  1301. >>> evaluate('1 + 2 * 3 ** (4 ^ 5) / (6 + -7)')
  1302. -5.0
  1303. ```
  1304. Coroutine
  1305. ---------
  1306. * **Similar to generator, but generator pulls data through the pipe with iteration, while coroutine pushes data into the pipeline with send().**
  1307. * **Coroutines provide more powerful data routing possibilities than iterators.**
  1308. * **If you build a collection of simple data processing components, you can glue them together into complex arrangements of pipes, branches, merging, etc.**
  1309. ### Helper Decorator
  1310. * **All coroutines must be "primed" by first calling next().**
  1311. * **Remembering to call next() is easy to forget.**
  1312. * **Solved by wrapping coroutines with a decorator:**
  1313. ```python
  1314. def coroutine(func):
  1315. def out(*args, **kwargs):
  1316. cr = func(*args, **kwargs)
  1317. next(cr)
  1318. return cr
  1319. return out
  1320. ```
  1321. ### Pipeline Example
  1322. ```python
  1323. def reader(target):
  1324. for i in range(10):
  1325. target.send(i)
  1326. target.close()
  1327. @coroutine
  1328. def adder(target):
  1329. while True:
  1330. item = (yield)
  1331. target.send(item + 100)
  1332. @coroutine
  1333. def printer():
  1334. while True:
  1335. item = (yield)
  1336. print(item)
  1337. reader(adder(printer())) # 100, 101, ..., 109
  1338. ```
  1339. <br><br>
  1340. Libraries
  1341. =========
  1342. Progress Bar
  1343. ------------
  1344. ```python
  1345. # $ pip3 install tqdm
  1346. from tqdm import tqdm
  1347. from time import sleep
  1348. for i in tqdm([1, 2, 3]):
  1349. sleep(0.2)
  1350. for i in tqdm(range(100)):
  1351. sleep(0.02)
  1352. ```
  1353. Plot
  1354. ----
  1355. ```python
  1356. # $ pip3 install matplotlib
  1357. from matplotlib import pyplot
  1358. pyplot.plot(<data_1> [, <data_2>, ...])
  1359. pyplot.savefig(<filename>, transparent=True)
  1360. pyplot.show()
  1361. ```
  1362. Table
  1363. -----
  1364. #### Prints CSV file as ASCII table:
  1365. ```python
  1366. # $ pip3 install tabulate
  1367. from tabulate import tabulate
  1368. import csv
  1369. with open(<filename>, encoding='utf-8') as file:
  1370. lines = csv.reader(file, delimiter=';')
  1371. headers = [header.title() for header in next(lines)]
  1372. table = tabulate(lines, headers)
  1373. print(table)
  1374. ```
  1375. Curses
  1376. ------
  1377. ```python
  1378. from curses import wrapper
  1379. def main():
  1380. wrapper(draw)
  1381. def draw(screen):
  1382. screen.clear()
  1383. screen.addstr(0, 0, 'Press ESC to quit.')
  1384. while screen.getch() != 27:
  1385. pass
  1386. def get_border(screen):
  1387. from collections import namedtuple
  1388. P = namedtuple('P', 'x y')
  1389. height, width = screen.getmaxyx()
  1390. return P(width-1, height-1)
  1391. ```
  1392. Logging
  1393. -------
  1394. ```python
  1395. # $ pip3 install loguru
  1396. from loguru import logger
  1397. ```
  1398. ```python
  1399. logger.add('debug_{time}.log', colorize=True) # Connects a log file.
  1400. logger.add('error_{time}.log', level='ERROR') # Another file for errors or higher.
  1401. logger.<level>('A logging message')
  1402. ```
  1403. * **Levels: `'debug'`, `'info'`, `'success'`, `'warning'`, `'error'`, `'critical'`.**
  1404. ### Rotation
  1405. **Parameter that sets a condition when a new log file is created.**
  1406. ```python
  1407. rotation=<int>|<datetime.timedelta>|<datetime.time>|<str>
  1408. ```
  1409. * **`'<int>'` - Max file size in bytes.**
  1410. * **`'<timedelta>'` - Max age of a file.**
  1411. * **`'<time>'` - Time of day.**
  1412. * **`'<str>'` - Any of above as a string: `'100 MB'`, `'1 month'`, `'monday at 12:00'`, ...**
  1413. ### Retention
  1414. **Sets a condition which old log files are deleted.**
  1415. ```python
  1416. retention=<int>|<datetime.timedelta>|<str>
  1417. ```
  1418. * **`'<int>'` - Max number of files.**
  1419. * **`'<timedelta>'` - Max age of a file.**
  1420. * **`'<str>'` - Max age as a string: `'1 week, 3 days'`, `'2 months'`, ...**
  1421. ### Compression
  1422. **Sets how inactive log files are compressed.**
  1423. ```python
  1424. compression='gz'|'bz2'|'tar'|'tar.gz'|'tar.bz2'|'zip'
  1425. ```
  1426. Scraping
  1427. --------
  1428. ```python
  1429. # $ pip3 install requests beautifulsoup4
  1430. >>> import requests
  1431. >>> from bs4 import BeautifulSoup
  1432. >>> url = 'https://en.wikipedia.org/wiki/Python_(programming_language)'
  1433. >>> page = requests.get(url)
  1434. >>> doc = BeautifulSoup(page.text, 'html.parser')
  1435. >>> table = doc.find('table', class_='infobox vevent')
  1436. >>> rows = table.find_all('tr')
  1437. >>> link = rows[11].find('a')['href']
  1438. >>> ver = rows[6].find('div').text.split()[0]
  1439. >>> link, ver
  1440. ('https://www.python.org/', '3.7.2')
  1441. ```
  1442. Web
  1443. ---
  1444. ```python
  1445. # $ pip3 install bottle
  1446. from bottle import run, route, post, template, request, response
  1447. import json
  1448. ```
  1449. ### Run
  1450. ```python
  1451. run(host='localhost', port=8080)
  1452. run(host='0.0.0.0', port=80, server='cherrypy')
  1453. ```
  1454. ### Static Request
  1455. ```python
  1456. @route('/img/<image>')
  1457. def send_image(image):
  1458. return static_file(image, 'images/', mimetype='image/png')
  1459. ```
  1460. ### Dynamic Request
  1461. ```python
  1462. @route('/<sport>')
  1463. def send_page(sport):
  1464. return template('<h1>{{title}}</h1>', title=sport)
  1465. ```
  1466. ### REST Request
  1467. ```python
  1468. @post('/odds/<sport>')
  1469. def odds_handler(sport):
  1470. team = request.forms.get('team')
  1471. home_odds, away_odds = 2.44, 3.29
  1472. response.headers['Content-Type'] = 'application/json'
  1473. response.headers['Cache-Control'] = 'no-cache'
  1474. return json.dumps([team, home_odds, away_odds])
  1475. ```
  1476. #### Test:
  1477. ```python
  1478. # $ pip3 install requests
  1479. >>> import requests
  1480. >>> url = 'http://localhost:8080/odds/football'
  1481. >>> data = {'team': 'arsenal f.c.'}
  1482. >>> response = requests.post(url, data=data)
  1483. >>> response.json()
  1484. ['arsenal f.c.', 2.44, 3.29]
  1485. ```
  1486. Profile
  1487. -------
  1488. ### Basic
  1489. ```python
  1490. from time import time
  1491. start_time = time() # Seconds since Epoch.
  1492. ...
  1493. duration = time() - start_time
  1494. ```
  1495. ### High Performance
  1496. ```python
  1497. from time import perf_counter as pc
  1498. start_time = pc() # Seconds since restart.
  1499. ...
  1500. duration = pc() - start_time
  1501. ```
  1502. ### Timing a Snippet
  1503. ```python
  1504. from timeit import timeit
  1505. timeit('"-".join(str(a) for a in range(100))',
  1506. number=10000, globals=globals(), setup='pass')
  1507. ```
  1508. ### Line Profiler
  1509. ```python
  1510. # $ pip3 install line_profiler
  1511. @profile
  1512. def main():
  1513. a = [*range(10000)]
  1514. b = {*range(10000)}
  1515. main()
  1516. ```
  1517. #### Usage:
  1518. ```text
  1519. $ kernprof -lv test.py
  1520. Line # Hits Time Per Hit % Time Line Contents
  1521. ==============================================================
  1522. 1 @profile
  1523. 2 def main():
  1524. 3 1 1128.0 1128.0 27.4 a = [*range(10000)]
  1525. 4 1 2994.0 2994.0 72.6 b = {*range(10000)}
  1526. ```
  1527. ### Call Graph
  1528. #### Generates a PNG image of a call graph with highlighted bottlenecks:
  1529. ```python
  1530. # $ pip3 install pycallgraph
  1531. from pycallgraph import output, PyCallGraph
  1532. from datetime import datetime
  1533. time_str = datetime.now().strftime('%Y%m%d%H%M%S')
  1534. filename = f'profile-{time_str}.png'
  1535. drawer = output.GraphvizOutput(output_file=filename)
  1536. with PyCallGraph(output=drawer):
  1537. <code_to_be_profiled>
  1538. ```
  1539. NumPy
  1540. -----
  1541. **Array manipulation mini language. Can run up to one hundred times faster than equivalent Python code.**
  1542. ```python
  1543. # $ pip3 install numpy
  1544. import numpy as np
  1545. ```
  1546. ```python
  1547. <array> = np.array(<list>)
  1548. <array> = np.arange(from_inclusive, to_exclusive, ±step_size)
  1549. <array> = np.ones(<shape>)
  1550. <array> = np.random.randint(from_inclusive, to_exclusive, <shape>)
  1551. ```
  1552. ```python
  1553. <array>.shape = <shape>
  1554. <view> = <array>.reshape(<shape>)
  1555. <view> = np.broadcast_to(<array>, <shape>)
  1556. ```
  1557. ```python
  1558. <array> = <array>.sum(axis)
  1559. indexes = <array>.argmin(axis)
  1560. ```
  1561. * **Shape is a tuple of dimension sizes.**
  1562. * **Axis is an index of dimension that gets collapsed. Leftmost dimension has index 0.**
  1563. ### Indexing
  1564. ```bash
  1565. <el> = <2d_array>[0, 0] # First element.
  1566. <1d_view> = <2d_array>[0] # First row.
  1567. <1d_view> = <2d_array>[:, 0] # First column. Also [..., 0].
  1568. <3d_view> = <2d_array>[None, :, :] # Expanded by dimension of size 1.
  1569. ```
  1570. ```bash
  1571. <1d_array> = <2d_array>[<1d_row_indexes>, <1d_column_indexes>]
  1572. <2d_array> = <2d_array>[<2d_row_indexes>, <2d_column_indexes>]
  1573. ```
  1574. ```bash
  1575. <2d_bools> = <2d_array> > 0
  1576. <1d_array> = <2d_array>[<2d_bools>]
  1577. ```
  1578. * **If row and column indexes differ in shape, they are combined with broadcasting.**
  1579. ### Broadcasting
  1580. **Broadcasting is a set of rules by which NumPy functions operate on arrays of different sizes and/or dimensions.**
  1581. ```python
  1582. left = [[0.1], [0.6], [0.8]] # Shape: (3, 1)
  1583. right = [ 0.1 , 0.6 , 0.8 ] # Shape: (3)
  1584. ```
  1585. #### 1. If array shapes differ in length, left-pad the smaller shape with ones:
  1586. ```python
  1587. left = [[0.1], [0.6], [0.8]] # Shape: (3, 1)
  1588. right = [[0.1 , 0.6 , 0.8]] # Shape: (1, 3) <- !
  1589. ```
  1590. #### 2. If any dimensions differ in size, expand the ones that have size 1 by duplicating their elements:
  1591. ```python
  1592. left = [[0.1, 0.1, 0.1], [0.6, 0.6, 0.6], [0.8, 0.8, 0.8]] # Shape: (3, 3) <- !
  1593. right = [[0.1, 0.6, 0.8], [0.1, 0.6, 0.8], [0.1, 0.6, 0.8]] # Shape: (3, 3) <- !
  1594. ```
  1595. #### 3. If neither non-matching dimension has size 1, rise an error.
  1596. ### Example
  1597. #### For each point returns index of its nearest point (`[0.1, 0.6, 0.8] => [1, 2, 1]`):
  1598. ```python
  1599. >>> points = np.array([0.1, 0.6, 0.8])
  1600. [ 0.1, 0.6, 0.8]
  1601. >>> wrapped_points = points.reshape(3, 1)
  1602. [[ 0.1],
  1603. [ 0.6],
  1604. [ 0.8]]
  1605. >>> distances = wrapped_points - points
  1606. [[ 0. , -0.5, -0.7],
  1607. [ 0.5, 0. , -0.2],
  1608. [ 0.7, 0.2, 0. ]]
  1609. >>> distances = np.abs(distances)
  1610. [[ 0. , 0.5, 0.7],
  1611. [ 0.5, 0. , 0.2],
  1612. [ 0.7, 0.2, 0. ]]
  1613. >>> i = np.arange(3)
  1614. [0, 1, 2]
  1615. >>> distances[i, i] = np.inf
  1616. [[ inf, 0.5, 0.7],
  1617. [ 0.5, inf, 0.2],
  1618. [ 0.7, 0.2, inf]]
  1619. >>> distances.argmin(1)
  1620. [1, 2, 1]
  1621. ```
  1622. Image
  1623. -----
  1624. ```python
  1625. # $ pip3 install pillow
  1626. from PIL import Image
  1627. ```
  1628. #### Creates PNG image of a rainbow gradient:
  1629. ```python
  1630. width = 100
  1631. height = 100
  1632. size = width * height
  1633. pixels = [255 * i/size for i in range(size)]
  1634. img = Image.new('HSV', (width, height))
  1635. img.putdata([(int(a), 255, 255) for a in pixels])
  1636. img.convert(mode='RGB').save('test.png')
  1637. ```
  1638. #### Adds noise to a PNG image:
  1639. ```python
  1640. from random import randint
  1641. add_noise = lambda value: max(0, min(255, value + randint(-20, 20)))
  1642. img = Image.open('test.png').convert(mode='HSV')
  1643. img.putdata([(add_noise(h), s, v) for h, s, v in img.getdata()])
  1644. img.convert(mode='RGB').save('test.png')
  1645. ```
  1646. ### Modes
  1647. * **`'1'` - 1-bit pixels, black and white, stored with one pixel per byte.**
  1648. * **`'L'` - 8-bit pixels, greyscale.**
  1649. * **`'RGB'` - 3x8-bit pixels, true color.**
  1650. * **`'RGBA'` - 4x8-bit pixels, true color with transparency mask.**
  1651. * **`'HSV'` - 3x8-bit pixels, Hue, Saturation, Value color space.**
  1652. Audio
  1653. -----
  1654. ```python
  1655. import wave
  1656. from struct import pack, iter_unpack
  1657. ```
  1658. ### Read Frames from WAV File
  1659. ```python
  1660. def read_wav_file(filename):
  1661. with wave.open(filename, 'rb') as wf:
  1662. frames = wf.readframes(wf.getnframes())
  1663. return [a[0] for a in iter_unpack('<h', frames)]
  1664. ```
  1665. ### Write Frames to WAV File
  1666. ```python
  1667. def write_to_wav_file(filename, frames_int, mono=True):
  1668. frames_short = (pack('<h', a) for a in frames_int)
  1669. with wave.open(filename, 'wb') as wf:
  1670. wf.setnchannels(1 if mono else 2)
  1671. wf.setsampwidth(2)
  1672. wf.setframerate(44100)
  1673. wf.writeframes(b''.join(frames_short))
  1674. ```
  1675. ### Examples
  1676. #### Saves a sine wave to a mono WAV file:
  1677. ```python
  1678. from math import pi, sin
  1679. frames_f = (sin(i * 2 * pi * 440 / 44100) for i in range(100000))
  1680. frames_i = (int(a * 30000) for a in frames_f)
  1681. write_to_wav_file('test.wav', frames_i)
  1682. ```
  1683. #### Adds noise to a mono WAV file:
  1684. ```python
  1685. from random import randint
  1686. add_noise = lambda value: max(-32768, min(32767, value + randint(-500, 500)))
  1687. frames_i = (add_noise(a) for a in read_wav_file('test.wav'))
  1688. write_to_wav_file('test.wav', frames_i)
  1689. ```
  1690. #### Plays Popcorn:
  1691. ```python
  1692. # $ pip3 install simpleaudio
  1693. import simpleaudio, math, struct
  1694. from itertools import chain, repeat
  1695. F = 44100
  1696. P1 = '71♪,69,,71♪,66,,62♪,66,,59♪,,,'
  1697. P2 = '71♪,73,,74♪,73,,74,,71,,73♪,71,,73,,69,,71♪,69,,71,,67,,71♪,,,'
  1698. get_pause = lambda seconds: repeat(0, int(seconds * F))
  1699. sin_f = lambda i, hz: math.sin(i * 2 * math.pi * hz / F)
  1700. get_wave = lambda hz, seconds: (sin_f(i, hz) for i in range(int(seconds * F)))
  1701. get_hz = lambda key: 8.176 * 2 ** (int(key) / 12)
  1702. parse_n = lambda note: (get_hz(note[:2]), 0.25 if '♪' in note else 0.125)
  1703. get_note = lambda note: get_wave(*parse_n(note)) if note else get_pause(0.125)
  1704. frames_i = chain.from_iterable(get_note(n) for n in f'{P1}{P1}{P2}'.split(','))
  1705. frames_b = b''.join(struct.pack('<h', int(a * 30000)) for a in frames_i)
  1706. simpleaudio.play_buffer(frames_b, 1, 2, F)
  1707. ```
  1708. Basic Script Template
  1709. ---------------------
  1710. ```python
  1711. #!/usr/bin/env python3
  1712. #
  1713. # Usage: .py
  1714. #
  1715. from collections import namedtuple
  1716. from enum import Enum
  1717. import re
  1718. import sys
  1719. def main():
  1720. pass
  1721. ###
  1722. ## UTIL
  1723. #
  1724. def read_file(filename):
  1725. with open(filename, encoding='utf-8') as file:
  1726. return file.readlines()
  1727. if __name__ == '__main__':
  1728. main()
  1729. ```