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.

1823 lines
149 KiB

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