Skip to content

Commit ae70273

Browse files
committed
Plot, GUI app, Scraping, Web
1 parent dee9f39 commit ae70273

File tree

3 files changed

+49
-49
lines changed

3 files changed

+49
-49
lines changed

README.md

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,7 +1293,7 @@ class MySequence:
12931293
```
12941294

12951295
#### Discrepancies between glossary definitions and abstract base classes:
1296-
* **Glossary defines iterable as any object with iter() or getitem() and sequence as any object with getitem() and len(). It does not define collection.**
1296+
* **Glossary on Python's website defines iterable as any object with iter() or getitem() and sequence as any object with getitem() and len(). It does not define collection.**
12971297
* **Passing ABC Iterable to isinstance() or issubclass() checks whether object/class has method iter(), while ABC Collection checks for iter(), contains() and len().**
12981298

12991299
### ABC Sequence
@@ -2416,9 +2416,9 @@ Plot
24162416
# $ pip3 install matplotlib
24172417
import matplotlib.pyplot as plt
24182418

2419-
plt.plot/bar/scatter(x_data, y_data [, label=<str>]) # Or: plt.plot(y_data)
2419+
plt.plot/bar/scatter(x_data, y_data [, label=<str>]) # Also plt.plot(y_data).
24202420
plt.legend() # Adds a legend.
2421-
plt.title/xlabel/ylabel(<str>) # Adds a title/label.
2421+
plt.title/xlabel/ylabel(<str>) # Adds a title or label.
24222422
plt.savefig(<path>) # Saves the figure.
24232423
plt.show() # Displays the figure.
24242424
plt.clf() # Clears the figure.
@@ -2476,7 +2476,7 @@ GUI App
24762476
# $ pip3 install PySimpleGUI
24772477
import PySimpleGUI as sg
24782478

2479-
text_box = sg.Input(default_text='100', enable_events=True, key='-VALUE-')
2479+
text_box = sg.Input(default_text='100', enable_events=True, key='-QUANTITY-')
24802480
dropdown = sg.InputCombo(['g', 'kg', 't'], 'kg', readonly=True, enable_events=True, k='-UNIT-')
24812481
label = sg.Text('100 kg is 220.462 lbs.', key='-OUTPUT-')
24822482
button = sg.Button('Close')
@@ -2487,13 +2487,13 @@ while True:
24872487
if event in [sg.WIN_CLOSED, 'Close']:
24882488
break
24892489
try:
2490-
value = float(values['-VALUE-'])
2490+
quantity = float(values['-QUANTITY-'])
24912491
except ValueError:
24922492
continue
24932493
unit = values['-UNIT-']
24942494
factors = {'g': 0.001, 'kg': 1, 't': 1000}
2495-
lbs = value * factors[unit] / 0.45359237
2496-
window['-OUTPUT-'].update(value=f'{value} {unit} is {lbs:g} lbs.')
2495+
lbs = quantity * factors[unit] / 0.45359237
2496+
window['-OUTPUT-'].update(value=f'{quantity} {unit} is {lbs:g} lbs.')
24972497
window.close()
24982498
```
24992499

@@ -2523,36 +2523,36 @@ print(f'{python_url}, file://{os.path.abspath(filename)}')
25232523
# $ pip3 install selenium
25242524
from selenium import webdriver
25252525

2526-
<Drv> = webdriver.Chrome/Firefox/Safari/Edge() # Opens a browser. Also <Drv>.quit().
2527-
<Drv>.get('<url>') # Also <Drv>.implicitly_wait(seconds).
2528-
<El> = <Drv/El>.find_element('css selector', '<css>') # '<tag>#<id>.<class>[<attr>="<val>"]'.
2529-
<list> = <Drv/El>.find_elements('xpath', '<xpath>') # '//<tag>[@<attr>="<val>"]'.
2530-
<str> = <El>.get_attribute(<str>) # Property if exists. Also <El>.text.
2531-
<El>.click/clear() # Also <El>.send_keys(<str>).
2526+
<WebDrv> = webdriver.Chrome/Firefox/Safari/Edge() # Opens a browser. Also <WebDrv>.quit().
2527+
<WebDrv>.get('<url>') # Also <WebDrv>.implicitly_wait(seconds).
2528+
<El> = <WebDrv/El>.find_element('css selector', ) # '<tag>#<id>.<class>[<attr>="<val>"]'.
2529+
<list> = <WebDrv/El>.find_elements('xpath', ) # '//<tag>[@<attr>="<val>"]…'. See XPath.
2530+
<str> = <El>.get_attribute(<str>) # Property if exists. Also <El>.text.
2531+
<El>.click/clear() # Also <El>.send_keys(<str>).
25322532
```
25332533

25342534
#### XPath — also available in lxml, Scrapy, and browser's console via `'$x("<xpath>")'`:
25352535
```python
2536-
<xpath> = //<element>[/ or // <element>] # /<child>, //<descendant>, /../<siblng>
2537-
<xpath> = //<element>/following::<element> # Next element. Also preceding/parent/…
2538-
<element> = <tag><conditions><index> # `<tag> = */a/…`, `<index> = [1/2/…]`.
2539-
<condition> = [<sub_cond> [and/or <sub_cond>]] # For negation use `not(<sub_cond>)`.
2540-
<sub_cond> = @<attr>[="<val>"] # `text()=`, `.=` match (complete) text.
2541-
<sub_cond> = contains(@<attr>, "<val>") # Is <val> a substring of attr's value?
2542-
<sub_cond> = [//]<element> # Has matching child? Descendant if //.
2536+
<xpath> = //<element>[/ or // <element>] # /<child>, //<descendant>, /../<sibling>
2537+
<xpath> = //<element>/following::<element> # Next element. Also preceding/parent/…
2538+
<element> = <tag><conditions><index> # `<tag> = */a/…`, `<index> = [1/2/…]`.
2539+
<condition> = [<sub_cond> [and/or <sub_cond>]] # For negation use `not(<sub_cond>)`.
2540+
<sub_cond> = @<attr>[="<val>"] # `text()=`, `.=` match (complete) text.
2541+
<sub_cond> = contains(@<attr>, "<val>") # Is <val> a substring of attr's value?
2542+
<sub_cond> = [//]<element> # Has matching child? Descendant if //.
25432543
```
25442544

25452545

2546-
Web
2547-
---
2546+
Web App
2547+
-------
25482548
**Flask is a micro web framework/server. If you just want to open a html file in a web browser use `'webbrowser.open(<path>)'` instead.**
25492549
```python
25502550
# $ pip3 install flask
25512551
import flask as fl
25522552
```
25532553

25542554
```python
2555-
app = fl.Flask(__name__) # Returns app object. Put at the top.
2555+
app = fl.Flask(__name__) # Returns the app object. Put at the top.
25562556
app.run(host=None, port=None, debug=None) # Or: $ flask --app FILE run [--ARG[=VAL] …]
25572557
```
25582558
* **Starts the app at `'http://localhost:5000'`. Use `'host="0.0.0.0"'` to run externally.**

index.html

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555

5656
<body>
5757
<header>
58-
<aside>October 18, 2024</aside>
58+
<aside>October 25, 2024</aside>
5959
<a href="https://gto76.github.io" rel="author">Jure Šorn</a>
6060
</header>
6161

@@ -1098,7 +1098,7 @@
10981098

10991099

11001100
<div><h4 id="discrepanciesbetweenglossarydefinitionsandabstractbaseclasses">Discrepancies between glossary definitions and abstract base classes:</h4><ul>
1101-
<li><strong>Glossary defines iterable as any object with iter() or getitem() and sequence as any object with getitem() and len(). It does not define collection.</strong></li>
1101+
<li><strong>Glossary on Python's website defines iterable as any object with iter() or getitem() and sequence as any object with getitem() and len(). It does not define collection.</strong></li>
11021102
<li><strong>Passing ABC Iterable to isinstance() or issubclass() checks whether object/class has method iter(), while ABC Collection checks for iter(), contains() and len().</strong></li>
11031103
</ul></div>
11041104

@@ -1976,9 +1976,9 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
19761976
<div><h2 id="plot"><a href="#plot" name="plot">#</a>Plot</h2><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install matplotlib</span>
19771977
<span class="hljs-keyword">import</span> matplotlib.pyplot <span class="hljs-keyword">as</span> plt
19781978

1979-
plt.plot/bar/scatter(x_data, y_data [, label=&lt;str&gt;]) <span class="hljs-comment"># Or: plt.plot(y_data)</span>
1979+
plt.plot/bar/scatter(x_data, y_data [, label=&lt;str&gt;]) <span class="hljs-comment"># Also plt.plot(y_data).</span>
19801980
plt.legend() <span class="hljs-comment"># Adds a legend.</span>
1981-
plt.title/xlabel/ylabel(&lt;str&gt;) <span class="hljs-comment"># Adds a title/label.</span>
1981+
plt.title/xlabel/ylabel(&lt;str&gt;) <span class="hljs-comment"># Adds a title or label.</span>
19821982
plt.savefig(&lt;path&gt;) <span class="hljs-comment"># Saves the figure.</span>
19831983
plt.show() <span class="hljs-comment"># Displays the figure.</span>
19841984
plt.clf() <span class="hljs-comment"># Clears the figure.</span>
@@ -2022,7 +2022,7 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
20222022
<div><h2 id="guiapp"><a href="#guiapp" name="guiapp">#</a>GUI App</h2><div><h4 id="aweightconverterguiapplication">A weight converter GUI application:</h4><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install PySimpleGUI</span>
20232023
<span class="hljs-keyword">import</span> PySimpleGUI <span class="hljs-keyword">as</span> sg
20242024

2025-
text_box = sg.Input(default_text=<span class="hljs-string">'100'</span>, enable_events=<span class="hljs-keyword">True</span>, key=<span class="hljs-string">'-VALUE-'</span>)
2025+
text_box = sg.Input(default_text=<span class="hljs-string">'100'</span>, enable_events=<span class="hljs-keyword">True</span>, key=<span class="hljs-string">'-QUANTITY-'</span>)
20262026
dropdown = sg.InputCombo([<span class="hljs-string">'g'</span>, <span class="hljs-string">'kg'</span>, <span class="hljs-string">'t'</span>], <span class="hljs-string">'kg'</span>, readonly=<span class="hljs-keyword">True</span>, enable_events=<span class="hljs-keyword">True</span>, k=<span class="hljs-string">'-UNIT-'</span>)
20272027
label = sg.Text(<span class="hljs-string">'100 kg is 220.462 lbs.'</span>, key=<span class="hljs-string">'-OUTPUT-'</span>)
20282028
button = sg.Button(<span class="hljs-string">'Close'</span>)
@@ -2033,13 +2033,13 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
20332033
<span class="hljs-keyword">if</span> event <span class="hljs-keyword">in</span> [sg.WIN_CLOSED, <span class="hljs-string">'Close'</span>]:
20342034
<span class="hljs-keyword">break</span>
20352035
<span class="hljs-keyword">try</span>:
2036-
value = float(values[<span class="hljs-string">'-VALUE-'</span>])
2036+
quantity = float(values[<span class="hljs-string">'-QUANTITY-'</span>])
20372037
<span class="hljs-keyword">except</span> ValueError:
20382038
<span class="hljs-keyword">continue</span>
20392039
unit = values[<span class="hljs-string">'-UNIT-'</span>]
20402040
factors = {<span class="hljs-string">'g'</span>: <span class="hljs-number">0.001</span>, <span class="hljs-string">'kg'</span>: <span class="hljs-number">1</span>, <span class="hljs-string">'t'</span>: <span class="hljs-number">1000</span>}
2041-
lbs = value * factors[unit] / <span class="hljs-number">0.45359237</span>
2042-
window[<span class="hljs-string">'-OUTPUT-'</span>].update(value=<span class="hljs-string">f'<span class="hljs-subst">{value}</span> <span class="hljs-subst">{unit}</span> is <span class="hljs-subst">{lbs:g}</span> lbs.'</span>)
2041+
lbs = quantity * factors[unit] / <span class="hljs-number">0.45359237</span>
2042+
window[<span class="hljs-string">'-OUTPUT-'</span>].update(value=<span class="hljs-string">f'<span class="hljs-subst">{quantity}</span> <span class="hljs-subst">{unit}</span> is <span class="hljs-subst">{lbs:g}</span> lbs.'</span>)
20432043
window.close()
20442044
</code></pre></div></div>
20452045

@@ -2063,30 +2063,30 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
20632063
<div><h3 id="selenium">Selenium</h3><p><strong>Library for scraping websites with dynamic content.</strong></p><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install selenium</span>
20642064
<span class="hljs-keyword">from</span> selenium <span class="hljs-keyword">import</span> webdriver
20652065

2066-
&lt;Drv&gt; = webdriver.Chrome/Firefox/Safari/Edge() <span class="hljs-comment"># Opens a browser. Also &lt;Drv&gt;.quit().</span>
2067-
&lt;Drv&gt;.get(<span class="hljs-string">'&lt;url&gt;'</span>) <span class="hljs-comment"># Also &lt;Drv&gt;.implicitly_wait(seconds).</span>
2068-
&lt;El&gt; = &lt;Drv/El&gt;.find_element(<span class="hljs-string">'css selector'</span>, <span class="hljs-string">'&lt;css&gt;'</span>) <span class="hljs-comment"># '&lt;tag&gt;#&lt;id&gt;.&lt;class&gt;[&lt;attr&gt;="&lt;val&gt;"]'.</span>
2069-
&lt;list&gt; = &lt;Drv/El&gt;.find_elements(<span class="hljs-string">'xpath'</span>, <span class="hljs-string">'&lt;xpath&gt;'</span>) <span class="hljs-comment"># '//&lt;tag&gt;[@&lt;attr&gt;="&lt;val&gt;"]'.</span>
2070-
&lt;str&gt; = &lt;El&gt;.get_attribute(&lt;str&gt;) <span class="hljs-comment"># Property if exists. Also &lt;El&gt;.text.</span>
2071-
&lt;El&gt;.click/clear() <span class="hljs-comment"># Also &lt;El&gt;.send_keys(&lt;str&gt;).</span>
2066+
&lt;WebDrv&gt; = webdriver.Chrome/Firefox/Safari/Edge() <span class="hljs-comment"># Opens a browser. Also &lt;WebDrv&gt;.quit().</span>
2067+
&lt;WebDrv&gt;.get(<span class="hljs-string">'&lt;url&gt;'</span>) <span class="hljs-comment"># Also &lt;WebDrv&gt;.implicitly_wait(seconds).</span>
2068+
&lt;El&gt; = &lt;WebDrv/El&gt;.find_element(<span class="hljs-string">'css selector'</span>, ) <span class="hljs-comment"># '&lt;tag&gt;#&lt;id&gt;.&lt;class&gt;[&lt;attr&gt;="&lt;val&gt;"]'.</span>
2069+
&lt;list&gt; = &lt;WebDrv/El&gt;.find_elements(<span class="hljs-string">'xpath'</span>, ) <span class="hljs-comment"># '//&lt;tag&gt;[@&lt;attr&gt;="&lt;val&gt;"]…'. See XPath.</span>
2070+
&lt;str&gt; = &lt;El&gt;.get_attribute(&lt;str&gt;) <span class="hljs-comment"># Property if exists. Also &lt;El&gt;.text.</span>
2071+
&lt;El&gt;.click/clear() <span class="hljs-comment"># Also &lt;El&gt;.send_keys(&lt;str&gt;).</span>
20722072
</code></pre></div>
20732073

20742074

2075-
<div><h4 id="xpathalsoavailableinlxmlscrapyandbrowsersconsoleviadxxpath">XPath — also available in lxml, Scrapy, and browser's console via <code class="python hljs"><span class="hljs-string">'$x("&lt;xpath&gt;")'</span></code>:</h4><pre><code class="python language-python hljs">&lt;xpath&gt; = //&lt;element&gt;[/ <span class="hljs-keyword">or</span> // &lt;element&gt;] <span class="hljs-comment"># /&lt;child&gt;, //&lt;descendant&gt;, /../&lt;siblng&gt;</span>
2076-
&lt;xpath&gt; = //&lt;element&gt;/following::&lt;element&gt; <span class="hljs-comment"># Next element. Also preceding/parent/…</span>
2077-
&lt;element&gt; = &lt;tag&gt;&lt;conditions&gt;&lt;index&gt; <span class="hljs-comment"># `&lt;tag&gt; = */a/…`, `&lt;index&gt; = [1/2/…]`.</span>
2078-
&lt;condition&gt; = [&lt;sub_cond&gt; [<span class="hljs-keyword">and</span>/<span class="hljs-keyword">or</span> &lt;sub_cond&gt;]] <span class="hljs-comment"># For negation use `not(&lt;sub_cond&gt;)`.</span>
2079-
&lt;sub_cond&gt; = @&lt;attr&gt;[=<span class="hljs-string">"&lt;val&gt;"</span>] <span class="hljs-comment"># `text()=`, `.=` match (complete) text.</span>
2080-
&lt;sub_cond&gt; = contains(@&lt;attr&gt;, <span class="hljs-string">"&lt;val&gt;"</span>) <span class="hljs-comment"># Is &lt;val&gt; a substring of attr's value?</span>
2081-
&lt;sub_cond&gt; = [//]&lt;element&gt; <span class="hljs-comment"># Has matching child? Descendant if //.</span>
2075+
<div><h4 id="xpathalsoavailableinlxmlscrapyandbrowsersconsoleviadxxpath">XPath — also available in lxml, Scrapy, and browser's console via <code class="python hljs"><span class="hljs-string">'$x("&lt;xpath&gt;")'</span></code>:</h4><pre><code class="python language-python hljs">&lt;xpath&gt; = //&lt;element&gt;[/ <span class="hljs-keyword">or</span> // &lt;element&gt;] <span class="hljs-comment"># /&lt;child&gt;, //&lt;descendant&gt;, /../&lt;sibling&gt;</span>
2076+
&lt;xpath&gt; = //&lt;element&gt;/following::&lt;element&gt; <span class="hljs-comment"># Next element. Also preceding/parent/…</span>
2077+
&lt;element&gt; = &lt;tag&gt;&lt;conditions&gt;&lt;index&gt; <span class="hljs-comment"># `&lt;tag&gt; = */a/…`, `&lt;index&gt; = [1/2/…]`.</span>
2078+
&lt;condition&gt; = [&lt;sub_cond&gt; [<span class="hljs-keyword">and</span>/<span class="hljs-keyword">or</span> &lt;sub_cond&gt;]] <span class="hljs-comment"># For negation use `not(&lt;sub_cond&gt;)`.</span>
2079+
&lt;sub_cond&gt; = @&lt;attr&gt;[=<span class="hljs-string">"&lt;val&gt;"</span>] <span class="hljs-comment"># `text()=`, `.=` match (complete) text.</span>
2080+
&lt;sub_cond&gt; = contains(@&lt;attr&gt;, <span class="hljs-string">"&lt;val&gt;"</span>) <span class="hljs-comment"># Is &lt;val&gt; a substring of attr's value?</span>
2081+
&lt;sub_cond&gt; = [//]&lt;element&gt; <span class="hljs-comment"># Has matching child? Descendant if //.</span>
20822082
</code></pre></div>
20832083

2084-
<div><h2 id="web"><a href="#web" name="web">#</a>Web</h2><p><strong>Flask is a micro web framework/server. If you just want to open a html file in a web browser use <code class="python hljs"><span class="hljs-string">'webbrowser.open(&lt;path&gt;)'</span></code> instead.</strong></p><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install flask</span>
2084+
<div><h2 id="webapp"><a href="#webapp" name="webapp">#</a>Web App</h2><p><strong>Flask is a micro web framework/server. If you just want to open a html file in a web browser use <code class="python hljs"><span class="hljs-string">'webbrowser.open(&lt;path&gt;)'</span></code> instead.</strong></p><pre><code class="python language-python hljs"><span class="hljs-comment"># $ pip3 install flask</span>
20852085
<span class="hljs-keyword">import</span> flask <span class="hljs-keyword">as</span> fl
20862086
</code></pre></div>
20872087

20882088

2089-
<pre><code class="python language-python hljs">app = fl.Flask(__name__) <span class="hljs-comment"># Returns app object. Put at the top.</span>
2089+
<pre><code class="python language-python hljs">app = fl.Flask(__name__) <span class="hljs-comment"># Returns the app object. Put at the top.</span>
20902090
app.run(host=<span class="hljs-keyword">None</span>, port=<span class="hljs-keyword">None</span>, debug=<span class="hljs-keyword">None</span>) <span class="hljs-comment"># Or: $ flask --app FILE run [--ARG[=VAL] …]</span>
20912091
</code></pre>
20922092
<ul>
@@ -2927,7 +2927,7 @@ <h3 id="format-2">Format</h3><div><h4 id="forstandardtypesizesandmanualalignment
29272927

29282928

29292929
<footer>
2930-
<aside>October 18, 2024</aside>
2930+
<aside>October 25, 2024</aside>
29312931
<a href="https://gto76.github.io" rel="author">Jure Šorn</a>
29322932
</footer>
29332933

pdf/index_for_pdf.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ <h3 id="e">E</h3>
4949
<h3 id="f">F</h3>
5050
<p><strong>files, <a href="#print">22</a>-<a href="#memoryview">29</a>, <a href="#runsabasicfileexplorerintheconsole">34</a>, <a href="#dataframeencodedecode">46</a></strong><br>
5151
<strong>filter function, <a href="#mapfilterreduce">11</a></strong><br>
52-
<strong>flask library, <a href="#web">36</a></strong><br>
52+
<strong>flask library, <a href="#webapp">36</a></strong><br>
5353
<strong>floats, <a href="#abstractbaseclasses">4</a>, <a href="#floats">6</a>, <a href="#numbers">7</a></strong><br>
5454
<strong>format, <a href="#format">6</a>-<a href="#comparisonofpresentationtypes">7</a></strong><br>
5555
<strong>functools module, <a href="#mapfilterreduce">11</a>, <a href="#partial">12</a>, <a href="#debuggerexample">13</a>, <a href="#sortable">16</a></strong> </p>
@@ -143,5 +143,5 @@ <h3 id="t">T</h3>
143143
<strong>type annotations, <a href="#typeannotations">15</a>, <a href="#introspection">32</a></strong> </p>
144144
<h3 id="w">W</h3>
145145
<p><strong>wave module, <a href="#audio">40</a>-<a href="#writefloatsamplestowavfile">41</a></strong><br>
146-
<strong>web, <a href="#web">36</a></strong> </p>
146+
<strong>web, <a href="#webapp">36</a></strong> </p>
147147
</div>

0 commit comments

Comments
 (0)