-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
557 lines (290 loc) · 449 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Stone's Blog</title>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2021-09-06T03:30:08.430Z</updated>
<id>http://yoursite.com/</id>
<author>
<name>Purple M. Stone</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>安装配置Go</title>
<link href="http://yoursite.com/2021/09/06/20210906_setup_%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AEgo/"/>
<id>http://yoursite.com/2021/09/06/20210906_setup_安装配置go/</id>
<published>2021-09-06T03:31:09.000Z</published>
<updated>2021-09-06T03:30:08.430Z</updated>
<content type="html"><![CDATA[<p>按照微软教程安装即可:</p><p><a href="https://docs.microsoft.com/zh-cn/learn/paths/go-first-steps/" target="_blank" rel="noopener">https://docs.microsoft.com/zh-cn/learn/paths/go-first-steps/</a></p><p><strong>踩坑</strong></p><ul><li>国内下载Go链接:</li></ul><p><a href="https://golang.google.cn/dl/" target="_blank" rel="noopener">https://golang.google.cn/dl/</a></p><ul><li>VS Code 安装 Go插件失败解决:</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ go env -w GO111MODULE=on //开启mod</span><br><span class="line">$ go env -w GOPROXY=https://goproxy.cn,direct //设置七牛云goproxy代理</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>按照微软教程安装即可:</p>
<p><a href="https://docs.microsoft.com/zh-cn/learn/paths/go-first-steps/" target="_blank" rel="noopener">https://docs.mic
</summary>
<category term="Setup" scheme="http://yoursite.com/categories/Setup/"/>
<category term="setup" scheme="http://yoursite.com/tags/setup/"/>
</entry>
<entry>
<title>MySQL笔记(8)--存储过程(Stored Procedures)</title>
<link href="http://yoursite.com/2021/05/19/20210519_SQL008/"/>
<id>http://yoursite.com/2021/05/19/20210519_SQL008/</id>
<published>2021-05-19T15:00:09.000Z</published>
<updated>2021-05-20T11:46:43.151Z</updated>
<content type="html"><![CDATA[<h1 id="1-优点"><a href="#1-优点" class="headerlink" title="1 优点"></a>1 优点</h1><blockquote><p>Store and organize SQL<br>Faster execution<br>Data security</p></blockquote><h1 id="2-创建一个存储过程"><a href="#2-创建一个存储过程" class="headerlink" title="2 创建一个存储过程"></a>2 创建一个存储过程</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> get_clients()</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> clients;<span class="comment">-- body of procedure</span></span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;<span class="comment">-- 将分隔符定义回分号</span></span><br></pre></td></tr></table></figure><p>DELIMITER 重定义分隔符, 也就是将新分隔符包含的内容视为一个unit, 而不是将”;”结束的一个个语句视为unit.</p><p>调用存储过程:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CALL</span> get_clients()</span><br></pre></td></tr></table></figure><h1 id="3-删除存储过程"><a href="#3-删除存储过程" class="headerlink" title="3 删除存储过程"></a>3 删除存储过程</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> get_clients;</span><br></pre></td></tr></table></figure><p><strong>创建存储过程的基本框架</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> get_clients;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> get_clients()</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> clients;</span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><h1 id="4-参数"><a href="#4-参数" class="headerlink" title="4 参数"></a>4 参数</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> get_clients_by_state;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> get_clients_by_state</span><br><span class="line">(</span><br><span class="line"> state <span class="built_in">CHAR</span>(<span class="number">2</span>)</span><br><span class="line">)</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> clients c</span><br><span class="line"> <span class="keyword">WHERE</span> c.state = state;</span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><p>调用:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CALL</span> get_clients_by_state(<span class="string">'CA'</span>)</span><br></pre></td></tr></table></figure><h2 id="4-1-带默认值的参数"><a href="#4-1-带默认值的参数" class="headerlink" title="4.1 带默认值的参数"></a>4.1 带默认值的参数</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> get_clients_by_state;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> get_clients_by_state</span><br><span class="line">(</span><br><span class="line"> state <span class="built_in">CHAR</span>(<span class="number">2</span>)</span><br><span class="line">)</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">IF</span> state <span class="keyword">IS</span> <span class="literal">NULL</span> <span class="keyword">THEN</span><span class="comment">----------</span></span><br><span class="line"> <span class="keyword">SET</span> state = <span class="string">'CA'</span>;<span class="comment">----------</span></span><br><span class="line"><span class="keyword">END</span> <span class="keyword">IF</span>;<span class="comment">----------</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> clients c</span><br><span class="line"> <span class="keyword">WHERE</span> c.state = state;</span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><p>调用:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CALL</span> get_clients_by_state(<span class="literal">NULL</span>)</span><br></pre></td></tr></table></figure><p><strong>IF-ELSE</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> get_clients_by_state;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> get_clients_by_state</span><br><span class="line">(</span><br><span class="line"> state <span class="built_in">CHAR</span>(<span class="number">2</span>)</span><br><span class="line">)</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">IF</span> state <span class="keyword">IS</span> <span class="literal">NULL</span> <span class="keyword">THEN</span></span><br><span class="line"> <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> clients;</span><br><span class="line">ELSE</span><br><span class="line"> <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> clients c</span><br><span class="line"> <span class="keyword">WHERE</span> c.state = state;</span><br><span class="line"><span class="keyword">END</span> <span class="keyword">IF</span>;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><p>更简洁的写法:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> get_clients_by_state;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> get_clients_by_state</span><br><span class="line">(</span><br><span class="line"> state <span class="built_in">CHAR</span>(<span class="number">2</span>)</span><br><span class="line">)</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">SELECT</span> * <span class="keyword">FROM</span> clients c</span><br><span class="line"> <span class="keyword">WHERE</span> c.state = <span class="keyword">IFNULL</span>(state, c.state); </span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><p>IFNULL(state, c.state) 如果 state = NULL,则返回 c.state,而 c.state = c.state 永远为 TRUE</p><h2 id="4-2-参数验证"><a href="#4-2-参数验证" class="headerlink" title="4.2 参数验证"></a>4.2 参数验证</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> make_payment;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> make_payment(</span><br><span class="line"> invoice_id <span class="built_in">INT</span>,</span><br><span class="line"> payment_amount <span class="built_in">DECIMAL</span>(<span class="number">9</span>, <span class="number">2</span>),</span><br><span class="line"> payment_date <span class="built_in">DATE</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">IF</span> payment_amount <= <span class="number">0</span> <span class="keyword">THEN</span></span><br><span class="line"> SIGNAL <span class="keyword">SQLSTATE</span> <span class="string">'22003'</span> <span class="comment">-- 错误码</span></span><br><span class="line"> <span class="keyword">SET</span> MESSAGE_TEXT = <span class="string">'Invalid payment amount'</span>;<span class="comment">-- 输出错误信息</span></span><br><span class="line"><span class="keyword">END</span> <span class="keyword">IF</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">UPDATE</span> invoices i</span><br><span class="line"> <span class="keyword">SET</span></span><br><span class="line"> i.payment_total = payment_amount,</span><br><span class="line"> i.payment_date = payment_date</span><br><span class="line"><span class="keyword">WHERE</span> i.invoice_id = invoice_id;</span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><h2 id="4-3-输出参数"><a href="#4-3-输出参数" class="headerlink" title="4.3 输出参数"></a>4.3 输出参数</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> get_unpaid_invoices_for_client;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> get_unpaid_invoices_for_client(</span><br><span class="line"> client_id <span class="built_in">INT</span>,</span><br><span class="line"> <span class="keyword">OUT</span> invoices_count <span class="built_in">INT</span>,<span class="comment">-- ----------------</span></span><br><span class="line"> <span class="keyword">OUT</span> invoices_total <span class="built_in">DECIMAL</span>(<span class="number">9</span>, <span class="number">2</span>)<span class="comment">-- ----------------</span></span><br><span class="line">)</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">SELECT</span> <span class="keyword">COUNT</span>(*), <span class="keyword">SUM</span>(invoice_total)</span><br><span class="line"><span class="keyword">INTO</span> invoices_count, invoices_total<span class="comment">-- ----------------</span></span><br><span class="line"> <span class="keyword">FROM</span> invoices i</span><br><span class="line"> <span class="keyword">WHERE</span> i.client_id = client_id</span><br><span class="line"> <span class="keyword">AND</span> payment_total = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><p>调用:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">set</span> @invoices_count = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">set</span> @invoices_total = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">call</span> sql_invoicing.get_unpaid_invoices_for_client</span><br><span class="line"> (<span class="number">3</span>, @invoices_count, @invoices_total);</span><br><span class="line"><span class="keyword">select</span> @invoices_count, @invoices_total;</span><br></pre></td></tr></table></figure><h1 id="5-变量"><a href="#5-变量" class="headerlink" title="5 变量"></a>5 变量</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- User or session variables</span></span><br><span class="line"><span class="keyword">set</span> @invoices_count = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- Local variable</span></span><br><span class="line"><span class="comment">-- 在存储过程或函数中定义</span></span><br></pre></td></tr></table></figure><p><strong>Demo</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> get_risk_factor;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> get_risk_factor()</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="comment">-- Local variables</span></span><br><span class="line"> <span class="keyword">DECLARE</span> risk_factor <span class="built_in">DECIMAL</span>(<span class="number">9</span>, <span class="number">2</span>) <span class="keyword">DEFAULT</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">DECLARE</span> invoices_total <span class="built_in">DECIMAL</span>(<span class="number">9</span>, <span class="number">2</span>);</span><br><span class="line"> <span class="keyword">DECLARE</span> invoices_count <span class="built_in">INT</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">SELECT</span> <span class="keyword">COUNT</span>(*), <span class="keyword">SUM</span>(invoice_total)</span><br><span class="line"> <span class="keyword">INTO</span> invoices_count, invoices_total</span><br><span class="line"> <span class="keyword">FROM</span> invoices;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">SET</span> risk_factor = invoices_total / invoices_count * <span class="number">5</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">SELECT</span> risk_factor;</span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><h1 id="6-函数"><a href="#6-函数" class="headerlink" title="6 函数"></a>6 函数</h1><blockquote><p>函数:只能返回单一值<br>存储过程:可以返回拥有多行多列的结果集</p><p>👉 函数属性</p><ul><li>DETERMINISTIC: 一样的输入总是会返回一样的输出</li><li>READS SQL DATA: 函数中有读sql数据的内容</li><li>MODIFIES SQL DATA:函数中有修改sql数据的内容 </li></ul></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">FUNCTION</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> get_risk_factor_for_client;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">FUNCTION</span> get_risk_factor_for_client</span><br><span class="line">(</span><br><span class="line"> client_id <span class="built_in">INT</span></span><br><span class="line">) </span><br><span class="line"><span class="keyword">RETURNS</span> <span class="built_in">int</span></span><br><span class="line"><span class="keyword">READS</span> <span class="keyword">SQL</span> <span class="keyword">DATA</span></span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">DECLARE</span> risk_factor <span class="built_in">DECIMAL</span>(<span class="number">9</span>, <span class="number">2</span>) <span class="keyword">DEFAULT</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">DECLARE</span> invoices_total <span class="built_in">DECIMAL</span>(<span class="number">9</span>, <span class="number">2</span>);</span><br><span class="line"> <span class="keyword">DECLARE</span> invoices_count <span class="built_in">INT</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">SELECT</span> <span class="keyword">COUNT</span>(*), <span class="keyword">SUM</span>(invoice_total)</span><br><span class="line"> <span class="keyword">INTO</span> invoices_count, invoices_total</span><br><span class="line"> <span class="keyword">FROM</span> invoices i</span><br><span class="line"> <span class="keyword">WHERE</span> i.client_id = client_id;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">SET</span> risk_factor = invoices_total / invoices_count * <span class="number">5</span>;</span><br><span class="line"> RETURN IFNULL(risk_factor, 0);</span><br><span class="line"><span class="keyword">END</span>$$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><p>使用函数:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> client_id,</span><br><span class="line"> <span class="keyword">name</span>,</span><br><span class="line"> get_risk_factor_for_client(client_id) <span class="keyword">AS</span> risk_factor</span><br><span class="line"><span class="keyword">FROM</span> clients</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h1 id="1-优点"><a href="#1-优点" class="headerlink" title="1 优点"></a>1 优点</h1><blockquote>
<p>Store and organize SQL<br>Faster execution<br>Dat
</summary>
<category term="Database" scheme="http://yoursite.com/categories/Database/"/>
<category term="job notes-database" scheme="http://yoursite.com/tags/job-notes-database/"/>
</entry>
<entry>
<title>MySQL笔记(9)--触发器(Triggers)</title>
<link href="http://yoursite.com/2021/05/19/20210520_SQL009/"/>
<id>http://yoursite.com/2021/05/19/20210520_SQL009/</id>
<published>2021-05-19T15:00:09.000Z</published>
<updated>2021-05-20T11:39:16.033Z</updated>
<content type="html"><![CDATA[<blockquote><p><strong>Trigger</strong>: A block of SQL code that automatically gets executed before or after an insert, update or delete statement.</p><p>To enhance data consistency</p></blockquote><h1 id="1-设置触发器"><a href="#1-设置触发器" class="headerlink" title="1 设置触发器"></a>1 设置触发器</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">DELIMITER $$</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TRIGGER</span> payments_after_insert</span><br><span class="line"> <span class="keyword">AFTER</span> <span class="keyword">INSERT</span> <span class="keyword">ON</span> payments</span><br><span class="line"> <span class="keyword">FOR</span> <span class="keyword">EACH</span> <span class="keyword">ROW</span><span class="comment">-- 作用于受影响的每一行</span></span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">UPDATE</span> invoices</span><br><span class="line"> <span class="keyword">SET</span> payment_total = payment_total + NEW.amount</span><br><span class="line"> <span class="keyword">WHERE</span> invoice_id = NEW.invoice_id;</span><br><span class="line"><span class="keyword">END</span> $$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><p>可以触发除了 payments 之外的任何表的更新。NEW表示新 insert 的 payment (amount是payments 表的 column)。如果是DELETE,就用 OLD 表示删除的行。</p><h1 id="2-查看触发器"><a href="#2-查看触发器" class="headerlink" title="2 查看触发器"></a>2 查看触发器</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SHOW</span> <span class="keyword">TRIGGERS</span> <span class="keyword">LIKE</span> <span class="string">'payments%'</span><span class="comment">-- show filtered triggers</span></span><br></pre></td></tr></table></figure><h1 id="3-删除触发器"><a href="#3-删除触发器" class="headerlink" title="3 删除触发器"></a>3 删除触发器</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">TRIGGER</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> payments_after_insert</span><br></pre></td></tr></table></figure><h1 id="4-使用触发器进行审计"><a href="#4-使用触发器进行审计" class="headerlink" title="4 使用触发器进行审计"></a>4 使用触发器进行审计</h1><p><strong>使用触发器进行记录</strong></p><p>首先建立审计表:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_invoicing;</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> payments_audit</span><br><span class="line">(</span><br><span class="line"> client_id <span class="built_in">INT</span> <span class="keyword">NOT</span> <span class="literal">NULL</span>,</span><br><span class="line"> <span class="built_in">date</span> <span class="built_in">DATE</span> <span class="keyword">NOT</span> <span class="literal">NULL</span>,</span><br><span class="line"> amount <span class="built_in">DECIMAL</span>(<span class="number">9</span>, <span class="number">2</span>) <span class="keyword">NOT</span> <span class="literal">NULL</span>,</span><br><span class="line"> action_type <span class="built_in">VARCHAR</span>(<span class="number">50</span>) <span class="keyword">NOT</span> <span class="literal">NULL</span>,</span><br><span class="line"> action_date DATETIME <span class="keyword">NOT</span> <span class="literal">NULL</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>假如有这两个触发器:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">TRIGGER</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> payments_after_insert;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TRIGGER</span> payments_after_insert</span><br><span class="line"> <span class="keyword">AFTER</span> <span class="keyword">INSERT</span> <span class="keyword">ON</span> payments</span><br><span class="line"> <span class="keyword">FOR</span> <span class="keyword">EACH</span> <span class="keyword">ROW</span></span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">UPDATE</span> invoices</span><br><span class="line"> <span class="keyword">SET</span> payment_total = payment_total + NEW.amount</span><br><span class="line"> <span class="keyword">WHERE</span> invoice_id = NEW.invoice_id;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">INSERT</span> <span class="keyword">INTO</span> payments_audit</span><br><span class="line"> <span class="keyword">VALUES</span> (NEW.client_id, NEW.date, NEW.amount, <span class="string">'Insert'</span>, <span class="keyword">NOW</span>());</span><br><span class="line"><span class="keyword">END</span> $$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">TRIGGER</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> payments_after_delete;</span><br><span class="line"></span><br><span class="line">DELIMITER $$</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TRIGGER</span> payments_after_delete</span><br><span class="line"> <span class="keyword">AFTER</span> <span class="keyword">DELETE</span> <span class="keyword">ON</span> payments</span><br><span class="line"> <span class="keyword">FOR</span> <span class="keyword">EACH</span> <span class="keyword">ROW</span></span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">UPDATE</span> invoices</span><br><span class="line"> <span class="keyword">SET</span> payment_total = payment_total - OLD.amount</span><br><span class="line"> <span class="keyword">WHERE</span> invoice_id = OLD.invoice_id;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">INSERT</span> <span class="keyword">INTO</span> payments_audit</span><br><span class="line"> <span class="keyword">VALUES</span> (OLD.client_id, OLD.date, OLD.amount, <span class="string">'Delete'</span>, <span class="keyword">NOW</span>());</span><br><span class="line"><span class="keyword">END</span> $$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><p>然后触发事件发生:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> payments</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="keyword">DEFAULT</span>, <span class="number">5</span>, <span class="number">3</span>, <span class="string">'2019-01-01'</span>, <span class="number">10</span>, <span class="number">1</span>)</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DELETE</span> <span class="keyword">FROM</span> payments</span><br><span class="line"><span class="keyword">WHERE</span> payment_id = <span class="number">11</span></span><br></pre></td></tr></table></figure><p>刷新审计表可以看到:</p><div class="table-container"><table><thead><tr><th>client_id</th><th>date</th><th>amount</th><th>action_type</th><th>action_date</th></tr></thead><tbody><tr><td>5</td><td>2019-01-01</td><td>10.00</td><td>Insert</td><td>2021-05-20 19:12:31</td></tr><tr><td>5</td><td>2019-01-01</td><td>10.00</td><td>Delete</td><td>2021-05-20 19:13:31</td></tr></tbody></table></div><h1 id="5-事件"><a href="#5-事件" class="headerlink" title="5 事件"></a>5 事件</h1><blockquote><p><strong>Event</strong>: A task (or block of SQL code) that gets executed according to a <strong>schedule</strong>.</p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SHOW</span> <span class="keyword">VARIABLES</span> <span class="keyword">LIKE</span> <span class="string">'event%'</span><span class="comment">-- 查看命名中有event的变量</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SET</span> <span class="keyword">GLOBAL</span> event_scheduler = <span class="keyword">OFF</span><span class="comment">-- 关掉它</span></span><br></pre></td></tr></table></figure><p><strong>Demo</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">DELIMITER $$</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">EVENT</span> yearly_delete_stale_audit_rows <span class="comment">-- 每年触发一次:yearly开头</span></span><br><span class="line"><span class="keyword">ON</span> SCHEDULE</span><br><span class="line"> EVERY <span class="number">1</span> <span class="keyword">YEAR</span> STARTS <span class="string">'2019-01-01'</span> ENDS <span class="string">'2029-01-01'</span></span><br><span class="line"><span class="keyword">DO</span> <span class="keyword">BEGIN</span></span><br><span class="line"> <span class="keyword">DELETE</span> <span class="keyword">FROM</span> payments_audit</span><br><span class="line"> <span class="keyword">WHERE</span> action_date < <span class="keyword">NOW</span>() - <span class="built_in">INTERVAL</span> <span class="number">1</span> <span class="keyword">YEAR</span>; <span class="comment">-- 删除所有超过一年的审计记录</span></span><br><span class="line"><span class="keyword">END</span> $$</span><br><span class="line"></span><br><span class="line">DELIMITER ;</span><br></pre></td></tr></table></figure><h1 id="6-查看,删除和更改事件"><a href="#6-查看,删除和更改事件" class="headerlink" title="6 查看,删除和更改事件"></a>6 查看,删除和更改事件</h1><p><strong>查看事件</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SHOW</span> <span class="keyword">EVENTS</span> <span class="keyword">LIKE</span> <span class="string">'yearly%'</span>;</span><br></pre></td></tr></table></figure><p><strong>删除事件</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">EVENT</span> <span class="keyword">IF</span> <span class="keyword">EXISTS</span> yearly_delete_stale_audit_rows;</span><br></pre></td></tr></table></figure><p><strong>更改事件</strong></p><p>ALTER EVENT:跟 CREATE EVENT 语法一样。</p><p>可以用来展示启用/禁用事件:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">EVENT</span> yearly_delete_stale_audit_rows <span class="keyword">ENABLE</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">EVENT</span> yearly_delete_stale_audit_rows <span class="keyword">DISABLE</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<blockquote>
<p><strong>Trigger</strong>: A block of SQL code that automatically gets executed before or after an insert, update or delete s
</summary>
<category term="Database" scheme="http://yoursite.com/categories/Database/"/>
<category term="job notes-database" scheme="http://yoursite.com/tags/job-notes-database/"/>
</entry>
<entry>
<title>MySQL笔记(7)--视图(Views)</title>
<link href="http://yoursite.com/2021/05/19/20210519_SQL007/"/>
<id>http://yoursite.com/2021/05/19/20210519_SQL007/</id>
<published>2021-05-19T13:00:09.000Z</published>
<updated>2021-05-19T14:27:44.886Z</updated>
<content type="html"><![CDATA[<h1 id="1-创建视图"><a href="#1-创建视图" class="headerlink" title="1 创建视图"></a>1 创建视图</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_invoicing;</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> sales_by_client <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> c.client_id,</span><br><span class="line"> c.name,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales</span><br><span class="line"><span class="keyword">FROM</span> clients c</span><br><span class="line"><span class="keyword">JOIN</span> invoices i <span class="keyword">USING</span> (client_id)</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> client_id, <span class="keyword">name</span></span><br></pre></td></tr></table></figure><p>可以在”Views”看到这个视图.可以像使用table一样用视图.</p><h1 id="2-更改或删除视图"><a href="#2-更改或删除视图" class="headerlink" title="2 更改或删除视图"></a>2 更改或删除视图</h1><p><strong>删除视图</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">VIEW</span> sales_by_client</span><br></pre></td></tr></table></figure><p><strong>更改视图</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_invoicing;</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">OR</span> <span class="keyword">REPLACE</span> <span class="keyword">VIEW</span> sales_by_client <span class="keyword">AS</span> <span class="comment">-- create or replace</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> c.client_id,</span><br><span class="line"> c.name,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales</span><br><span class="line"><span class="keyword">FROM</span> clients c</span><br><span class="line"><span class="keyword">JOIN</span> invoices i <span class="keyword">USING</span> (client_id)</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> client_id, <span class="keyword">name</span></span><br></pre></td></tr></table></figure><h1 id="3-可更新视图"><a href="#3-可更新视图" class="headerlink" title="3 可更新视图"></a>3 可更新视图</h1><p>如果视图中没有:</p><blockquote><p>DISTINCT<br>Aggregate Functions (MIN, MAX, SUM)<br>GROUP BY / HAVING<br>UNION</p></blockquote><p>就是可更新视图,就可以增删改:</p><p>比如:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">OR</span> <span class="keyword">REPLACE</span> <span class="keyword">VIEW</span> invoices_with_balance <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> invoice_id,</span><br><span class="line"> <span class="built_in">number</span>,</span><br><span class="line"> client_id,</span><br><span class="line"> invoice_total,</span><br><span class="line"> payment_total,</span><br><span class="line"> invoice_total - payment_total <span class="keyword">AS</span> balance,</span><br><span class="line"> due_date,</span><br><span class="line"> payment_date</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> (invoice_total - payment_total) > <span class="number">0</span></span><br></pre></td></tr></table></figure><p>invoices_with_balance 就是可更新视图,可以增删改:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DELETE</span> <span class="keyword">FROM</span> invoices_with_balance</span><br><span class="line"><span class="keyword">WHERE</span> invoice_id = <span class="number">1</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> invoices_with_balance</span><br><span class="line"><span class="keyword">SET</span> due_date = <span class="keyword">DATE_ADD</span>(due_date, <span class="built_in">INTERVAL</span> <span class="number">5</span> <span class="keyword">DAY</span>)</span><br><span class="line"><span class="keyword">WHERE</span> invoice_id = <span class="number">2</span></span><br></pre></td></tr></table></figure><h1 id="4-WITH-OPTION-CHECK-子句"><a href="#4-WITH-OPTION-CHECK-子句" class="headerlink" title="4 WITH OPTION CHECK 子句"></a>4 WITH OPTION CHECK 子句</h1><p>上例中,进行如下更改:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> invoices_with_balance</span><br><span class="line"><span class="keyword">SET</span> payment_total = invoice_total</span><br><span class="line"><span class="keyword">WHERE</span> invoice_id = <span class="number">2</span></span><br></pre></td></tr></table></figure><p>该视图中 invoice_id = 2 的行消失了(因为不再满足(invoice_total - payment_total) > 0的条件)</p><p>如果不想 UPDATE 或 DELETE 语句使得某些行从视图中删除, 就这样:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">OR</span> <span class="keyword">REPLACE</span> <span class="keyword">VIEW</span> invoices_with_balance <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> invoice_id,</span><br><span class="line"> <span class="built_in">number</span>,</span><br><span class="line"> client_id,</span><br><span class="line"> invoice_total,</span><br><span class="line"> payment_total,</span><br><span class="line"> invoice_total - payment_total <span class="keyword">AS</span> balance,</span><br><span class="line"> due_date,</span><br><span class="line"> payment_date</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> (invoice_total - payment_total) > <span class="number">0</span></span><br><span class="line"><span class="keyword">WITH</span> <span class="keyword">CHECK</span> <span class="keyword">OPTION</span><span class="comment">-- 增加这个子句,防止删除行</span></span><br></pre></td></tr></table></figure><p>后面再执行这样的:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> invoices_with_balance</span><br><span class="line"><span class="keyword">SET</span> payment_total = invoice_total</span><br><span class="line"><span class="keyword">WHERE</span> invoice_id = <span class="number">3</span></span><br></pre></td></tr></table></figure><p>就会报错: </p><blockquote><p>Error Code: 1369. CHECK OPTION failed</p></blockquote><h1 id="5-视图的优点"><a href="#5-视图的优点" class="headerlink" title="5 视图的优点"></a>5 视图的优点</h1><blockquote><p>Simplify queries<br>Reduce the impact of changes<br>Restrict access to the data</p></blockquote>]]></content>
<summary type="html">
<h1 id="1-创建视图"><a href="#1-创建视图" class="headerlink" title="1 创建视图"></a>1 创建视图</h1><figure class="highlight sql"><table><tr><td class="gutte
</summary>
<category term="Database" scheme="http://yoursite.com/categories/Database/"/>
<category term="job notes-database" scheme="http://yoursite.com/tags/job-notes-database/"/>
</entry>
<entry>
<title>MySQL笔记(6)--MySQL的基本函数</title>
<link href="http://yoursite.com/2021/05/19/20210519_SQL006/"/>
<id>http://yoursite.com/2021/05/19/20210519_SQL006/</id>
<published>2021-05-19T11:50:09.000Z</published>
<updated>2021-05-19T12:14:20.513Z</updated>
<content type="html"><![CDATA[<h1 id="1-数值函数"><a href="#1-数值函数" class="headerlink" title="1 数值函数"></a>1 数值函数</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">ROUND</span>(<span class="number">5.7355</span>, <span class="number">2</span>) <span class="comment">-- 保留小数点后2位, 四舍五入: 5.74</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">TRUNCATE</span>(<span class="number">5.7355</span>, <span class="number">2</span>) <span class="comment">-- 保留小数点后2位: 5.73</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">CEILING</span>(<span class="number">5.2</span>)<span class="comment">-- 6 (上取整)</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">FLOOR</span>(<span class="number">5.7</span>)<span class="comment">-- 5 (下取整)</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">ABS</span>(<span class="number">-5.2</span>)<span class="comment">-- 求绝对值</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">RAND</span>()<span class="comment">-- 得到0~1的随机值</span></span><br></pre></td></tr></table></figure><h1 id="2-字符串函数"><a href="#2-字符串函数" class="headerlink" title="2 字符串函数"></a>2 字符串函数</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">LENGTH</span>(<span class="string">'sky'</span>) <span class="comment">-- 3</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">UPPER</span>(<span class="string">'sky'</span>) <span class="comment">-- SKY</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">LOWER</span>(<span class="string">'Sky'</span>)<span class="comment">-- sky</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">LTRIM</span>(<span class="string">' Sky'</span>)<span class="comment">-- 去除左边的空格:Sky</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">RTRIM</span>(<span class="string">'Sky '</span>)<span class="comment">-- 去除右边的空格:Sky</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">TRIM</span>(<span class="string">' Sky '</span>)<span class="comment">-- 去除两边的空格:Sky</span></span><br></pre></td></tr></table></figure><p><strong>子串</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">LEFT</span>(<span class="string">'Kindergarten'</span>, <span class="number">4</span>)<span class="comment">-- Kind</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">RIGHT</span>(<span class="string">'Kindergarten'</span>, <span class="number">6</span>)<span class="comment">-- garten</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">SUBSTRING</span>(<span class="string">'Kindergarten'</span>, <span class="number">3</span>, <span class="number">5</span>)<span class="comment">-- nderg</span></span><br></pre></td></tr></table></figure><p><strong>查找位置</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">LOCATE</span>(<span class="string">'N'</span>, <span class="string">'Kindergarten'</span>) <span class="comment">-- 3 不区分大小写,若不在字符串中则返回0</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">LOCATE</span>(<span class="string">'garten'</span>, <span class="string">'Kindergarten'</span>)<span class="comment">-- 7</span></span><br></pre></td></tr></table></figure><p><strong>替换</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">REPLACE</span>(<span class="string">'Kindergarten'</span>, <span class="string">'garten'</span>, <span class="string">'garden'</span>)<span class="comment">-- Kindergarden</span></span><br></pre></td></tr></table></figure><p><strong>拼接</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">CONCAT</span>(<span class="string">'first'</span>, <span class="string">'last'</span>)<span class="comment">-- firstlast</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_store;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">CONCAT</span>(first_name, <span class="string">' '</span>, last_name) <span class="keyword">AS</span> full_name</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br></pre></td></tr></table></figure><h1 id="3-日期"><a href="#3-日期" class="headerlink" title="3 日期"></a>3 日期</h1><h2 id="3-1-日期函数"><a href="#3-1-日期函数" class="headerlink" title="3.1 日期函数"></a>3.1 日期函数</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">NOW</span>(), <span class="keyword">CURDATE</span>(), <span class="keyword">CURTIME</span>()</span><br></pre></td></tr></table></figure><div class="table-container"><table><thead><tr><th>NOW()</th><th>CURDATE()</th><th>CURTIME()</th></tr></thead><tbody><tr><td>2021-05-19 19:08:56</td><td>2021-05-19</td><td>19:08:56</td></tr></tbody></table></div><p><strong>获取指定的时间构成元素</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">YEAR</span>(<span class="keyword">NOW</span>())<span class="comment">-- 2021</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">MONTH</span>(<span class="keyword">NOW</span>())<span class="comment">-- 5</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DAY</span>(<span class="keyword">NOW</span>())<span class="comment">-- 19</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">HOUR</span>(<span class="keyword">NOW</span>())<span class="comment">-- 19</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">MINUTE</span>(<span class="keyword">NOW</span>())<span class="comment">-- 08</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">SECOND</span>(<span class="keyword">NOW</span>())<span class="comment">-- 56</span></span><br></pre></td></tr></table></figure><p><strong>获取时间的字符串</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DAYNAME</span>(<span class="keyword">NOW</span>()), MONTHNAME(<span class="keyword">NOW</span>())</span><br></pre></td></tr></table></figure><div class="table-container"><table><thead><tr><th>DAYNAME(NOW())</th><th>MONTHNAME(NOW())</th></tr></thead><tbody><tr><td>Wednesday</td><td>May</td></tr></tbody></table></div><p><strong>EXTRACT</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">EXTRACT</span>(<span class="keyword">DAY</span> <span class="keyword">FROM</span> <span class="keyword">NOW</span>()) <span class="comment">-- 19</span></span><br></pre></td></tr></table></figure><h2 id="3-2-格式化日期和时间"><a href="#3-2-格式化日期和时间" class="headerlink" title="3.2 格式化日期和时间"></a>3.2 格式化日期和时间</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DATE_FORMAT</span>(<span class="keyword">NOW</span>(), <span class="string">'%M %d %Y'</span>)</span><br></pre></td></tr></table></figure><blockquote><p>May 19 2021</p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DATE_FORMAT</span>(<span class="keyword">NOW</span>(), <span class="string">'%H:%i %p'</span>)</span><br></pre></td></tr></table></figure><blockquote><p>19:17 PM</p></blockquote><h2 id="3-3-计算日期和时间"><a href="#3-3-计算日期和时间" class="headerlink" title="3.3 计算日期和时间"></a>3.3 计算日期和时间</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DATE_ADD</span>(<span class="keyword">NOW</span>(), <span class="built_in">INTERVAL</span> <span class="number">1</span> <span class="keyword">DAY</span>)<span class="comment">-- 2021-05-20 19:21:32</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DATE_ADD</span>(<span class="keyword">NOW</span>(), <span class="built_in">INTERVAL</span> <span class="number">1</span> <span class="keyword">YEAR</span>)<span class="comment">-- 2022-05-19 19:21:32</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DATE_SUB</span>(<span class="keyword">NOW</span>(), <span class="built_in">INTERVAL</span> <span class="number">1</span> <span class="keyword">YEAR</span>)<span class="comment">-- 2020-05-19 19:21:32</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DATEDIFF</span>(<span class="string">'2021-01-05'</span>, <span class="string">'2021-01-01'</span>)<span class="comment">-- 4</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> TIME_TO_SEC(<span class="string">'09:00'</span>) - TIME_TO_SEC(<span class="string">'09:02'</span>) <span class="comment">-- -120 (单位:秒)</span></span><br></pre></td></tr></table></figure><h1 id="4-IFNULL-和-COALESCE"><a href="#4-IFNULL-和-COALESCE" class="headerlink" title="4 IFNULL 和 COALESCE"></a>4 IFNULL 和 COALESCE</h1><p><strong>IFNULL</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_store;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> order_id,</span><br><span class="line"> <span class="keyword">IFNULL</span>(shipper_id, <span class="string">'Not assigned'</span>) <span class="keyword">AS</span> shipper</span><br><span class="line"><span class="keyword">FROM</span> orders</span><br></pre></td></tr></table></figure><p>IFNULL(shipper_id, ‘Not assigned’) 即如果shipper_id为NULL, 就改为’Not assigned’</p><p>输出:</p><div class="table-container"><table><thead><tr><th>order_id</th><th>shipper</th></tr></thead><tbody><tr><td>1</td><td>Not assigned</td></tr><tr><td>3</td><td>Not assigned</td></tr><tr><td>8</td><td>Not assigned</td></tr><tr><td>9</td><td>1</td></tr><tr><td>2</td><td>4</td></tr></tbody></table></div><p><strong>COALESCE</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_store;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> order_id,</span><br><span class="line"> <span class="keyword">COALESCE</span>(shipper_id, comments, <span class="string">'Not assigned'</span>) <span class="keyword">AS</span> shipper</span><br><span class="line"><span class="keyword">FROM</span> orders</span><br></pre></td></tr></table></figure><p>如果shipper_id为空,就返回comments中的值,如果comments也为空,则返回’Not assigned’.</p><h1 id="5-IF-函数"><a href="#5-IF-函数" class="headerlink" title="5 IF 函数"></a>5 IF 函数</h1><p>格式:</p><blockquote><p>IF(expression, first, second)<br>如果expression为真,返回first, 为假则返回second</p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> order_id,</span><br><span class="line"> order_date,</span><br><span class="line"> <span class="keyword">IF</span>(</span><br><span class="line"> <span class="keyword">YEAR</span>(order_date) = <span class="keyword">YEAR</span>(<span class="keyword">DATE_SUB</span>(<span class="keyword">NOW</span>(), <span class="built_in">INTERVAL</span> <span class="number">2</span> <span class="keyword">YEAR</span>)),</span><br><span class="line"> <span class="string">'Active'</span>,</span><br><span class="line"> <span class="string">'Archived'</span>) <span class="keyword">AS</span> <span class="keyword">category</span></span><br><span class="line"><span class="keyword">FROM</span> orders</span><br></pre></td></tr></table></figure><p>当前年份为2021, 所以2019的为’Active’ (Mosh制作视频时为2019), 其他都是’Archived’:</p><div class="table-container"><table><thead><tr><th>order_id</th><th>order_date</th><th>category</th></tr></thead><tbody><tr><td>1</td><td>2019-01-30</td><td>Active</td></tr><tr><td>2</td><td>2018-08-02</td><td>Archived</td></tr><tr><td>3</td><td>2017-12-01</td><td>Archived</td></tr><tr><td>4</td><td>2017-01-22</td><td>Archived</td></tr><tr><td>5</td><td>2017-08-25</td><td>Archived</td></tr></tbody></table></div><h1 id="6-CASE-运算符"><a href="#6-CASE-运算符" class="headerlink" title="6 CASE 运算符"></a>6 CASE 运算符</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> order_id,</span><br><span class="line"> <span class="keyword">CASE</span></span><br><span class="line"> <span class="keyword">WHEN</span> <span class="keyword">YEAR</span>(order_date) = <span class="keyword">YEAR</span>(<span class="keyword">NOW</span>()) - <span class="number">2</span> <span class="keyword">THEN</span> <span class="string">'Active'</span></span><br><span class="line"> <span class="keyword">WHEN</span> <span class="keyword">YEAR</span>(order_date) = <span class="keyword">YEAR</span>(<span class="keyword">NOW</span>()) - <span class="number">3</span> <span class="keyword">THEN</span> <span class="string">'Last Year'</span></span><br><span class="line"> <span class="keyword">WHEN</span> <span class="keyword">YEAR</span>(order_date) < <span class="keyword">YEAR</span>(<span class="keyword">NOW</span>()) - <span class="number">3</span> <span class="keyword">THEN</span> <span class="string">'Archived'</span></span><br><span class="line"> <span class="keyword">ELSE</span> <span class="string">'Future'</span></span><br><span class="line"><span class="keyword">END</span> <span class="keyword">AS</span> <span class="keyword">category</span></span><br><span class="line"><span class="keyword">FROM</span> orders</span><br></pre></td></tr></table></figure><p>输出:</p><div class="table-container"><table><thead><tr><th>order_id</th><th>category</th></tr></thead><tbody><tr><td>1</td><td>Active</td></tr><tr><td>2</td><td>Last Year</td></tr><tr><td>3</td><td>Archived</td></tr><tr><td>4</td><td>Archived</td></tr><tr><td>5</td><td>Archived</td></tr><tr><td>6</td><td>Last Year</td></tr><tr><td>7</td><td>Last Year</td></tr><tr><td>8</td><td>Last Year</td></tr><tr><td>9</td><td>Archived</td></tr><tr><td>10</td><td>Last Year</td></tr></tbody></table></div>]]></content>
<summary type="html">
<h1 id="1-数值函数"><a href="#1-数值函数" class="headerlink" title="1 数值函数"></a>1 数值函数</h1><figure class="highlight sql"><table><tr><td class="gutte
</summary>
<category term="Database" scheme="http://yoursite.com/categories/Database/"/>
<category term="job notes-database" scheme="http://yoursite.com/tags/job-notes-database/"/>
</entry>
<entry>
<title>MySQL笔记(5)--编写复杂查询</title>
<link href="http://yoursite.com/2021/05/18/20210518_SQL005/"/>
<id>http://yoursite.com/2021/05/18/20210518_SQL005/</id>
<published>2021-05-18T13:50:09.000Z</published>
<updated>2021-05-19T09:29:03.755Z</updated>
<content type="html"><![CDATA[<h1 id="1-子查询"><a href="#1-子查询" class="headerlink" title="1 子查询"></a>1 子查询</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Find products that are more </span></span><br><span class="line"><span class="comment">-- expensive than Lettuce (id = 3)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> products</span><br><span class="line"><span class="keyword">WHERE</span> unit_price > (</span><br><span class="line"> <span class="keyword">SELECT</span> unit_price</span><br><span class="line"> <span class="keyword">FROM</span> products</span><br><span class="line"> <span class="keyword">WHERE</span> product_id = <span class="number">3</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><h1 id="2-IN-运算符"><a href="#2-IN-运算符" class="headerlink" title="2 IN 运算符"></a>2 IN 运算符</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Find the products that have never been ordered</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">USE</span> sql_store;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> products</span><br><span class="line"><span class="keyword">WHERE</span> product_id <span class="keyword">NOT</span> <span class="keyword">IN</span> (</span><br><span class="line"> <span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> product_id</span><br><span class="line"> <span class="keyword">FROM</span> order_items</span><br><span class="line">)</span><br></pre></td></tr></table></figure><h1 id="3-子查询-VS-连接"><a href="#3-子查询-VS-连接" class="headerlink" title="3 子查询 VS 连接"></a>3 子查询 VS 连接</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Find clients without invoices</span></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> clients</span><br><span class="line"><span class="keyword">WHERE</span> client_id <span class="keyword">NOT</span> <span class="keyword">IN</span> (</span><br><span class="line"> <span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> client_id</span><br><span class="line"> <span class="keyword">FROM</span> invoices</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>用连接的方法:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> clients</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> invoices <span class="keyword">USING</span> (client_id)</span><br><span class="line"><span class="keyword">WHERE</span> invoice_id <span class="keyword">IS</span> <span class="literal">NULL</span></span><br></pre></td></tr></table></figure><p>在时间一样的情况下, 选择更易读的那种方法</p><h1 id="4-ALL-关键字"><a href="#4-ALL-关键字" class="headerlink" title="4 ALL 关键字"></a>4 ALL 关键字</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Select invoices larger than all invoices of client 3</span></span><br><span class="line"><span class="keyword">USE</span> sql_invoicing;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> invoice_total > (</span><br><span class="line"> <span class="keyword">SELECT</span> <span class="keyword">MAX</span>(invoice_total)</span><br><span class="line"> <span class="keyword">FROM</span> invoices</span><br><span class="line"> <span class="keyword">WHERE</span> client_id = <span class="number">3</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>改用all 关键字:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> invoice_total > <span class="keyword">ALL</span> (</span><br><span class="line"> <span class="keyword">SELECT</span> invoice_total</span><br><span class="line"> <span class="keyword">FROM</span> invoices</span><br><span class="line"> <span class="keyword">WHERE</span> client_id = <span class="number">3</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><h1 id="5-ANY-关键字"><a href="#5-ANY-关键字" class="headerlink" title="5 ANY 关键字"></a>5 ANY 关键字</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Select clients with at least two invoices</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> clients</span><br><span class="line"><span class="keyword">WHERE</span> client_id <span class="keyword">IN</span> (</span><br><span class="line"> <span class="keyword">SELECT</span> client_id</span><br><span class="line"> <span class="keyword">FROM</span> invoices</span><br><span class="line"> <span class="keyword">GROUP</span> <span class="keyword">BY</span> client_id</span><br><span class="line"> <span class="keyword">HAVING</span> <span class="keyword">COUNT</span>(*) >= <span class="number">2</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>改用any 关键字</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Select clients with at least two invoices</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> clients</span><br><span class="line"><span class="keyword">WHERE</span> client_id = <span class="keyword">ANY</span> (</span><br><span class="line"> <span class="keyword">SELECT</span> client_id</span><br><span class="line"> <span class="keyword">FROM</span> invoices</span><br><span class="line"> <span class="keyword">GROUP</span> <span class="keyword">BY</span> client_id</span><br><span class="line"> <span class="keyword">HAVING</span> <span class="keyword">COUNT</span>(*) >= <span class="number">2</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>即 “IN” 相当于 “=ANY”</p><h1 id="6-相关子查询"><a href="#6-相关子查询" class="headerlink" title="6 相关子查询"></a>6 相关子查询</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Select employees whose salary is </span></span><br><span class="line"><span class="comment">-- above the average in their office</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">USE</span> sql_hr;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> employees e</span><br><span class="line"><span class="keyword">WHERE</span> salary > (</span><br><span class="line"> <span class="keyword">SELECT</span> <span class="keyword">AVG</span>(salary)</span><br><span class="line"> <span class="keyword">FROM</span> employees</span><br><span class="line"> <span class="keyword">WHERE</span> office_id = e.office_id</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>注意到子查询用到了外查询的 e.office_id, 也就是说子查询和外查询是相关子查询.</p><p>对于非相关子查询, 执行一次就可以了.</p><p>但是对于相关子查询, 外查询每一条record都要执行一次子查询,所以执行时间相对较长.</p><h1 id="7-EXISTS-运算符"><a href="#7-EXISTS-运算符" class="headerlink" title="7 EXISTS 运算符"></a>7 EXISTS 运算符</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Select clients that have an invoice</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> clients</span><br><span class="line"><span class="keyword">WHERE</span> client_id <span class="keyword">IN</span> (</span><br><span class="line"> <span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> client_id</span><br><span class="line"> <span class="keyword">FROM</span> invoices</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>子查询返回一个列表, 然后外查询看在不在此列表中.如果子查询返回的列表非常大,就会很影响性能.</p><p><strong>使用EXISTS运算符</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Select clients that have an invoice</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> clients c</span><br><span class="line"><span class="keyword">WHERE</span> <span class="keyword">EXISTS</span> (</span><br><span class="line"> <span class="keyword">SELECT</span> client_id</span><br><span class="line"> <span class="keyword">FROM</span> invoices</span><br><span class="line"> <span class="keyword">WHERE</span> client_id = c.client_id</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>对于外查询的每一条record, EXISTS 子查询返回TRUE / FALSE, 若返回TRUE,就添加到结果集中.</p><p><strong>Exercise</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Find the products that have never been ordered</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> products p</span><br><span class="line"><span class="keyword">WHERE</span> <span class="keyword">NOT</span> <span class="keyword">EXISTS</span> (</span><br><span class="line"> <span class="keyword">SELECT</span> product_id</span><br><span class="line"> <span class="keyword">FROM</span> order_items</span><br><span class="line"> <span class="keyword">WHERE</span> product_id = p.product_id</span><br><span class="line">)</span><br></pre></td></tr></table></figure><h1 id="8-SELECT-子句中的子查询"><a href="#8-SELECT-子句中的子查询" class="headerlink" title="8 SELECT 子句中的子查询"></a>8 SELECT 子句中的子查询</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> invoice_id,</span><br><span class="line"> invoice_total,</span><br><span class="line"> (<span class="keyword">SELECT</span> <span class="keyword">AVG</span>(invoice_total)</span><br><span class="line"> <span class="keyword">FROM</span> invoices) <span class="keyword">AS</span> invoice_average,</span><br><span class="line">invoice_total - (<span class="keyword">SELECT</span> invoice_average) <span class="keyword">AS</span> <span class="keyword">difference</span> <span class="comment">-- 不能直接用别名</span></span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br></pre></td></tr></table></figure><p>得到这样一张表:</p><div class="table-container"><table><thead><tr><th>invoice_id</th><th>invoice_total</th><th>invoice_average</th><th>difference</th></tr></thead><tbody><tr><td>1</td><td>101.79</td><td>152.388235</td><td>-50.598235</td></tr><tr><td>2</td><td>175.32</td><td>152.388235</td><td>22.931765</td></tr><tr><td>3</td><td>147.99</td><td>152.388235</td><td>-4.398235</td></tr><tr><td>4</td><td>152.21</td><td>152.388235</td><td>-0.178235</td></tr><tr><td>5</td><td>169.36</td><td>152.388235</td><td>16.971765</td></tr><tr><td>6</td><td>157.78</td><td>152.388235</td><td>5.391765</td></tr><tr><td>7</td><td>133.87</td><td>152.388235</td><td>-18.518235</td></tr></tbody></table></div><p><strong>Exercise</strong></p><p>得到这样一张表:</p><div class="table-container"><table><thead><tr><th>client_id</th><th>name</th><th>total_sales</th><th>average</th><th>difference</th></tr></thead><tbody><tr><td>1</td><td>Vinte</td><td>802.89</td><td>152.388235</td><td>650.501765</td></tr><tr><td>2</td><td>Myworks</td><td>101.79</td><td>152.388235</td><td>-50.598235</td></tr><tr><td>3</td><td>Yadel</td><td>705.90</td><td>152.388235</td><td>553.511765</td></tr><tr><td>4</td><td>Kwideo</td><td></td><td>152.388235</td><td></td></tr><tr><td>5</td><td>Topiclounge</td><td>980.02</td><td>152.388235</td><td>827.631765</td></tr></tbody></table></div><p>Solution:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line"> client_id,</span><br><span class="line"> <span class="keyword">name</span>,</span><br><span class="line"> (<span class="keyword">SELECT</span> <span class="keyword">SUM</span>(invoice_total) </span><br><span class="line"> <span class="keyword">FROM</span> invoices</span><br><span class="line"> <span class="keyword">WHERE</span> client_id = c.client_id) <span class="keyword">AS</span> total_sales,</span><br><span class="line">(<span class="keyword">SELECT</span> <span class="keyword">AVG</span>(invoice_total) <span class="keyword">FROM</span> invoices) <span class="keyword">AS</span> average,</span><br><span class="line"> (<span class="keyword">SELECT</span> total_sales - average) <span class="keyword">AS</span> <span class="keyword">difference</span></span><br><span class="line"><span class="keyword">FROM</span> clients c</span><br></pre></td></tr></table></figure><h1 id="9-FROM-子句中的子查询"><a href="#9-FROM-子句中的子查询" class="headerlink" title="9 FROM 子句中的子查询"></a>9 FROM 子句中的子查询</h1><p>将上面的查询结果当成表来用,放在FROM 子句中:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> (</span><br><span class="line"> <span class="keyword">SELECT</span></span><br><span class="line"> client_id,</span><br><span class="line"> <span class="keyword">name</span>,</span><br><span class="line"> (<span class="keyword">SELECT</span> <span class="keyword">SUM</span>(invoice_total) </span><br><span class="line"> <span class="keyword">FROM</span> invoices</span><br><span class="line"> <span class="keyword">WHERE</span> client_id = c.client_id) <span class="keyword">AS</span> total_sales,</span><br><span class="line"> (<span class="keyword">SELECT</span> <span class="keyword">AVG</span>(invoice_total) <span class="keyword">FROM</span> invoices) <span class="keyword">AS</span> average,</span><br><span class="line"> (<span class="keyword">SELECT</span> total_sales - average) <span class="keyword">AS</span> <span class="keyword">difference</span></span><br><span class="line"> <span class="keyword">FROM</span> clients c</span><br><span class="line">) <span class="keyword">AS</span> sales_summary</span><br><span class="line"><span class="keyword">WHERE</span> total_sales <span class="keyword">IS</span> <span class="keyword">NOT</span> <span class="literal">NULL</span></span><br></pre></td></tr></table></figure><p>得到:</p><div class="table-container"><table><thead><tr><th>client_id</th><th>name</th><th>total_sales</th><th>average</th><th>difference</th></tr></thead><tbody><tr><td>1</td><td>Vinte</td><td>802.89</td><td>152.388235</td><td>650.501765</td></tr><tr><td>2</td><td>Myworks</td><td>101.79</td><td>152.388235</td><td>-50.598235</td></tr><tr><td>3</td><td>Yadel</td><td>705.90</td><td>152.388235</td><td>553.511765</td></tr><tr><td>5</td><td>Topiclounge</td><td>980.02</td><td>152.388235</td><td>827.631765</td></tr></tbody></table></div>]]></content>
<summary type="html">
<h1 id="1-子查询"><a href="#1-子查询" class="headerlink" title="1 子查询"></a>1 子查询</h1><figure class="highlight sql"><table><tr><td class="gutter"><
</summary>
<category term="Database" scheme="http://yoursite.com/categories/Database/"/>
<category term="job notes-database" scheme="http://yoursite.com/tags/job-notes-database/"/>
</entry>
<entry>
<title>MySQL笔记(4)--数据汇总</title>
<link href="http://yoursite.com/2021/05/18/20210518_SQL004/"/>
<id>http://yoursite.com/2021/05/18/20210518_SQL004/</id>
<published>2021-05-18T09:50:09.000Z</published>
<updated>2021-05-18T07:38:23.494Z</updated>
<content type="html"><![CDATA[<h1 id="1-聚合函数(Aggregate-Functions)"><a href="#1-聚合函数(Aggregate-Functions)" class="headerlink" title="1 聚合函数(Aggregate Functions)"></a>1 聚合函数(Aggregate Functions)</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line"> <span class="keyword">MAX</span>(invoice_total) <span class="keyword">AS</span> highest,</span><br><span class="line"> <span class="keyword">MIN</span>(invoice_total) <span class="keyword">AS</span> lowest,</span><br><span class="line"> <span class="keyword">AVG</span>(invoice_total) <span class="keyword">AS</span> average,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total * <span class="number">1.1</span>) <span class="keyword">AS</span> total2,</span><br><span class="line"> <span class="keyword">COUNT</span>(invoice_total) <span class="keyword">AS</span> number_of_invoices,</span><br><span class="line"> <span class="keyword">COUNT</span>(payment_date) <span class="keyword">AS</span> count_of_payments,<span class="comment">-- COUNT只计算非空值个数</span></span><br><span class="line"> <span class="keyword">COUNT</span>(*) <span class="keyword">AS</span> total_records,</span><br><span class="line"> <span class="keyword">COUNT</span>(<span class="keyword">DISTINCT</span> client_id) <span class="keyword">AS</span> total_clients <span class="comment">-- 去除重复值</span></span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> invoice_date > <span class="string">'2019-07-01'</span></span><br></pre></td></tr></table></figure><p><strong>Exercise</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> <span class="string">'First half of 2019'</span> <span class="keyword">AS</span> date_range,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales,</span><br><span class="line"> <span class="keyword">SUM</span>(payment_total) <span class="keyword">AS</span> total_payments,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total - payment_total) <span class="keyword">AS</span> what_we_expect</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> invoice_date <span class="keyword">BETWEEN</span> <span class="string">'2019-01-01'</span> <span class="keyword">AND</span> <span class="string">'2019-06-30'</span></span><br><span class="line"><span class="keyword">UNION</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> <span class="string">'Second half of 2019'</span> <span class="keyword">AS</span> date_range,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales,</span><br><span class="line"> <span class="keyword">SUM</span>(payment_total) <span class="keyword">AS</span> total_payments,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total - payment_total) <span class="keyword">AS</span> what_we_expect</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> invoice_date <span class="keyword">BETWEEN</span> <span class="string">'2019-07-01'</span> <span class="keyword">AND</span> <span class="string">'2019-12-31'</span></span><br><span class="line"><span class="keyword">UNION</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> <span class="string">'Total'</span> <span class="keyword">AS</span> date_range,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales,</span><br><span class="line"> <span class="keyword">SUM</span>(payment_total) <span class="keyword">AS</span> total_payments,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total - payment_total) <span class="keyword">AS</span> what_we_expect</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> invoice_date <span class="keyword">BETWEEN</span> <span class="string">'2019-01-01'</span> <span class="keyword">AND</span> <span class="string">'2019-12-31'</span></span><br></pre></td></tr></table></figure><div class="table-container"><table><thead><tr><th>date_range</th><th>total_sales</th><th>total_payments</th><th>what_we_expect</th></tr></thead><tbody><tr><td>First half of 2019</td><td>1539.07</td><td>212.97</td><td>1326.1</td></tr><tr><td>Second half of 2019</td><td>1051.53</td><td>148.41</td><td>903.12</td></tr><tr><td>Total</td><td>2590.6</td><td>361.38</td><td>2229.22</td></tr></tbody></table></div><h1 id="2-GROUP-BY-子句"><a href="#2-GROUP-BY-子句" class="headerlink" title="2 GROUP BY 子句"></a>2 GROUP BY 子句</h1><p><strong>Demo 1</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> client_id,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> invoice_date >= <span class="string">'2019-07-01'</span></span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> client_id</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> total_sales <span class="keyword">DESC</span></span><br></pre></td></tr></table></figure><p>⚠ 各个子句的顺序不能错,比如不能将WHERE移到ORDER BY 下面</p><p>得出每个client在2019年下半年的订单总金额</p><div class="table-container"><table><thead><tr><th>client_id</th><th>total_sales</th></tr></thead><tbody><tr><td>5</td><td>489.52</td></tr><tr><td>3</td><td>427.54</td></tr><tr><td>1</td><td>134.47</td></tr></tbody></table></div><p><strong>Demo 2</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> state,</span><br><span class="line"> city,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales</span><br><span class="line"><span class="keyword">FROM</span> invoices i</span><br><span class="line"><span class="keyword">JOIN</span> clients <span class="keyword">USING</span> (client_id)</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> state, city</span><br></pre></td></tr></table></figure><p>得到每个(state, city)组合的总金额:</p><div class="table-container"><table><thead><tr><th>state</th><th>city</th><th>total_sales</th></tr></thead><tbody><tr><td>NY</td><td>Syracuse</td><td>802.89</td></tr><tr><td>WV</td><td>Huntington</td><td>101.79</td></tr><tr><td>CA</td><td>San Francisco</td><td>705.90</td></tr><tr><td>OR</td><td>Portland</td><td>980.02</td></tr></tbody></table></div><p><strong>Exercise</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> <span class="built_in">date</span>,</span><br><span class="line"> pm.name <span class="keyword">AS</span> payment_method,</span><br><span class="line"> <span class="keyword">SUM</span>(amount) <span class="keyword">AS</span> total_payments</span><br><span class="line"><span class="keyword">FROM</span> payments p</span><br><span class="line"><span class="keyword">JOIN</span> payment_methods pm</span><br><span class="line"> <span class="keyword">ON</span> p.payment_method = pm.payment_method_id</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> <span class="built_in">date</span>, payment_method</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> <span class="built_in">date</span></span><br></pre></td></tr></table></figure><p>根据交易日期和交易方式求总金额。</p><div class="table-container"><table><thead><tr><th>date</th><th>payment_method</th><th>total_payments</th></tr></thead><tbody><tr><td>2019-01-03</td><td>Credit Card</td><td>74.55</td></tr><tr><td>2019-01-08</td><td>Credit Card</td><td>32.77</td></tr><tr><td>2019-01-08</td><td>Cash</td><td>10.00</td></tr><tr><td>2019-01-11</td><td>Credit Card</td><td>0.03</td></tr><tr><td>2019-01-15</td><td>Credit Card</td><td>148.41</td></tr><tr><td>2019-01-26</td><td>Credit Card</td><td>87.44</td></tr><tr><td>2019-02-12</td><td>Credit Card</td><td>8.18</td></tr></tbody></table></div><h1 id="3-HAVING-子句"><a href="#3-HAVING-子句" class="headerlink" title="3 HAVING 子句"></a>3 HAVING 子句</h1><blockquote><p>👉 使用WHERE子句可以在行分组之<strong>前</strong>过滤数据<br>👉 使用HAVING子句可以在行分组之<strong>后</strong>过滤数据</p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> client_id,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> client_id</span><br><span class="line"><span class="keyword">HAVING</span> total_sales > <span class="number">500</span> <span class="comment">-- 必须是在select子句中的column</span></span><br></pre></td></tr></table></figure><div class="table-container"><table><thead><tr><th>client_id</th><th>total_sales</th></tr></thead><tbody><tr><td>1</td><td>802.89</td></tr><tr><td>3</td><td>705.90</td></tr><tr><td>5</td><td>980.02</td></tr></tbody></table></div><p><strong>复合搜索条件</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> client_id,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales,</span><br><span class="line"> <span class="keyword">COUNT</span>(*) <span class="keyword">AS</span> number_of_invoices</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> client_id</span><br><span class="line"><span class="keyword">HAVING</span> total_sales > <span class="number">500</span> <span class="keyword">AND</span> number_of_invoices > <span class="number">5</span></span><br></pre></td></tr></table></figure><p>获取金额超过500并且多于5个订单的client的结果</p><div class="table-container"><table><thead><tr><th>client_id</th><th>total_sales</th><th>number_of_invoices</th></tr></thead><tbody><tr><td>5</td><td>980.02</td><td>6</td></tr></tbody></table></div><p><strong>Exercise</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Get the customers located in VG</span></span><br><span class="line"><span class="comment">-- who have spent more than $100</span></span><br><span class="line"><span class="keyword">USE</span> sql_store;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> c.customer_id,</span><br><span class="line"> c.first_name,</span><br><span class="line"> c.last_name,</span><br><span class="line"> c.state,</span><br><span class="line"> <span class="keyword">SUM</span>(oi.quantity * oi.unit_price) <span class="keyword">AS</span> total_sales</span><br><span class="line"><span class="keyword">FROM</span> customers c</span><br><span class="line"><span class="keyword">JOIN</span> orders o <span class="keyword">USING</span> (customer_id)</span><br><span class="line"><span class="keyword">JOIN</span> order_items oi <span class="keyword">USING</span> (order_id)</span><br><span class="line"><span class="keyword">WHERE</span> state = <span class="string">'VA'</span></span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span></span><br><span class="line"> c.customer_id,</span><br><span class="line"> c.first_name,</span><br><span class="line"> c.last_name</span><br><span class="line"><span class="keyword">HAVING</span> total_sales > <span class="number">100</span></span><br></pre></td></tr></table></figure><div class="table-container"><table><thead><tr><th>customer_id</th><th>first_name</th><th>last_name</th><th>state</th><th>total_sales</th></tr></thead><tbody><tr><td>2</td><td>Ines</td><td>Brushfield</td><td>VA</td><td>157.92</td></tr></tbody></table></div><h1 id="4-ROLLUP-运算符"><a href="#4-ROLLUP-运算符" class="headerlink" title="4 ROLLUP 运算符"></a>4 ROLLUP 运算符</h1><p><strong>Demo 1</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> client_id,</span><br><span class="line"> <span class="keyword">SUM</span>(invoice_total) <span class="keyword">AS</span> total_sales</span><br><span class="line"><span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> client_id <span class="keyword">WITH</span> <span class="keyword">ROLLUP</span></span><br></pre></td></tr></table></figure><p>WITH ROLLUP 自动计算总数</p><div class="table-container"><table><thead><tr><th>client_id</th><th>total_sales</th></tr></thead><tbody><tr><td>1</td><td>802.89</td></tr><tr><td>2</td><td>101.79</td></tr><tr><td>3</td><td>705.90</td></tr><tr><td>5</td><td>980.02</td></tr><tr><td></td><td>2590.60</td></tr></tbody></table></div><p><strong>Demo 2</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> <span class="built_in">date</span>,</span><br><span class="line"> pm.name <span class="keyword">AS</span> payment_method,</span><br><span class="line"> <span class="keyword">SUM</span>(amount) <span class="keyword">AS</span> total_payments</span><br><span class="line"><span class="keyword">FROM</span> payments p</span><br><span class="line"><span class="keyword">JOIN</span> payment_methods pm</span><br><span class="line"><span class="keyword">ON</span> p.payment_method = pm.payment_method_id</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> <span class="built_in">date</span>, pm.name <span class="keyword">WITH</span> <span class="keyword">ROLLUP</span></span><br></pre></td></tr></table></figure><p>注意: GROUP BY 子句中由于使用了 WITH ROLLUP, 就不能使用别名 payment_method</p><p>得到每个组及整个结果集的汇总集:</p><div class="table-container"><table><thead><tr><th>date</th><th>payment_method</th><th>total_payments</th></tr></thead><tbody><tr><td>2019-01-03</td><td>Credit Card</td><td>74.55</td></tr><tr><td>2019-01-03</td><td></td><td>74.55</td></tr><tr><td>2019-01-08</td><td>Cash</td><td>10.00</td></tr><tr><td>2019-01-08</td><td>Credit Card</td><td>32.77</td></tr><tr><td>2019-01-08</td><td></td><td>42.77</td></tr><tr><td>2019-01-11</td><td>Credit Card</td><td>0.03</td></tr><tr><td>2019-01-11</td><td></td><td>0.03</td></tr><tr><td>2019-01-15</td><td>Credit Card</td><td>148.41</td></tr><tr><td>2019-01-15</td><td></td><td>148.41</td></tr><tr><td>2019-01-26</td><td>Credit Card</td><td>87.44</td></tr><tr><td>2019-01-26</td><td></td><td>87.44</td></tr><tr><td>2019-02-12</td><td>Credit Card</td><td>8.18</td></tr><tr><td>2019-02-12</td><td></td><td>8.18</td></tr><tr><td></td><td></td><td>361.38</td></tr></tbody></table></div><p>注意到 2019-01-08 对 Cash 和 Credit Card 有一个汇总值.</p>]]></content>
<summary type="html">
<h1 id="1-聚合函数(Aggregate-Functions)"><a href="#1-聚合函数(Aggregate-Functions)" class="headerlink" title="1 聚合函数(Aggregate Functions)"></a>1 聚合函
</summary>
<category term="Database" scheme="http://yoursite.com/categories/Database/"/>
<category term="job notes-database" scheme="http://yoursite.com/tags/job-notes-database/"/>
</entry>
<entry>
<title>MySQL笔记(3)--增删改</title>
<link href="http://yoursite.com/2021/05/17/20210517_SQL003/"/>
<id>http://yoursite.com/2021/05/17/20210517_SQL003/</id>
<published>2021-05-17T13:50:09.000Z</published>
<updated>2021-05-18T07:35:42.334Z</updated>
<content type="html"><![CDATA[<h1 id="1-列属性"><a href="#1-列属性" class="headerlink" title="1 列属性"></a>1 列属性</h1><blockquote><p><strong>Data type</strong></p><p>👉 VARCHAR: 可变长度字符串(节省空间)<br>👉 CHAR: 字符串,不满指定长度就会填充满</p><p><strong>Properties</strong></p><p>👉 PK: Primary Key<br>👉 NN: Not Null<br>👉 AI: Automatic Increment</p></blockquote><h1 id="2-插入"><a href="#2-插入" class="headerlink" title="2 插入"></a>2 插入</h1><h2 id="2-1-插入单行"><a href="#2-1-插入单行" class="headerlink" title="2.1 插入单行"></a>2.1 插入单行</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> customers</span><br><span class="line"><span class="keyword">VALUES</span> (</span><br><span class="line"> <span class="keyword">DEFAULT</span>, </span><br><span class="line"> <span class="string">'John'</span>, </span><br><span class="line"> <span class="string">'Smith'</span>, </span><br><span class="line"> <span class="string">'1990-01-01'</span>,</span><br><span class="line"> <span class="literal">NULL</span>,</span><br><span class="line"> <span class="string">'address'</span>,</span><br><span class="line"> <span class="string">'city'</span>,</span><br><span class="line"> <span class="string">'CA'</span>,</span><br><span class="line"> <span class="keyword">DEFAULT</span>)</span><br></pre></td></tr></table></figure><p>有些不是必填的, 可以skip掉:</p><p><strong>Another Way</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> customers (</span><br><span class="line"> first_name,</span><br><span class="line"> last_name,</span><br><span class="line"> birth_date,</span><br><span class="line"> address,</span><br><span class="line"> city,</span><br><span class="line"> state)</span><br><span class="line"><span class="keyword">VALUES</span> (</span><br><span class="line"> <span class="string">'John'</span>, </span><br><span class="line"> <span class="string">'Smith'</span>, </span><br><span class="line"> <span class="string">'1990-01-01'</span>,</span><br><span class="line"> <span class="string">'address'</span>,</span><br><span class="line"> <span class="string">'city'</span>,</span><br><span class="line"> <span class="string">'CA'</span>)</span><br></pre></td></tr></table></figure><h2 id="2-2-插入多行"><a href="#2-2-插入多行" class="headerlink" title="2.2 插入多行"></a>2.2 插入多行</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> shippers (<span class="keyword">name</span>)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="string">'Shipper1'</span>), </span><br><span class="line"> (<span class="string">'Shipper2'</span>), </span><br><span class="line"> (<span class="string">'Shipper3'</span>)</span><br></pre></td></tr></table></figure><h2 id="2-3-插入分层行"><a href="#2-3-插入分层行" class="headerlink" title="2.3 插入分层行"></a>2.3 插入分层行</h2><p>order_items是orders的子表, 列出更为详细的信息.在orders插入行, 相应的在order_items也要插入行:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> orders (customer_id, order_date, <span class="keyword">status</span>)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'2019-01-02'</span>, <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> order_items</span><br><span class="line"><span class="keyword">VALUES</span> </span><br><span class="line"> (<span class="keyword">LAST_INSERT_ID</span>(), <span class="number">1</span>, <span class="number">1</span>, <span class="number">2.95</span>),</span><br><span class="line"> (<span class="keyword">LAST_INSERT_ID</span>(), <span class="number">2</span>, <span class="number">1</span>, <span class="number">3.95</span>)</span><br></pre></td></tr></table></figure><p>LAST_INSERT_ID()相当于一个method/function, 直接调用获取最近插入的record的id.</p><h1 id="3-创建复制表-a-copy-of-table"><a href="#3-创建复制表-a-copy-of-table" class="headerlink" title="3 创建复制表(a copy of table)"></a>3 创建复制表(a copy of table)</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> orders_archived <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> * <span class="keyword">FROM</span> orders</span><br></pre></td></tr></table></figure><p>通过这种方式创建的表复制会没有PK, AI这些属性</p><h2 id="3-1-子查询"><a href="#3-1-子查询" class="headerlink" title="3.1 子查询"></a>3.1 子查询</h2><p>上例中的SELECT * FROM orders是子查询.</p><p>INSERT INTO也可以用子查询:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> orders_archived</span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> orders</span><br><span class="line"><span class="keyword">WHERE</span> order_date < <span class="string">'2019-01-01'</span></span><br></pre></td></tr></table></figure><p>orders_archived表中只有满足条件的records.</p><h1 id="4-更新"><a href="#4-更新" class="headerlink" title="4 更新"></a>4 更新</h1><h2 id="4-1-更新单行"><a href="#4-1-更新单行" class="headerlink" title="4.1 更新单行"></a>4.1 更新单行</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> invoices</span><br><span class="line"><span class="keyword">SET</span> payment_total = <span class="number">10</span>, payment_date = <span class="string">'2019-03-01'</span></span><br><span class="line"><span class="keyword">WHERE</span> invoice_id = <span class="number">1</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> invoices</span><br><span class="line"><span class="keyword">SET</span> payment_total = <span class="keyword">DEFAULT</span>, payment_date = <span class="literal">NULL</span></span><br><span class="line"><span class="keyword">WHERE</span> invoice_id = <span class="number">1</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> invoices</span><br><span class="line"><span class="keyword">SET</span> </span><br><span class="line"> payment_total = invoice_total * <span class="number">0.5</span>, <span class="comment">-- 使用表达式更新</span></span><br><span class="line"> payment_date = due_date</span><br><span class="line"><span class="keyword">WHERE</span> invoice_id = <span class="number">3</span></span><br></pre></td></tr></table></figure><h2 id="4-2-更新多行"><a href="#4-2-更新多行" class="headerlink" title="4.2 更新多行"></a>4.2 更新多行</h2><p>在MySQL workbench需要取消safe update选项才能更新多行.</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> invoices</span><br><span class="line"><span class="keyword">SET</span> </span><br><span class="line"> payment_total = invoice_total * <span class="number">0.5</span>, <span class="comment">-- 使用表达式更新</span></span><br><span class="line"> payment_date = due_date</span><br><span class="line"><span class="keyword">WHERE</span> client_id = <span class="number">3</span></span><br><span class="line"><span class="comment">-- WHERE client_id IN (3, 4)</span></span><br></pre></td></tr></table></figure><p>client_id=3对应有多项record, 都会被update</p><h2 id="4-3-在UPDATE中使用子查询"><a href="#4-3-在UPDATE中使用子查询" class="headerlink" title="4.3 在UPDATE中使用子查询"></a>4.3 在UPDATE中使用子查询</h2><p>将上例改为:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> invoices</span><br><span class="line"><span class="keyword">SET</span> </span><br><span class="line"> payment_total = invoice_total * <span class="number">0.5</span>, <span class="comment">-- 使用表达式更新</span></span><br><span class="line"> payment_date = due_date</span><br><span class="line"><span class="keyword">WHERE</span> client_id = </span><br><span class="line"> (<span class="keyword">SELECT</span> client_id</span><br><span class="line"> <span class="keyword">FROM</span> clients</span><br><span class="line"> <span class="keyword">WHERE</span> <span class="keyword">name</span> = <span class="string">'Myworks'</span>)</span><br></pre></td></tr></table></figure><p>如果子查询返回的是多个client_id:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> invoices</span><br><span class="line"><span class="keyword">SET</span> </span><br><span class="line"> payment_total = invoice_total * <span class="number">0.5</span>, <span class="comment">-- 使用表达式更新</span></span><br><span class="line"> payment_date = due_date</span><br><span class="line"><span class="keyword">WHERE</span> client_id <span class="keyword">IN</span><span class="comment">-- 用IN</span></span><br><span class="line"> (<span class="keyword">SELECT</span> client_id</span><br><span class="line"> <span class="keyword">FROM</span> clients</span><br><span class="line"> <span class="keyword">WHERE</span> state <span class="keyword">IN</span> (<span class="string">'CA'</span>, <span class="string">'NY'</span>))</span><br></pre></td></tr></table></figure><p>⚠ 在执行查询之前, 应该先执行子查询看看对不对.</p><h1 id="5-删除行"><a href="#5-删除行" class="headerlink" title="5 删除行"></a>5 删除行</h1><p><strong>根据条件删除某些行</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DELETE</span> <span class="keyword">FROM</span> invoices_archived</span><br><span class="line"><span class="keyword">WHERE</span> invoice_id = <span class="number">2</span></span><br></pre></td></tr></table></figure><p><strong>子查询</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DELETE</span> <span class="keyword">FROM</span> invoices</span><br><span class="line"><span class="keyword">WHERE</span> invoice_id = </span><br><span class="line"> (<span class="keyword">SELECT</span> client_id</span><br><span class="line"> <span class="keyword">FROM</span> clients</span><br><span class="line"> <span class="keyword">WHERE</span> <span class="keyword">name</span> = <span class="string">'Vinte'</span>)</span><br></pre></td></tr></table></figure><p><strong>删除整表所有records</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DELETE</span> <span class="keyword">FROM</span> invoices_archived</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h1 id="1-列属性"><a href="#1-列属性" class="headerlink" title="1 列属性"></a>1 列属性</h1><blockquote>
<p><strong>Data type</strong></p>
<p>👉 VARCHAR:
</summary>
<category term="Database" scheme="http://yoursite.com/categories/Database/"/>
<category term="job notes-database" scheme="http://yoursite.com/tags/job-notes-database/"/>
</entry>
<entry>
<title>MySQL笔记(2)--连接</title>
<link href="http://yoursite.com/2021/05/17/20210517_SQL002/"/>
<id>http://yoursite.com/2021/05/17/20210517_SQL002/</id>
<published>2021-05-17T07:50:09.000Z</published>
<updated>2021-05-18T07:30:42.320Z</updated>
<content type="html"><![CDATA[<p><img src="/images/SQL1/002_sql-join.png" alt="002_sql-join"></p><h1 id="1-Inner-Joins-内连接"><a href="#1-Inner-Joins-内连接" class="headerlink" title="1 Inner Joins (内连接)"></a>1 Inner Joins (内连接)</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> order_id, o.customer_id, first_name, last_name</span><br><span class="line"><span class="keyword">FROM</span> orders o</span><br><span class="line"><span class="keyword">INNER</span> <span class="keyword">JOIN</span> customers c</span><br><span class="line"> <span class="keyword">ON</span> o.customer_id = c.customer_id</span><br></pre></td></tr></table></figure><p>返回表orders在表customers中有对应record的项</p><p>o和c分别是orders和customers的别名,以简化代码</p><p>关键字INNER可省略</p><h2 id="1-1-跨数据库连接"><a href="#1-1-跨数据库连接" class="headerlink" title="1.1 跨数据库连接"></a>1.1 跨数据库连接</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_store; <span class="comment">-- 选择了数据库sql_store为当前数据库</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> order_items oi</span><br><span class="line"><span class="keyword">JOIN</span> sql_inventory.products p <span class="comment">-- 另一个数据库sql_inventory</span></span><br><span class="line"> <span class="keyword">ON</span> oi.product_id = p.product_id</span><br></pre></td></tr></table></figure><h2 id="1-2-自连接"><a href="#1-2-自连接" class="headerlink" title="1.2 自连接"></a>1.2 自连接</h2><p>将表和自己连接,但是给不同的别名以区分。如下,manager也是一名员工,其信息也在表employees中,用自连接可以得到employee和TA的manager的具体员工信息。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_hr; <span class="comment">-- 选择了数据库sql_hr为当前数据库</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> e.employee_id,</span><br><span class="line"> e.first_name,</span><br><span class="line"> m.first_name <span class="keyword">AS</span> manager</span><br><span class="line"><span class="keyword">FROM</span> employees e</span><br><span class="line"><span class="keyword">JOIN</span> employees m </span><br><span class="line"> <span class="keyword">ON</span> e.reports_to = m.employee_id</span><br></pre></td></tr></table></figure><h2 id="1-3-多表连接"><a href="#1-3-多表连接" class="headerlink" title="1.3 多表连接"></a>1.3 多表连接</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_store;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> o.order_id,</span><br><span class="line"> o.order_date,</span><br><span class="line"> c.first_name,</span><br><span class="line"> c.last_name,</span><br><span class="line"> os.name <span class="keyword">AS</span> <span class="keyword">status</span></span><br><span class="line"><span class="keyword">FROM</span> orders o</span><br><span class="line"><span class="keyword">JOIN</span> customers c</span><br><span class="line"> <span class="keyword">ON</span> o.customer_id = c.customer_id</span><br><span class="line"><span class="keyword">JOIN</span> order_statuses os</span><br><span class="line"> <span class="keyword">ON</span> o.status = os.order_status_id</span><br></pre></td></tr></table></figure><p>表orders先和表customers连接,然后与表order_statuses连接。</p><h2 id="1-4-复合连接条件"><a href="#1-4-复合连接条件" class="headerlink" title="1.4 复合连接条件"></a>1.4 复合连接条件</h2><p>对于有两个主键的表,要用两个主键作为条件与别的表连接。例如表order_items的主键是order_id和product_id</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> order_items oi</span><br><span class="line"><span class="keyword">JOIN</span> order_item_notes oin</span><br><span class="line"> <span class="keyword">ON</span> oi.order_id = oin.order_id</span><br><span class="line"> <span class="keyword">AND</span> oi.product_id = oin.product_id</span><br></pre></td></tr></table></figure><h2 id="1-5-隐式连接语法"><a href="#1-5-隐式连接语法" class="headerlink" title="1.5 隐式连接语法"></a>1.5 隐式连接语法</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> orders o</span><br><span class="line"><span class="keyword">JOIN</span> customers c</span><br><span class="line"> <span class="keyword">ON</span> o.customer_id = c.customer_id</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- Implicit Join Syntax</span></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> orders o, customers c</span><br><span class="line"><span class="keyword">WHERE</span> o.customer_id = c.customer_id</span><br></pre></td></tr></table></figure><p>不建议使用隐式连接语法,要是忘写WHERE就完了。</p><h1 id="2-外连接"><a href="#2-外连接" class="headerlink" title="2 外连接"></a>2 外连接</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line"> c.customer_id,</span><br><span class="line"> c.first_name,</span><br><span class="line"> o.order_id</span><br><span class="line"><span class="keyword">FROM</span> customers c</span><br><span class="line"><span class="keyword">RIGHT</span> <span class="keyword">JOIN</span> orders o</span><br><span class="line"> <span class="keyword">ON</span> c.customer_id = o.customer_id</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> c.customer_id</span><br></pre></td></tr></table></figure><p>LEFT (OUTER) JOIN 和 RIGHT (OUTER) JOIN, OUTER 可省略</p><h2 id="2-1-多表外连接"><a href="#2-1-多表外连接" class="headerlink" title="2.1 多表外连接"></a>2.1 多表外连接</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line"> c.customer_id,</span><br><span class="line"> c.first_name,</span><br><span class="line"> o.order_id,</span><br><span class="line"> sh.name <span class="keyword">AS</span> shipper</span><br><span class="line"><span class="keyword">FROM</span> customers c</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> orders o</span><br><span class="line"> <span class="keyword">ON</span> c.customer_id = o.customer_id</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> shippers sh</span><br><span class="line"> <span class="keyword">ON</span> o.shipper_id = sh.shipper_id</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> c.customer_id</span><br></pre></td></tr></table></figure><h2 id="2-2-自外连接"><a href="#2-2-自外连接" class="headerlink" title="2.2 自外连接"></a>2.2 自外连接</h2><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">USE</span> sql_hr;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line"> e.employee_id,</span><br><span class="line"> e.first_name <span class="keyword">AS</span> employee,</span><br><span class="line"> m.employee_id <span class="keyword">AS</span> manager</span><br><span class="line"><span class="keyword">FROM</span> employees e</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> employees m</span><br><span class="line"> <span class="keyword">ON</span> e.reports_to = m.employee_id</span><br></pre></td></tr></table></figure><h1 id="3-USING子句"><a href="#3-USING子句" class="headerlink" title="3 USING子句"></a>3 USING子句</h1><p>使用于两张表的键名完全一致的情况</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line"> o.order_id, </span><br><span class="line"> c.first_name,</span><br><span class="line"> sh.name <span class="keyword">AS</span> shipper</span><br><span class="line"><span class="keyword">FROM</span> orders o</span><br><span class="line"><span class="keyword">JOIN</span> customers c</span><br><span class="line"> <span class="comment">-- ON o.customer_id = c.customer_id </span></span><br><span class="line"> <span class="keyword">USING</span> (customer_id)</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> shippers sh</span><br><span class="line"> <span class="keyword">USING</span> (shipper_id)</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> order_items oi</span><br><span class="line"><span class="keyword">JOIN</span> order_item_notes oin</span><br><span class="line"> <span class="comment">-- ON oi.order_id = oin.order_id</span></span><br><span class="line"> <span class="comment">-- AND oi.product_id = oin.product_id</span></span><br><span class="line"> <span class="keyword">USING</span> (order_id, product_id)</span><br></pre></td></tr></table></figure><h1 id="4-自然连接"><a href="#4-自然连接" class="headerlink" title="4 自然连接"></a>4 自然连接</h1><p>自动找到同名的column来连接。(容易出错,不建议使用)</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> o.order_id,</span><br><span class="line"> c.first_name</span><br><span class="line"><span class="keyword">FROM</span> orders o</span><br><span class="line"><span class="keyword">NATURAL</span> <span class="keyword">JOIN</span> customers c</span><br></pre></td></tr></table></figure><h1 id="5-交叉连接"><a href="#5-交叉连接" class="headerlink" title="5 交叉连接"></a>5 交叉连接</h1><p>连接两张表的所有records</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> c.first_name <span class="keyword">AS</span> customers,</span><br><span class="line"> p.name <span class="keyword">AS</span> product</span><br><span class="line"><span class="keyword">FROM</span> customers c</span><br><span class="line"><span class="keyword">CROSS</span> <span class="keyword">JOIN</span> products p</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> c.first_name</span><br></pre></td></tr></table></figure><p>应用场景:表一是大中小型号,表二是红黄蓝等各种颜色,将所有型号和所有颜色组合起来。</p><p><strong>隐式语法</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> c.first_name <span class="keyword">AS</span> customers,</span><br><span class="line"> p.name <span class="keyword">AS</span> product</span><br><span class="line"><span class="keyword">FROM</span> customers c, products p</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> c.first_name</span><br></pre></td></tr></table></figure><h1 id="6-联合(Unions)"><a href="#6-联合(Unions)" class="headerlink" title="6 联合(Unions)"></a>6 联合(Unions)</h1><p>筛选某些records,用union将多次筛选的结果联合起来</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> order_id,</span><br><span class="line"> order_date,</span><br><span class="line"> <span class="string">'Active'</span> <span class="keyword">AS</span> <span class="keyword">status</span></span><br><span class="line"><span class="keyword">FROM</span> orders</span><br><span class="line"><span class="keyword">WHERE</span> order_date >= <span class="string">'2019-01-01'</span><span class="comment">-- 在此日期后的order, 状态设为active</span></span><br><span class="line"><span class="keyword">UNION</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> order_id,</span><br><span class="line"> order_date,</span><br><span class="line"> <span class="string">'Archived'</span> <span class="keyword">AS</span> <span class="keyword">status</span><span class="comment">-- 在此日期前的order, 状态设为archived</span></span><br><span class="line"><span class="keyword">FROM</span> orders</span><br><span class="line"><span class="keyword">WHERE</span> order_date < <span class="string">'2019-01-01'</span></span><br></pre></td></tr></table></figure><p>也可以联合多张表</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> first_name <span class="comment">-- 决定列名</span></span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">UNION</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">name</span></span><br><span class="line"><span class="keyword">FROM</span> shippers</span><br></pre></td></tr></table></figure><p><strong>练习</strong></p><p>根据积分将顾客划分为金银铜三档:</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> customer_id,</span><br><span class="line"> first_name,</span><br><span class="line"> points,</span><br><span class="line"> <span class="string">'Bronze'</span> <span class="keyword">AS</span> <span class="keyword">type</span></span><br><span class="line"><span class="keyword">FROM</span> customers c</span><br><span class="line"><span class="keyword">WHERE</span> points < <span class="number">2000</span></span><br><span class="line"><span class="keyword">UNION</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> customer_id,</span><br><span class="line"> first_name,</span><br><span class="line"> points,</span><br><span class="line"> <span class="string">'silver'</span> <span class="keyword">AS</span> <span class="keyword">type</span></span><br><span class="line"><span class="keyword">FROM</span> customers c</span><br><span class="line"><span class="keyword">WHERE</span> points <span class="keyword">BETWEEN</span> <span class="number">2000</span> <span class="keyword">AND</span> <span class="number">3000</span></span><br><span class="line"><span class="keyword">UNION</span></span><br><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> customer_id,</span><br><span class="line"> first_name,</span><br><span class="line"> points,</span><br><span class="line"> <span class="string">'Gold'</span> <span class="keyword">AS</span> <span class="keyword">type</span></span><br><span class="line"><span class="keyword">FROM</span> customers c</span><br><span class="line"><span class="keyword">WHERE</span> points > <span class="number">3000</span></span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> first_name</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><img src="/images/SQL1/002_sql-join.png" alt="002_sql-join"></p>
<h1 id="1-Inner-Joins-内连接"><a href="#1-Inner-Joins-内连接" class="headerlin
</summary>
<category term="Database" scheme="http://yoursite.com/categories/Database/"/>
<category term="job notes-database" scheme="http://yoursite.com/tags/job-notes-database/"/>
</entry>
<entry>
<title>MySQL笔记(1)--基础语句</title>
<link href="http://yoursite.com/2021/05/16/20210516_SQL001/"/>
<id>http://yoursite.com/2021/05/16/20210516_SQL001/</id>
<published>2021-05-16T11:50:09.000Z</published>
<updated>2021-05-18T07:31:16.468Z</updated>
<content type="html"><![CDATA[<h1 id="SELECT-子句"><a href="#SELECT-子句" class="headerlink" title="SELECT 子句"></a>SELECT 子句</h1><p>从一张表(customers)中选取某些列</p><p><img src="/images/SQL1/001.png" style="zoom: 150%;"></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span></span><br><span class="line"> first_name, </span><br><span class="line"> last_name, </span><br><span class="line"> points, </span><br><span class="line"> points * <span class="number">10</span> + <span class="number">100</span> <span class="keyword">AS</span> <span class="string">"discount factor"</span> <span class="comment">-- 可以进行数学运算,AS来rename</span></span><br><span class="line"><span class="keyword">FROM</span> customers</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> state <span class="comment">-- DISTINCT 只保留重复项中的一项</span></span><br><span class="line"><span class="keyword">FROM</span> customers</span><br></pre></td></tr></table></figure><h1 id="WHERE-子句"><a href="#WHERE-子句" class="headerlink" title="WHERE 子句"></a>WHERE 子句</h1><p>过滤作用,根据条件选择records</p><p>(各个WHERE子句只是提供不同的示例,运行时选择一个WHERE子句,其余注释掉,下文同)</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">WHERE</span> state = <span class="string">'va'</span> <span class="comment">-- va大小写一样的</span></span><br><span class="line"><span class="keyword">WHERE</span> state <> <span class="string">'va'</span> <span class="comment">-- not in VA</span></span><br><span class="line"><span class="keyword">WHERE</span> birth_date > <span class="string">'1990-01-01'</span> <span class="comment">-- born after 1990/01/01</span></span><br></pre></td></tr></table></figure><p>运算符有:</p><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">></span><br><span class="line">>=</span><br><span class="line"><</span><br><span class="line"><=</span><br><span class="line">=</span><br><span class="line">(not equal) != or <></span><br></pre></td></tr></table></figure><h1 id="AND-OR-NOT-运算符"><a href="#AND-OR-NOT-运算符" class="headerlink" title="AND, OR, NOT 运算符"></a>AND, OR, NOT 运算符</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">WHERE</span> <span class="keyword">NOT</span> (birth_date > <span class="string">'1990-01-01'</span> <span class="keyword">OR</span> points > <span class="number">1000</span>)</span><br></pre></td></tr></table></figure><p>AND优先级高于OR</p><h1 id="IN-运算符"><a href="#IN-运算符" class="headerlink" title="IN 运算符"></a>IN 运算符</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="comment">-- WHERE state = 'VA' OR state = 'GA' OR state = 'FL'</span></span><br><span class="line"><span class="comment">-- 用IN改写:</span></span><br><span class="line"><span class="keyword">WHERE</span> state <span class="keyword">IN</span> (<span class="string">'VA'</span>, <span class="string">'GA'</span>, <span class="string">'FL'</span>)</span><br><span class="line"><span class="comment">-- WHERE state NOT IN ('VA', 'GA', 'FL') -- 返回不在这些州的 records</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 这样是错的:WHERE state = 'VA' OR 'GA' OR 'FL' </span></span><br><span class="line"><span class="comment">-- 因为我们不能用OR连接布尔表达式state = 'VA'和字符串'GA'</span></span><br></pre></td></tr></table></figure><h1 id="BETWEEN-运算符"><a href="#BETWEEN-运算符" class="headerlink" title="BETWEEN 运算符"></a>BETWEEN 运算符</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="comment">-- WHERE points >= 1000 AND points <=3000</span></span><br><span class="line"><span class="comment">-- 改写为:</span></span><br><span class="line"><span class="keyword">WHERE</span> points <span class="keyword">BETWEEN</span> <span class="number">1000</span> <span class="keyword">AND</span> <span class="number">3000</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 也可用于非数值</span></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">WHERE</span> birth_date <span class="keyword">BETWEEN</span> <span class="string">"1990-01-01"</span> <span class="keyword">AND</span> <span class="string">"2000-01-01"</span></span><br></pre></td></tr></table></figure><h1 id="LIKE-运算符"><a href="#LIKE-运算符" class="headerlink" title="LIKE 运算符"></a>LIKE 运算符</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 字符串模式匹配</span></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">WHERE</span> last_name <span class="keyword">LIKE</span> <span class="string">'b%'</span> </span><br><span class="line"><span class="comment">-- 得到last name以'B'或'b'开头的records</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name <span class="keyword">LIKE</span> <span class="string">'brush%'</span> </span><br><span class="line"><span class="comment">-- 得到last name以“brush”开头的records</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name <span class="keyword">LIKE</span> <span class="string">'%b%'</span> </span><br><span class="line"><span class="comment">-- 表示'b'前后可以有任意字符数('b'在开头、中间、结尾出现皆可)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name <span class="keyword">LIKE</span> <span class="string">'%y'</span> </span><br><span class="line"><span class="comment">-- 得到last name以'y'结尾的records</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name <span class="keyword">LIKE</span> <span class="string">'_____y'</span> </span><br><span class="line"><span class="comment">-- 得到last name以'y'结尾且只有6个字符('_'填补表示任意字符)的records</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name <span class="keyword">LIKE</span> <span class="string">'b____y'</span> </span><br><span class="line"><span class="comment">-- 运行后得到last name以'b'开头以'y'结尾且只有6个字符的record(本例中为'Boagey')</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/***SUMMARY**/</span> </span><br><span class="line">% any number of characters</span><br><span class="line">_ single character</span><br></pre></td></tr></table></figure><h1 id="REGEXP-运算符"><a href="#REGEXP-运算符" class="headerlink" title="REGEXP 运算符"></a>REGEXP 运算符</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- regular expression (REGEXP) 正则表达式</span></span><br><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name <span class="keyword">LIKE</span> <span class="string">'%field%'</span></span><br><span class="line"><span class="comment">-- WHERE last_name REGEXP 'field'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name REGEXP <span class="string">'^field'</span> </span><br><span class="line"><span class="comment">-- last name must starts with "field"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name REGEXP <span class="string">'field$'</span> </span><br><span class="line"><span class="comment">-- last name must ends with "field"</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/* use '|' for multiple search pattern */</span> </span><br><span class="line"><span class="keyword">WHERE</span> last_name REGEXP <span class="string">'field|mac|rose'</span> </span><br><span class="line"><span class="comment">-- last name must contains "field" or "mac" or "rose"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name REGEXP <span class="string">'field$|mac|rose'</span> </span><br><span class="line"><span class="comment">-- last name must ends with "field" or contains "mac"/"rose"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name REGEXP <span class="string">'[gim]e'</span> </span><br><span class="line"><span class="comment">-- last name must contains "ge"/"ie"/"me"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name REGEXP <span class="string">'e[gim]'</span> </span><br><span class="line"><span class="comment">-- last name must contains "eg"/"ei"/"em"</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">WHERE</span> last_name REGEXP <span class="string">'[a-h]e'</span></span><br><span class="line"><span class="comment">-- the same as WHERE last_name REGEXP '[abcdefgh]e'</span></span><br></pre></td></tr></table></figure><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">^ beginning</span><br><span class="line">$ end</span><br><span class="line">| logical or</span><br><span class="line">[abcd]</span><br><span class="line">[a-f]</span><br></pre></td></tr></table></figure><h1 id="IS-NULL-运算符"><a href="#IS-NULL-运算符" class="headerlink" title="IS NULL 运算符"></a>IS NULL 运算符</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">WHERE</span> phone <span class="keyword">IS</span> <span class="literal">NULL</span> <span class="comment">-- 返回没有phone(该字段为NULL)的records</span></span><br><span class="line"><span class="keyword">WHERE</span> phone <span class="keyword">IS</span> <span class="keyword">NOT</span> <span class="literal">NULL</span> <span class="comment">-- phone不为空</span></span><br></pre></td></tr></table></figure><h1 id="ORDER-BY-子句"><a href="#ORDER-BY-子句" class="headerlink" title="ORDER BY 子句"></a>ORDER BY 子句</h1><p>默认是按照主键(primary key)排序,使用ORDER BY 子句可以指定排序的键</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> first_name <span class="comment">-- 根据first_name字段值升序排序</span></span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> first_name <span class="keyword">DESC</span> <span class="comment">-- 根据first_name字段值降序排序</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> state <span class="keyword">DESC</span>, first_name </span><br><span class="line"><span class="comment">--先根据state降序排列,state相同的根据first_name升序排列</span></span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- birth_date不在选出来的列里,still work</span></span><br><span class="line"><span class="keyword">SELECT</span> first_name, last_name</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> birth_date</span><br></pre></td></tr></table></figure><h1 id="LIMIT-子句"><a href="#LIMIT-子句" class="headerlink" title="LIMIT 子句"></a>LIMIT 子句</h1><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> *</span><br><span class="line"><span class="keyword">FROM</span> customers</span><br><span class="line"><span class="keyword">LIMIT</span> <span class="number">3</span> <span class="comment">-- 返回前3个records</span></span><br><span class="line"><span class="keyword">LIMIT</span> <span class="number">300</span> <span class="comment">-- 300 > #record, 返回全部records</span></span><br><span class="line"><span class="keyword">LIMIT</span> <span class="number">6</span>, <span class="number">3</span> <span class="comment">-- 跳过前6个records,返回第7,8,9个records</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h1 id="SELECT-子句"><a href="#SELECT-子句" class="headerlink" title="SELECT 子句"></a>SELECT 子句</h1><p>从一张表(customers)中选取某些列</p>
<p><img src="/im
</summary>
<category term="Database" scheme="http://yoursite.com/categories/Database/"/>
<category term="job notes-database" scheme="http://yoursite.com/tags/job-notes-database/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(11)--Popular Python Package</title>
<link href="http://yoursite.com/2021/05/14/20210514_Python011/"/>
<id>http://yoursite.com/2021/05/14/20210514_Python011/</id>
<published>2021-05-14T08:50:09.000Z</published>
<updated>2021-05-17T04:24:23.058Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><h1 id="Web-Scraping"><a href="#Web-Scraping" class="headerlink" title="Web Scraping"></a>Web Scraping</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> bs4 <span class="keyword">import</span> BeautifulSoup</span><br><span class="line"></span><br><span class="line">response = requests.get(<span class="string">"https://stackoverflow.com/questions"</span>)</span><br><span class="line">soup = BeautifulSoup(response.text, <span class="string">"html.parser"</span>)</span><br><span class="line"></span><br><span class="line">questions = soup.select(<span class="string">".question-summary"</span>)</span><br><span class="line">print(questions[<span class="number">0</span>].attrs)</span><br><span class="line">print(questions[<span class="number">0</span>].get(<span class="string">"id"</span>, <span class="number">0</span>))</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> question <span class="keyword">in</span> questions:</span><br><span class="line"> print(question.select_one(<span class="string">".question-hyperlink"</span>).getText())</span><br><span class="line"> print(question.select_one(<span class="string">".vote-count-post"</span>).getText())</span><br></pre></td></tr></table></figure><blockquote><p>{‘class’: [‘question-summary’], ‘id’: ‘question-summary-67532680’}<br>question-summary-67532680<br>GKE Nginx Ingress Controller Oauth2 Proxy redirect<br>0<br>Workaround on nested async completion blocks from network calls? Without using PromiseKit<br>0<br>ax.text not being printed when using transform<br>0<br>Using html & javascript Populate textbox<br>0<br>How to pass JSON data through the Django backend to frontend view using Angular<br>0<br>Gitlab CI cannot pull private registry with DOCKER_AUTH_CONFIG<br>0<br>Shopify SKU Lookup using GraphQL<br>0</p></blockquote><h1 id="Browser-Automation"><a href="#Browser-Automation" class="headerlink" title="Browser Automation"></a>Browser Automation</h1><p>自动打开chrome,跳转到github.com,登录。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> selenium <span class="keyword">import</span> webdriver</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line">browser = webdriver.Chrome()</span><br><span class="line">browser.set_window_size(<span class="number">1920</span>, <span class="number">1080</span>) <span class="comment"># 设置窗口大小</span></span><br><span class="line"></span><br><span class="line">browser.get(<span class="string">"https://github.com"</span>)</span><br><span class="line"></span><br><span class="line">signin_link = browser.find_element_by_link_text(<span class="string">"Sign in"</span>)</span><br><span class="line">signin_link.click()</span><br><span class="line"></span><br><span class="line">username_box = browser.find_element_by_id(<span class="string">"login_field"</span>)</span><br><span class="line">username_box.send_keys(<span class="string">"PurpleMStone"</span>)</span><br><span class="line">password_box = browser.find_element_by_id(<span class="string">"password"</span>)</span><br><span class="line">password_box.send_keys(<span class="string">"zq15071452268"</span>)</span><br><span class="line">password_box.submit()</span><br><span class="line"></span><br><span class="line"><span class="keyword">assert</span> <span class="string">"PurpleMStone"</span> <span class="keyword">in</span> browser.page_source</span><br><span class="line"></span><br><span class="line">time.sleep(<span class="number">0.5</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># profile_link = browser.find_element_by_class_name("user-profile-link")</span></span><br><span class="line"><span class="comment"># link_label = profile_link.get_attribute("innerHTML")</span></span><br><span class="line"><span class="comment"># assert "PurpleMStone" in link_label</span></span><br><span class="line"></span><br><span class="line">browser.quit()</span><br></pre></td></tr></table></figure><h1 id="Working-with-PDFs"><a href="#Working-with-PDFs" class="headerlink" title="Working with PDFs"></a>Working with PDFs</h1><p><strong>Demo 1</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> PyPDF2</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">"first.pdf"</span>, <span class="string">"rb"</span>) <span class="keyword">as</span> file:</span><br><span class="line"> reader = PyPDF2.PdfFileReader(file)</span><br><span class="line"> print(reader.numPages)</span><br><span class="line"> page = reader.getPage(<span class="number">0</span>) <span class="comment"># 获取第一页</span></span><br><span class="line"> page.rotateClockwise(<span class="number">90</span>) <span class="comment"># 页面旋转90度</span></span><br><span class="line"> </span><br><span class="line"> writer = PyPDF2.PdfFileWriter()</span><br><span class="line"> writer.addPage(page)</span><br><span class="line"> <span class="keyword">with</span> open(<span class="string">"rotated.pdf"</span>, <span class="string">"wb"</span>) <span class="keyword">as</span> output:</span><br><span class="line"> writer.write(output)</span><br></pre></td></tr></table></figure><p><strong>Demo 2: 合并PDF</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> PyPDF2</span><br><span class="line"></span><br><span class="line">merger = PyPDF2.PdfFileMerger()</span><br><span class="line">file_names = [<span class="string">"first.pdf"</span>, <span class="string">"second.pdf"</span>]</span><br><span class="line"><span class="keyword">for</span> file_name <span class="keyword">in</span> file_names:</span><br><span class="line"> merger.append(file_name)</span><br><span class="line">merger.write(<span class="string">"combined.pdf"</span>)</span><br></pre></td></tr></table></figure><h1 id="Excel-Spreadsheets"><a href="#Excel-Spreadsheets" class="headerlink" title="Excel Spreadsheets"></a>Excel Spreadsheets</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> openpyxl</span><br><span class="line"></span><br><span class="line">wb = openpyxl.load_workbook(<span class="string">"transactions.xlsx"</span>)</span><br><span class="line">print(wb.sheetnames)</span><br><span class="line"></span><br><span class="line">sheet = wb[<span class="string">"Sheet1"</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># wb.create_sheet(["Sheet2", 0])</span></span><br><span class="line"><span class="comment"># wb.remove_sheet(sheet)</span></span><br><span class="line"></span><br><span class="line">cell = sheet[<span class="string">"a1"</span>]</span><br><span class="line"><span class="comment"># print(cell.row)</span></span><br><span class="line"><span class="comment"># print(cell.column)</span></span><br><span class="line"><span class="comment"># print(cell.coordinate)</span></span><br><span class="line"><span class="comment"># cell = sheet.cell(row=1, column=1)</span></span><br><span class="line"></span><br><span class="line">print(sheet.max_row)</span><br><span class="line">print(sheet.max_column)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> row <span class="keyword">in</span> range(<span class="number">1</span>, sheet.max_row + <span class="number">1</span>):</span><br><span class="line"> <span class="keyword">for</span> column <span class="keyword">in</span> range(<span class="number">1</span>, sheet.max_column + <span class="number">1</span>):</span><br><span class="line"> cell = sheet.cell(row, column)</span><br><span class="line"> <span class="comment"># print(cell.value)</span></span><br><span class="line"></span><br><span class="line">column = sheet[<span class="string">"a"</span>]</span><br><span class="line">print(column)</span><br><span class="line">cells = sheet[<span class="string">"a:c"</span>] <span class="comment"># column</span></span><br><span class="line">print(cells)</span><br><span class="line"></span><br><span class="line">print(sheet[<span class="number">1</span>:<span class="number">3</span>]) <span class="comment"># row</span></span><br><span class="line"></span><br><span class="line">sheet.append([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]) <span class="comment"># add a row at the end of the sheet</span></span><br><span class="line"><span class="comment"># sheet.insert_rows insert_columns, delete_rows, delete_columns</span></span><br><span class="line"></span><br><span class="line">wb.save(<span class="string">"transaction2.xlsx"</span>)</span><br></pre></td></tr></table></figure><h1 id="Numpy"><a href="#Numpy" class="headerlink" title="Numpy"></a>Numpy</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"></span><br><span class="line">array = np.array([[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>], [<span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>]])</span><br><span class="line">print(array)</span><br><span class="line">print(type(np.array))</span><br><span class="line">print(array.shape)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">array = np.zeros((<span class="number">3</span>, <span class="number">4</span>), dtype=int)</span><br><span class="line">print(array)</span><br><span class="line"></span><br><span class="line">array = np.ones((<span class="number">3</span>, <span class="number">4</span>), dtype=int)</span><br><span class="line">print(array)</span><br><span class="line"></span><br><span class="line">array = np.full((<span class="number">3</span>, <span class="number">4</span>), <span class="number">5</span>, dtype=int)</span><br><span class="line">print(array)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">array = np.random.random((<span class="number">3</span>, <span class="number">4</span>))</span><br><span class="line">print(array)</span><br><span class="line">print(array[<span class="number">0</span>, <span class="number">0</span>])</span><br><span class="line"></span><br><span class="line">print(array > <span class="number">0.2</span>)</span><br><span class="line"></span><br><span class="line">print(array[array > <span class="number">0.2</span>])</span><br><span class="line"></span><br><span class="line">print(np.sum(array))</span><br><span class="line">print(np.floor(array))</span><br><span class="line">print(np.ceil(array))</span><br><span class="line">print(np.round(array))</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">first = np.array([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>])</span><br><span class="line">second = np.array([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>])</span><br><span class="line">print(first + second)</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<h1 id="Web-Scraping"><a href="#Web-Scraping" class=
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(10)--Python Package Index (Pypi)</title>
<link href="http://yoursite.com/2021/05/13/20210513_Python010/"/>
<id>http://yoursite.com/2021/05/13/20210513_Python010/</id>
<published>2021-05-13T15:50:09.000Z</published>
<updated>2021-05-17T04:24:23.053Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><p>Python标准库不一定够用。所以有:</p><p><a href="https://pypi.org/" target="_blank" rel="noopener">pypi官网</a></p><h1 id="Pip"><a href="#Pip" class="headerlink" title="Pip"></a>Pip</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">pip install requests(安装包)</span><br><span class="line">pip list(查看已安装列表)</span><br><span class="line">pip install requests==2.9.0(安装早前版本的包)</span><br><span class="line">pip install requests==2.9.*(安装早前版本中符合条件的最近的包)</span><br><span class="line">pip install requests~=2.9.0(同上)</span><br><span class="line">pip uninstall requests(卸载)</span><br></pre></td></tr></table></figure><p><strong>使用</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"></span><br><span class="line">response = requests.get(<span class="string">"https://baidu.com"</span>)</span><br><span class="line">print(response)</span><br></pre></td></tr></table></figure><p>输出:</p><p><Response [200]></p><p>200表示成功。</p><h1 id="Virtual-Environments"><a href="#Virtual-Environments" class="headerlink" title="Virtual Environments"></a>Virtual Environments</h1><p>创建虚拟环境:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> python -m venv env</span><br></pre></td></tr></table></figure><p>可以看到当前目录下有一个env文件夹,里面有个pyvenv.cfg,内容如下:</p><blockquote><p>home = D:\Python39<br>include-system-site-packages = false<br>version = 3.9.4</p></blockquote><p>进入虚拟环境:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> env\Scripts\activate.bat</span><br></pre></td></tr></table></figure><p>退出虚拟环境:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> deactivate</span><br></pre></td></tr></table></figure><h2 id="Pipenv"><a href="#Pipenv" class="headerlink" title="Pipenv"></a>Pipenv</h2><p>先安装:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pip install pipenv</span><br></pre></td></tr></table></figure><p>查看虚拟环境在哪(一般不在当前工作目录下,为了节省空间):</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pipenv --venv</span><br></pre></td></tr></table></figure><p>进入虚拟环境:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pipenv shell</span><br></pre></td></tr></table></figure><p>退出虚拟环境:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> <span class="built_in">exit</span></span><br></pre></td></tr></table></figure><h2 id="Virtual-Environments-in-VSCode"><a href="#Virtual-Environments-in-VSCode" class="headerlink" title="Virtual Environments in VSCode"></a>Virtual Environments in VSCode</h2><p>查看虚拟环境在哪:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pipenv --venv</span><br></pre></td></tr></table></figure><p>得到路径: C:/Users/11405/.virtualenvs/HelloWorldBjQZ8Ory</p><p>在VSCode中,File→Preference→settings,打开settings.json,改这两项(没有就自己加):</p><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">"python.pythonPath": "C:/Users/11405/.virtualenvs/HelloWorldBjQZ8Ory/Scripts/python.exe",</span><br><span class="line">"code-runner.executorMap": {</span><br><span class="line"> "python": "C:/Users/11405/.virtualenvs/HelloWorldBjQZ8Ory/Scripts/python.exe",</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>点击VSCode左下角,然后选择pipenv为解释器,即可。</p><h2 id="Pipfile"><a href="#Pipfile" class="headerlink" title="Pipfile"></a>Pipfile</h2><p>在用pipenv创建虚拟环境时,当前目录(不是虚拟环境所在目录)下会生成两个文件:</p><blockquote><p>Pipfile</p><p>Pipfile.lock</p></blockquote><p>Pipfile文件:</p><blockquote><p>[[source]]<br>url = “<a href="https://pypi.org/simple" target="_blank" rel="noopener">https://pypi.org/simple</a>“<br>verify_ssl = true<br>name = “pypi”</p><p>[packages]<br>requests = “*”</p><p>[dev-packages]<br>pylint = “*”</p><p>[requires]<br>python_version = “3.9”</p></blockquote><p>Pipfile.lock是一个json文件,存了所有包的版本,所以换一台机器跑这个代码,依赖的还是这些版本的包,就不会出问题。</p><p>在另一台机器,只要:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pipenv install</span><br></pre></td></tr></table></figure><p>就会根据Pipfile创建一样的环境</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pipenv install --ignore-pipfile</span><br></pre></td></tr></table></figure><p>就会根据Pipfile.lock安装依赖包。</p><h2 id="Managing-the-Dependencies"><a href="#Managing-the-Dependencies" class="headerlink" title="Managing the Dependencies"></a>Managing the Dependencies</h2><p>可以用</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pipenv graph</span><br></pre></td></tr></table></figure><p>看已安装的包及其依赖项。</p><p>卸载某个包后,再用上述命令查看,会发现依赖项还在(因为这些依赖项可能在别的地方有用的)。</p><p>更新包和依赖项(想安装最新的,就改Pipfile中的版本号为*):</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pipenv update requests</span><br></pre></td></tr></table></figure><p>更新所有包的依赖项:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pipenv update --outdated</span><br></pre></td></tr></table></figure><h1 id="Publishing-Packages"><a href="#Publishing-Packages" class="headerlink" title="Publishing Packages"></a>Publishing Packages</h1><p>在pypi官网上注册一个账号(记得激活邮箱)。</p><p>然后安装:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> pip install setuptools wheel twine</span><br></pre></td></tr></table></figure><p>新建一个项目,包含 stonepdf,test(单元测试),data(各种数据) 三个文件夹。</p><p>需要以下文件:</p><ol><li><p><strong>LICENSE</strong>:到 <a href="https://choosealicense.com/" target="_blank" rel="noopener">https://choosealicense.com/</a> copy一个</p></li><li><p><strong>README.md</strong>:介绍你的项目</p></li><li><p><strong>setup.py</strong></p></li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># setup.py</span></span><br><span class="line"><span class="keyword">import</span> setuptools</span><br><span class="line"><span class="keyword">import</span> setuptools</span><br><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">setuptools.setup(</span><br><span class="line"> name=<span class="string">"stonepdf"</span>,</span><br><span class="line"> version=<span class="number">1.0</span>,</span><br><span class="line"> long_description=Path(<span class="string">"README.md"</span>).read_text(),</span><br><span class="line"> packages=setuptools.find_packages(exclude=[<span class="string">"tests"</span>, <span class="string">"data"</span>]) <span class="comment"># 忽略这两个</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>然后运行(sdist表示source distribution, bdist表示built distribution):</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> python setup.py sdist bdist_wheel</span><br></pre></td></tr></table></figure><p>然后上传:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> twine upload dist/*</span><br></pre></td></tr></table></figure><p>*表示上传dist目录下所有文件。</p><p>然后就可以像用其他包一样用我们的包啦。</p><h1 id="Docstrings"><a href="#Docstrings" class="headerlink" title="Docstrings"></a>Docstrings</h1><p>其他人提供的module在VSCode中有许多提示性信息显示出来,这就需要Docstrings。</p><p>比如(用””” “””包含的部分):</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">""" This module provides functions to convert a PDF to text. """</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Converter</span>:</span></span><br><span class="line"> <span class="string">""" A simple converter for converting PDFs to text. """</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">convert</span><span class="params">(self, path)</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Convert the given PDF to text. </span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> Parameters:</span></span><br><span class="line"><span class="string"> path (str): The path to a PDF file.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"> Returns:</span></span><br><span class="line"><span class="string"> str: The content of the PDF file as text.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"></span><br><span class="line"> print(<span class="string">"pdf2text"</span>)</span><br></pre></td></tr></table></figure><p>这些信息在 VSCode 调用这些 module 的 method、class 时会显示出来,便于别人使用。</p><p><img src="/images/Python/003.png" alt="003"></p><h1 id="Pydoc"><a href="#Pydoc" class="headerlink" title="Pydoc"></a>Pydoc</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">> pydoc math</span><br><span class="line">> pydoc stonepdf.pdf2text</span><br><span class="line">> pydoc -w stonepdf.pdf2text</span><br><span class="line">> pydoc -p 1234</span><br></pre></td></tr></table></figure><p>查看包的介绍文件。-w在html中显示。-p会提供网址。</p><p>在 Windows 用:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">> python -m pydoc math</span><br></pre></td></tr></table></figure><p>其余同理。</p>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<p>Python标准库不一定够用。所以有:</p>
<p><a href="https://pypi.
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(9)--Python Standard Library</title>
<link href="http://yoursite.com/2021/05/12/20210512_Python009/"/>
<id>http://yoursite.com/2021/05/12/20210512_Python009/</id>
<published>2021-05-12T15:50:09.000Z</published>
<updated>2021-05-17T04:24:23.046Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><h1 id="Files"><a href="#Files" class="headerlink" title="Files"></a>Files</h1><h2 id="Paths"><a href="#Paths" class="headerlink" title="Paths"></a>Paths</h2><p><strong>Demo 1: Basic Methods</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">path = Path(<span class="string">r"ecommerce/__init__.py"</span>) <span class="comment"># create a path object</span></span><br><span class="line">print(path.exists()) <span class="comment"># file exists or not</span></span><br><span class="line">print(path.is_file()) <span class="comment"># is a file or not</span></span><br><span class="line">print(path.is_dir())<span class="comment"># is a directory or not</span></span><br><span class="line">print(path.name)</span><br><span class="line">print(path.stem) <span class="comment"># return the file name without extension</span></span><br><span class="line">print(path.suffix) <span class="comment"># return the extension</span></span><br><span class="line">print(path.parent) <span class="comment"># parent folder</span></span><br></pre></td></tr></table></figure><p>输出结果:</p><p>True<br>True<br>False<br>__init__.py<br>__init__<br>.py<br>ecommerce</p><p><strong>Demo 2</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">path = Path(<span class="string">r"ecommerce/__init__.py"</span>) <span class="comment"># create a path object</span></span><br><span class="line"></span><br><span class="line">path = path.with_name(<span class="string">"file.txt"</span>) <span class="comment"># 产生一个新path object,(文件尚未产生)</span></span><br><span class="line">print(path)</span><br><span class="line"></span><br><span class="line">print(path.absolute())</span><br><span class="line"></span><br><span class="line">path = path.with_suffix(<span class="string">".txt"</span>) <span class="comment"># 产生一个新path object,(文件尚未产生)</span></span><br><span class="line">print(path)</span><br></pre></td></tr></table></figure><p>输出:</p><p>ecommerce\file.txt<br>e:\Stone\Python\HelloWorld\ecommerce\file.txt<br>ecommerce\file.txt</p><h2 id="Working-with-Directories"><a href="#Working-with-Directories" class="headerlink" title="Working with Directories"></a>Working with Directories</h2><p><strong>Demo 1: Basic Methods</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">path = Path(<span class="string">"ecommerce"</span>)</span><br><span class="line">path.exists()</span><br><span class="line">path.mkdir() <span class="comment"># creat this directory</span></span><br><span class="line">path.rmdir() <span class="comment"># remove this directory</span></span><br><span class="line">path.rename(<span class="string">"ecommerce2"</span>) <span class="comment"># rename</span></span><br></pre></td></tr></table></figure><p><strong>Demo 2</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">path = Path(<span class="string">"ecommerce"</span>)</span><br><span class="line">print(path.iterdir())</span><br></pre></td></tr></table></figure><p>输出:</p><p><generator object Path.iterdir at 0x00000180577926D0></p><p>可见,得到的是一个generator object。因为目录下可能有大量文件,generator 更高效。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">paths = [p <span class="keyword">for</span> p <span class="keyword">in</span> path.iterdir()]</span><br><span class="line">print(paths)</span><br></pre></td></tr></table></figure><p>输出:</p><p>[WindowsPath(‘ecommerce/customer’), WindowsPath(‘ecommerce/shopping’), WindowsPath(‘ecommerce/__init__.py’), WindowsPath(‘ecommerce/__pycache__‘)]</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># filter: 只获取目录</span></span><br><span class="line">paths = [p <span class="keyword">for</span> p <span class="keyword">in</span> path.iterdir() <span class="keyword">if</span> p.is_dir()]</span><br><span class="line">print(paths)</span><br></pre></td></tr></table></figure><p>输出:</p><p>[WindowsPath(‘ecommerce/customer’), WindowsPath(‘ecommerce/shopping’), WindowsPath(‘ecommerce/__pycache__‘)]</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 当前目录下符合条件的文件</span></span><br><span class="line">py_files = [p <span class="keyword">for</span> p <span class="keyword">in</span> path.glob(<span class="string">"*.py"</span>)]</span><br><span class="line">print(py_files)</span><br></pre></td></tr></table></figure><p>输出:</p><p>[WindowsPath(‘ecommerce/__init__.py’)]</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># recursively (包括子目录下符合条件的文件)</span></span><br><span class="line">py_files = [p <span class="keyword">for</span> p <span class="keyword">in</span> path.rglob(<span class="string">"*.py"</span>)]</span><br><span class="line">print(py_files)</span><br></pre></td></tr></table></figure><p>输出:</p><p>[WindowsPath(‘ecommerce/__init__.py’), WindowsPath(‘ecommerce/customer/contact.py’), WindowsPath(‘ecommerce/customer/__init__.py’), WindowsPath(‘ecommerce/shopping/sales.py’), WindowsPath(‘ecommerce/shopping/__init__.py’)]</p><h2 id="Working-with-Files"><a href="#Working-with-Files" class="headerlink" title="Working with Files"></a>Working with Files</h2><p><strong>Demo 1</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">path = Path(<span class="string">"ecommerce/__init__.py"</span>)</span><br><span class="line">path.exists()</span><br><span class="line">path.rename(<span class="string">"init.txt"</span>)</span><br><span class="line">path.unlink() <span class="comment"># delete the file</span></span><br></pre></td></tr></table></figure><p><strong>Demo 2: 查看文件状态</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">print(path.stat())</span><br></pre></td></tr></table></figure><p>输出:</p><p>os.stat_result(st_mode=33206, st_ino=1688849860483389, st_dev=971387, st_nlink=1, st_uid=0, st_gid=0, st_size=32, st_atime=1620876102, st_mtime=1620816590, st_ctime=1620814908)</p><p>将时间转为容易识别的形式:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> ctime</span><br><span class="line"></span><br><span class="line">print(ctime(path.stat().st_ctime))<span class="comment"># 打印文件的新建时间</span></span><br></pre></td></tr></table></figure><p>输出:</p><p>Wed May 12 18:21:48 2021</p><p><strong>Demo 3</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">print(path.read_bytes())</span><br><span class="line">print(path.read_text())</span><br><span class="line">path.write_bytes(<span class="string">"..."</span>)</span><br><span class="line">path.write_text(<span class="string">"..."</span>)</span><br></pre></td></tr></table></figure><p>输出:</p><p>b’print(“Ecommerce initialized”)\r\n’<br>print(“Ecommerce initialized”)</p><p><strong>Demo 4:拷贝文件</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"><span class="keyword">import</span> shutil</span><br><span class="line"></span><br><span class="line">source = Path(<span class="string">"ecommerce/__init__.py"</span>)</span><br><span class="line">target = Path() / <span class="string">"__init__.py"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># target.write_text(source.read_text())# 简单粗暴:读->写</span></span><br><span class="line">shutil.copy(source, target)</span><br></pre></td></tr></table></figure><h2 id="Working-with-Zip-Files"><a href="#Working-with-Zip-Files" class="headerlink" title="Working with Zip Files"></a>Working with Zip Files</h2><p><strong>Demo 1</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"><span class="keyword">from</span> zipfile <span class="keyword">import</span> ZipFile</span><br><span class="line"></span><br><span class="line">zip = ZipFile(<span class="string">"files.zip"</span>, <span class="string">"w"</span>)<span class="comment"># 生成一个zip文件</span></span><br><span class="line"><span class="keyword">for</span> path <span class="keyword">in</span> Path(<span class="string">"ecommerce"</span>).rglob(<span class="string">"*.*"</span>):</span><br><span class="line"> zip.write(path)<span class="comment"># 将这些文件存到zip文件中</span></span><br><span class="line">zip.close()<span class="comment"># 关闭</span></span><br></pre></td></tr></table></figure><p><strong>Simpler way</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"><span class="keyword">from</span> zipfile <span class="keyword">import</span> ZipFile</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> ZipFile(<span class="string">"files.zip"</span>, <span class="string">"w"</span>) <span class="keyword">as</span> zip:</span><br><span class="line"> <span class="keyword">for</span> path <span class="keyword">in</span> Path(<span class="string">"ecommerce"</span>).rglob(<span class="string">"*.*"</span>):</span><br><span class="line"> zip.write(path)</span><br></pre></td></tr></table></figure><p>不需要手动close释放。</p><p><strong>Demo 2</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"><span class="keyword">from</span> zipfile <span class="keyword">import</span> ZipFile</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> ZipFile(<span class="string">"files.zip"</span>) <span class="keyword">as</span> zip:</span><br><span class="line"> <span class="comment"># print(zip.namelist())# zip中的文件列表</span></span><br><span class="line"> info = zip.getinfo(<span class="string">"ecommerce/__init__.py"</span>)<span class="comment"># 获取文件信息</span></span><br><span class="line"> print(info.file_size)<span class="comment"># 文件大小</span></span><br><span class="line"> print(info.compress_size)<span class="comment"># 压缩大小</span></span><br><span class="line"> zip.extractall(<span class="string">"extract"</span>)<span class="comment"># 解压到extract文件夹</span></span><br></pre></td></tr></table></figure><h2 id="Working-with-CSV-Files"><a href="#Working-with-CSV-Files" class="headerlink" title="Working with CSV Files"></a>Working with CSV Files</h2><p><strong>Demo 1: 写csv</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">"data.csv"</span>, <span class="string">"w"</span>, newline=<span class="string">''</span>) <span class="keyword">as</span> file:</span><br><span class="line"> writer = csv.writer(file)</span><br><span class="line"> writer.writerow([<span class="string">"transaction_id"</span>, <span class="string">"product_id"</span>, <span class="string">"price"</span>])</span><br><span class="line"> writer.writerow([<span class="number">1000</span>, <span class="number">1</span>, <span class="number">5</span>])</span><br><span class="line"> writer.writerow([<span class="number">1001</span>, <span class="number">2</span>, <span class="number">15</span>])</span><br></pre></td></tr></table></figure><p>如果不加newline=’’,文件会多空行</p><p><strong>Demo 2: 读csv</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">"data.csv"</span>) <span class="keyword">as</span> file:</span><br><span class="line"> reader = csv.reader(file)</span><br><span class="line"> print(list(reader))</span><br></pre></td></tr></table></figure><p>输出:</p><p>[[‘transaction_id’, ‘product_id’, ‘price’], [‘1000’, ‘1’, ‘5’], [‘1001’, ‘2’, ‘15’]]</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> csv</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> open(<span class="string">"data.csv"</span>) <span class="keyword">as</span> file:</span><br><span class="line"> reader = csv.reader(file)</span><br><span class="line"> <span class="keyword">for</span> row <span class="keyword">in</span> reader:<span class="comment"># reader is iterable</span></span><br><span class="line"> print(row)</span><br></pre></td></tr></table></figure><p>输出:</p><p>[‘transaction_id’, ‘product_id’, ‘price’]<br>[‘1000’, ‘1’, ‘5’]<br>[‘1001’, ‘2’, ‘15’]</p><h2 id="Working-with-JSON-Files"><a href="#Working-with-JSON-Files" class="headerlink" title="Working with JSON Files"></a>Working with JSON Files</h2><p><strong>Demo 1: write JSON files</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">movies = [</span><br><span class="line"> {<span class="string">"id"</span>: <span class="number">1</span>, <span class="string">"title"</span>: <span class="string">"Terminator"</span>, <span class="string">"year"</span>: <span class="number">1989</span>},</span><br><span class="line"> {<span class="string">"id"</span>: <span class="number">2</span>, <span class="string">"title"</span>: <span class="string">"Kindergarten Cop"</span>, <span class="string">"year"</span>: <span class="number">1993</span>},</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">data = json.dumps(movies)</span><br><span class="line">Path(<span class="string">"movies.json"</span>).write_text(data)</span><br></pre></td></tr></table></figure><p><strong>Demo 2: read JSON Files</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">data = Path(<span class="string">"movies.json"</span>).read_text()</span><br><span class="line">movies = json.loads(data)</span><br><span class="line">print(movies[<span class="number">0</span>])</span><br></pre></td></tr></table></figure><p>输出:</p><p>{‘id’: 1, ‘title’: ‘Terminator’, ‘year’: 1989}</p><h2 id="Working-with-a-SQLite-Database"><a href="#Working-with-a-SQLite-Database" class="headerlink" title="Working with a SQLite Database"></a>Working with a SQLite Database</h2><p><strong>Demo 1: write</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sqlite3</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">movies = json.loads(Path(<span class="string">"movies.json"</span>).read_text())</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> sqlite3.connect(<span class="string">"db.sqlite3"</span>) <span class="keyword">as</span> conn:</span><br><span class="line"> command = <span class="string">"INSERT INTO Movies VALUES(?, ?, ?)"</span></span><br><span class="line"> <span class="keyword">for</span> movie <span class="keyword">in</span> movies:</span><br><span class="line"> conn.execute(command, tuple(movie.values()))</span><br><span class="line"> conn.commit()</span><br></pre></td></tr></table></figure><p><strong>Demo 2: read</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sqlite3</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> sqlite3.connect(<span class="string">"db.sqlite3"</span>) <span class="keyword">as</span> conn:</span><br><span class="line"> command = <span class="string">"SELECT * FROM Movies"</span></span><br><span class="line"> cursor = conn.execute(command)</span><br><span class="line"> <span class="keyword">for</span> row <span class="keyword">in</span> cursor:</span><br><span class="line"> print(row)</span><br></pre></td></tr></table></figure><p>或:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sqlite3</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> sqlite3.connect(<span class="string">"db.sqlite3"</span>) <span class="keyword">as</span> conn:</span><br><span class="line"> command = <span class="string">"SELECT * FROM Movies"</span></span><br><span class="line"> cursor = conn.execute(command)</span><br><span class="line"> movies = cursor.fetchall()</span><br><span class="line"> print(movies)</span><br></pre></td></tr></table></figure><h1 id="Time"><a href="#Time" class="headerlink" title="Time"></a>Time</h1><h2 id="Working-with-Timestamps"><a href="#Working-with-Timestamps" class="headerlink" title="Working with Timestamps"></a>Working with Timestamps</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">send_emails</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">1000000</span>):</span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">start = time.time()</span><br><span class="line">send_emails()</span><br><span class="line">end = time.time()</span><br><span class="line">duration = end - start</span><br><span class="line">print(duration)</span><br></pre></td></tr></table></figure><p>输出:</p><p>0.016989707946777344</p><h2 id="Working-with-DateTimes"><a href="#Working-with-DateTimes" class="headerlink" title="Working with DateTimes"></a>Working with DateTimes</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line">dt1 = datetime(<span class="number">2018</span>, <span class="number">1</span>, <span class="number">1</span>)</span><br><span class="line">print(dt1)<span class="comment"># 2018-01-01 00:00:00</span></span><br><span class="line">dt2 = datetime.now()</span><br><span class="line">print(dt2)<span class="comment"># 2021-05-13 16:51:52.269074</span></span><br><span class="line">print(dt2 > dt1)<span class="comment"># True</span></span><br><span class="line"></span><br><span class="line">dt = datetime.strptime(<span class="string">"2018/01/01"</span>, <span class="string">"%Y/%m/%d"</span>) <span class="comment"># 指定时间</span></span><br><span class="line">print(dt)<span class="comment"># 2018-01-01 00:00:00</span></span><br><span class="line"></span><br><span class="line">dt = datetime.fromtimestamp(time.time())</span><br><span class="line">print(<span class="string">f"<span class="subst">{dt.year}</span>/<span class="subst">{dt.month}</span>"</span>)<span class="comment"># 2021/5</span></span><br><span class="line">print(dt.strftime(<span class="string">"%Y/%m"</span>)) <span class="comment"># 2021/05 (当地时间)</span></span><br></pre></td></tr></table></figure><h2 id="Working-with-Time-Deltas"><a href="#Working-with-Time-Deltas" class="headerlink" title="Working with Time Deltas"></a>Working with Time Deltas</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime, timedelta</span><br><span class="line"></span><br><span class="line">dt1 = datetime(<span class="number">2020</span>, <span class="number">1</span>, <span class="number">1</span>) + timedelta(days=<span class="number">1</span>, seconds=<span class="number">1000</span>)</span><br><span class="line">print(dt1)</span><br><span class="line">dt2 = datetime.now()</span><br><span class="line"></span><br><span class="line">duration = dt2 - dt1</span><br><span class="line">print(duration)</span><br><span class="line">print(<span class="string">"days"</span>, duration.days)</span><br><span class="line">print(<span class="string">"seconds"</span>, duration.seconds)<span class="comment"># 不计天数</span></span><br><span class="line">print(<span class="string">"total_seconds"</span>, duration.total_seconds())<span class="comment"># 计天数</span></span><br></pre></td></tr></table></figure><p>输出:</p><p>2020-01-02 00:16:40<br>497 days, 16:44:06.578196<br>days 497<br>seconds 60246<br>total_seconds 43001046.578196</p><h1 id="Random-Values"><a href="#Random-Values" class="headerlink" title="Random Values"></a>Random Values</h1><h2 id="Generating-Random-Values"><a href="#Generating-Random-Values" class="headerlink" title="Generating Random Values"></a>Generating Random Values</h2><p><strong>Demo 1</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> string</span><br><span class="line"></span><br><span class="line">print(random.random())</span><br><span class="line">print(random.randint(<span class="number">1</span>, <span class="number">10</span>))</span><br><span class="line">print(random.choice([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]))<span class="comment"># 从给定的值中随机选一个</span></span><br><span class="line">print(random.choices([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>], k=<span class="number">4</span>))<span class="comment"># 从给定的值中随机选出序列</span></span><br><span class="line">print(<span class="string">""</span>.join(random.choices(<span class="string">"abcdefg"</span>, k=<span class="number">4</span>)))</span><br></pre></td></tr></table></figure><p>输出:</p><p>0.9791978038762406<br>2<br>3<br>[4, 1, 3, 3]<br>eefe</p><p><strong>Demo 2</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> string</span><br><span class="line"></span><br><span class="line">print(string.ascii_letters)<span class="comment"># 所有字母</span></span><br><span class="line">print(string.digits)<span class="comment"># 所有数字</span></span><br><span class="line">print(<span class="string">""</span>.join(random.choices(string.ascii_letters + string.digits, k=<span class="number">4</span>)))</span><br></pre></td></tr></table></figure><p>输出:</p><p>abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ<br>0123456789<br>g02V</p><p><strong>Demo 3:打乱顺序</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> random</span><br><span class="line"></span><br><span class="line">numbers = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line">random.shuffle(numbers)</span><br><span class="line">print(numbers)</span><br></pre></td></tr></table></figure><p>输出:</p><p>[4, 2, 3, 1]</p><h1 id="Browser"><a href="#Browser" class="headerlink" title="Browser"></a>Browser</h1><h2 id="Opening-the-Browser"><a href="#Opening-the-Browser" class="headerlink" title="Opening the Browser"></a>Opening the Browser</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> webbrowser</span><br><span class="line"></span><br><span class="line">print(<span class="string">"Deployment completed"</span>)</span><br><span class="line">webbrowser.open(<span class="string">"https://baidu.com"</span>)</span><br></pre></td></tr></table></figure><h2 id="Sending-Emails"><a href="#Sending-Emails" class="headerlink" title="Sending Emails"></a>Sending Emails</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> email.mime.multipart <span class="keyword">import</span> MIMEMultipart</span><br><span class="line"><span class="keyword">from</span> email.mime.text <span class="keyword">import</span> MIMEText</span><br><span class="line"><span class="keyword">from</span> email.mime.image <span class="keyword">import</span> MIMEImage</span><br><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"><span class="keyword">import</span> smtplib</span><br><span class="line"></span><br><span class="line">message = MIMEMultipart()</span><br><span class="line">message[<span class="string">"from"</span>] = <span class="string">"name_of_sender"</span></span><br><span class="line">message[<span class="string">"to"</span>] = <span class="string">"[email protected]"</span></span><br><span class="line">message[<span class="string">"subject"</span>] = <span class="string">"This is a test"</span></span><br><span class="line">message.attach(MIMEText(<span class="string">"Body"</span>))<span class="comment"># 正文</span></span><br><span class="line">message.attach(MIMEImage(Path(<span class="string">"ww.jpg"</span>).read_bytes()))<span class="comment"># 附件图片</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> smtplib.SMTP(host=<span class="string">"smtp.whu.edu.cn"</span>, port=<span class="number">25</span>) <span class="keyword">as</span> smtp:</span><br><span class="line"> smtp.ehlo() <span class="comment"># say hello to smtp server</span></span><br><span class="line"> smtp.starttls() <span class="comment"># TLS</span></span><br><span class="line"> smtp.login(<span class="string">"[email protected]"</span>, <span class="string">"password"</span>)</span><br><span class="line"> smtp.send_message(message)</span><br><span class="line"> print(<span class="string">"Sent..."</span>)</span><br></pre></td></tr></table></figure><h2 id="Working-with-Templates"><a href="#Working-with-Templates" class="headerlink" title="Working with Templates"></a>Working with Templates</h2><p>新建一个html文件 template.html,输入!回车会自动生成模板,删除head块中的内容,body块写入内容。最后如下:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE html></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> Hi <span class="tag"><<span class="name">strong</span>></span>$name<span class="tag"></<span class="name">strong</span>></span>, this is our test email.</span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure><p>strong表示字体加粗。</p><p>在上述email例子中:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> string <span class="keyword">import</span> Template</span><br><span class="line"></span><br><span class="line">template = Template(Path(<span class="string">"template.html"</span>).read_text())<span class="comment"># 读入模板</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 相应语句改为</span></span><br><span class="line">body = template.substitute({<span class="string">"name"</span>: <span class="string">"John"</span>}) <span class="comment"># 或者name="John"</span></span><br><span class="line">message.attach(MIMEText(body, <span class="string">"html"</span>))<span class="comment"># "html"</span></span><br></pre></td></tr></table></figure><p>即可。</p><h1 id="Command-line-Arguments"><a href="#Command-line-Arguments" class="headerlink" title="Command-line Arguments"></a>Command-line Arguments</h1><p><strong>Demo 1</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">print(sys.argv)</span><br></pre></td></tr></table></figure><p>>python app.py -a -b -c</p><p>[‘app.py’, ‘-a’, ‘-b’, ‘-c’]</p><p><strong>Demo 2</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> len(sys.argv) == <span class="number">1</span>:</span><br><span class="line"> print(<span class="string">"USAGE: python3 app.py <password>"</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> password = sys.argv[<span class="number">1</span>]</span><br><span class="line"> print(<span class="string">"password"</span>, password)</span><br></pre></td></tr></table></figure><p>> python app.py</p><p>USAGE: python3 app.py <password></p><p>> python app.py 1234</p><p>password 1234</p><h1 id="Running-External-Programs"><a href="#Running-External-Programs" class="headerlink" title="Running External Programs"></a>Running External Programs</h1><h2 id="Python执行命令"><a href="#Python执行命令" class="headerlink" title="Python执行命令"></a>Python执行命令</h2><p>在 window 10 上跑的。</p><p>用python 执行windows命令dir</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line">completed = subprocess.run([<span class="string">"dir"</span>, <span class="string">"."</span>], </span><br><span class="line"> shell=<span class="literal">True</span>,</span><br><span class="line"> capture_output=<span class="literal">True</span>, </span><br><span class="line"> text=<span class="literal">True</span>)</span><br><span class="line">print(type(completed))</span><br></pre></td></tr></table></figure><p>capture_output=True使得输出在completed.stdout。</p><p>输出:</p><p><class ‘subprocess.CompletedProcess’></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">print(<span class="string">"args"</span>, completed.args)</span><br><span class="line">print(<span class="string">"returncode"</span>, completed.returncode) <span class="comment"># 0: success</span></span><br><span class="line">print(<span class="string">"stderr"</span>, completed.stderr) <span class="comment"># standard error</span></span><br><span class="line">print(<span class="string">"stdout"</span>, completed.stdout) <span class="comment"># standard output</span></span><br></pre></td></tr></table></figure><p>输出:</p><p>> python app.py</p><p>args [‘dir’, ‘.’]<br>returncode 0<br>stderr<br>stdout 驱动器 E 中的卷没有标签。<br> 卷的序列号是 000E-D27B</p><p> E:\Stone\Python\HelloWorld 的目录</p><p>2021/05/13 19:24 <DIR> .<br>2021/05/13 19:24 <DIR> ..<br>2021/05/06 16:44 <DIR> .vscode<br>2021/05/13 19:24 341 app.py<br>2021/05/06 16:15 8 content.txt<br>2021/05/13 15:36 54 data.csv<br>2021/05/13 15:55 0 db.sqlite3<br>2021/05/12 18:49 <DIR> ecommerce<br>2021/05/13 15:27 <DIR> extract<br>2021/05/13 14:42 3,647 files.zip<br>2021/05/13 15:48 102 movies.json<br>2021/05/13 18:03 138 template.html<br>2021/05/13 17:42 78,556 ww.jpg<br>2021/05/12 18:12 <DIR> __pycache__<br> 8 个文件 82,846 字节<br> 6 个目录 46,196,027,392 可用字节</p><h2 id="Python执行另一个python脚本"><a href="#Python执行另一个python脚本" class="headerlink" title="Python执行另一个python脚本"></a>Python执行另一个python脚本</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># other.py</span></span><br><span class="line">print(<span class="string">"Here is a complicated script."</span>)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># app.py</span></span><br><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line">completed = subprocess.run([<span class="string">"python"</span>, <span class="string">"other.py"</span>], </span><br><span class="line"> shell=<span class="literal">True</span>,</span><br><span class="line"> capture_output=<span class="literal">True</span>, </span><br><span class="line"> text=<span class="literal">True</span>)</span><br><span class="line">print(<span class="string">"args"</span>, completed.args)</span><br><span class="line">print(<span class="string">"returncode"</span>, completed.returncode) <span class="comment"># 0: success</span></span><br><span class="line">print(<span class="string">"stderr"</span>, completed.stderr) <span class="comment"># standard error</span></span><br><span class="line">print(<span class="string">"stdout"</span>, completed.stdout) <span class="comment"># standard output</span></span><br></pre></td></tr></table></figure><p>> python app.py</p><p>args [‘python’, ‘other.py’]<br>returncode 0<br>stderr<br>stdout Here is a complicated script.</p><p>看到 stdout 就是 other.py 的输出。</p><h2 id="错误命令"><a href="#错误命令" class="headerlink" title="错误命令"></a>错误命令</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line">completed = subprocess.run([<span class="string">"False"</span>], </span><br><span class="line"> shell=<span class="literal">True</span>,</span><br><span class="line"> capture_output=<span class="literal">True</span>, </span><br><span class="line"> text=<span class="literal">True</span>)</span><br><span class="line">print(<span class="string">"args"</span>, completed.args)</span><br><span class="line">print(<span class="string">"returncode"</span>, completed.returncode) <span class="comment"># 0: success</span></span><br><span class="line">print(<span class="string">"stderr"</span>, completed.stderr) <span class="comment"># standard error</span></span><br><span class="line">print(<span class="string">"stdout"</span>, completed.stdout) <span class="comment"># standard output</span></span><br></pre></td></tr></table></figure><p>> python app.py</p><p>args [‘False’]<br>returncode 1<br>stderr ‘False’ 不是内部或外部命令,也不是可运行的程序<br>或批处理文件。</p><p>stdout</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> completed.returncode != <span class="number">0</span>:<span class="comment"># 可以这样判断处理</span></span><br><span class="line"> print(completed.stderr)</span><br></pre></td></tr></table></figure><p>也可以这样处理:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> subprocess</span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> completed = subprocess.run([<span class="string">"False"</span>],</span><br><span class="line"> shell=<span class="literal">True</span>,</span><br><span class="line"> capture_output=<span class="literal">True</span>,</span><br><span class="line"> text=<span class="literal">True</span>,</span><br><span class="line"> check=<span class="literal">True</span>)<span class="comment"># 自动检查</span></span><br><span class="line"> print(<span class="string">"args"</span>, completed.args)</span><br><span class="line"> print(<span class="string">"returncode"</span>, completed.returncode) <span class="comment"># 0: success</span></span><br><span class="line"> print(<span class="string">"stderr"</span>, completed.stderr) <span class="comment"># standard error</span></span><br><span class="line"> print(<span class="string">"stdout"</span>, completed.stdout) <span class="comment"># standard output</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">except</span> subprocess.CalledProcessError <span class="keyword">as</span> ex:</span><br><span class="line"> print(ex)</span><br></pre></td></tr></table></figure><p>输出:</p><p>Command ‘[‘False’]’ returned non-zero exit status 1.</p>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<h1 id="Files"><a href="#Files" class="headerlink" t
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(8)--Modules</title>
<link href="http://yoursite.com/2021/05/12/20210512_Python008/"/>
<id>http://yoursite.com/2021/05/12/20210512_Python008/</id>
<published>2021-05-12T09:50:09.000Z</published>
<updated>2021-05-17T04:24:23.039Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># sales.py</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">calc_tax</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">calc_shipping</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># app.py</span></span><br><span class="line"><span class="keyword">from</span> sales <span class="keyword">import</span> calc_shipping, calc_tax</span><br><span class="line"></span><br><span class="line">calc_shipping()</span><br><span class="line">calc_tax()</span><br></pre></td></tr></table></figure><p>或:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sales</span><br><span class="line"></span><br><span class="line">sales.calc_shipping()</span><br><span class="line">sales.calc_tax()</span><br></pre></td></tr></table></figure><h1 id="Compiled-Python-Files"><a href="#Compiled-Python-Files" class="headerlink" title="Compiled Python Files"></a>Compiled Python Files</h1><p>编译后在__pycache__生成 sales.cpython-39.pyc 文件,如果sales.py未作更改,则此文件直接用(相当于缓存),可以加快程序执行。如果sales.py改了,则要重新生成此文件。</p><h1 id="Module-Search-Path"><a href="#Module-Search-Path" class="headerlink" title="Module Search Path"></a>Module Search Path</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"></span><br><span class="line">print(sys.path)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="string">'e:\\Stone\\Python\\HelloWorld'</span>, <span class="string">'D:\\Python39\\python39.zip'</span>, <span class="string">'D:\\Python39\\DLLs'</span>, <span class="string">'D:\\Python39\\lib'</span>, <span class="string">'D:\\Python39'</span>, <span class="string">'C:\\Users\\11405\\AppData\\Roaming\\Python\\Python39\\site-packages'</span>, <span class="string">'D:\\Python39\\lib\\site-packages'</span>]</span><br></pre></td></tr></table></figure><h1 id="Packages"><a href="#Packages" class="headerlink" title="Packages"></a>Packages</h1><p>package 对应于文件夹;module 对应于文件</p><p>比如在 app.py 所在目录下有个 ecommerce 文件夹,ecommerce 文件夹内有多个文件,包括 sales.py,假如改文件夹内有文件__init__.py,则 python 会将此文件夹视为 package.</p><p>那么可以这样用:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># app.py</span></span><br><span class="line"><span class="keyword">from</span> ecommerce <span class="keyword">import</span> sales</span><br><span class="line"></span><br><span class="line">sales.calc_tax()</span><br><span class="line">sales.calc_shipping()</span><br></pre></td></tr></table></figure><h2 id="Sub-packages"><a href="#Sub-packages" class="headerlink" title="Sub-packages"></a>Sub-packages</h2><p>ecommerce 文件夹内有 shopping 文件夹, shopping 文件夹内有文件__init__.py 和 sales.py,则:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># app.py</span></span><br><span class="line"><span class="keyword">from</span> ecommerce.shopping <span class="keyword">import</span> sales</span><br></pre></td></tr></table></figure><h2 id="Intra-package-References"><a href="#Intra-package-References" class="headerlink" title="Intra-package References"></a>Intra-package References</h2><p><img src="/images/Python/002.png" alt="002"></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># sales.py</span></span><br><span class="line"><span class="keyword">from</span> ecommerce.customer <span class="keyword">import</span> contact</span><br><span class="line"><span class="keyword">from</span> ..customer <span class="keyword">import</span> contact<span class="comment"># ..表示父目录</span></span><br><span class="line"></span><br><span class="line">contact.contact_customer()</span><br></pre></td></tr></table></figure><h2 id="The-dir-Function"><a href="#The-dir-Function" class="headerlink" title="The dir() Function"></a>The dir() Function</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># app.py</span></span><br><span class="line"><span class="keyword">from</span> ecommerce.shopping <span class="keyword">import</span> sales</span><br><span class="line"></span><br><span class="line">print(dir(sales))</span><br></pre></td></tr></table></figure><p>输出sales的各种方法:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="string">'__builtins__'</span>, <span class="string">'__cached__'</span>, <span class="string">'__doc__'</span>, <span class="string">'__file__'</span>, <span class="string">'__loader__'</span>, <span class="string">'__name__'</span>, <span class="string">'__package__'</span>, <span class="string">'__spec__'</span>, <span class="string">'calc_shipping'</span>, <span class="string">'calc_tax'</span>, <span class="string">'contact'</span>]</span><br></pre></td></tr></table></figure><p>比如:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># app.py</span></span><br><span class="line"><span class="keyword">from</span> ecommerce.shopping <span class="keyword">import</span> sales</span><br><span class="line"></span><br><span class="line">print(sales.__name__)</span><br><span class="line">print(sales.__package__)</span><br><span class="line">print(sales.__file__)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ecommerce.shopping.sales</span><br><span class="line">ecommerce.shopping</span><br><span class="line">e:\Stone\Python\HelloWorld\ecommerce\shopping\sales.py</span><br></pre></td></tr></table></figure><h1 id="Executing-Modules-as-Scripts"><a href="#Executing-Modules-as-Scripts" class="headerlink" title="Executing Modules as Scripts"></a>Executing Modules as Scripts</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ecommerce/shopping/sales.py</span></span><br><span class="line">print(<span class="string">"Sales initialized"</span>, __name__)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">calc_tax</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">calc_shipping</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ecommerce/__init__.py</span></span><br><span class="line">print(<span class="string">"Ecommerce initialized"</span>)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># app.py</span></span><br><span class="line"><span class="keyword">from</span> ecommerce.shopping <span class="keyword">import</span> sales</span><br></pre></td></tr></table></figure><p>执行 app.py,输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Ecommerce initialized</span><br><span class="line">Sales initialized ecommerce.shopping.sales</span><br></pre></td></tr></table></figure><p>如果执行sales.py, 输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Sales initialized __main__</span><br></pre></td></tr></table></figure><p>可见__name__对于不同py文件是不同的。</p><p>如果加上:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line"> <span class="comment"># bla bla bla</span></span><br></pre></td></tr></table></figure><p>则只在当前py文件运行时执行这些 # blablabla 的code。</p>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<figure class="highlight python"><table><tr><td clas
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(7)--Classes</title>
<link href="http://yoursite.com/2021/05/11/20210511_Python007/"/>
<id>http://yoursite.com/2021/05/11/20210511_Python007/</id>
<published>2021-05-11T15:50:09.000Z</published>
<updated>2021-05-17T04:24:23.019Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><p>👉 Class: blueprint for creating new objects — Human</p><p>👉 Object: instance of a class — John, Mary, Jack</p><h1 id="Creating-Classes"><a href="#Creating-Classes" class="headerlink" title="Creating Classes"></a>Creating Classes</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"draw"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = Point()</span><br><span class="line">print(type(point))</span><br><span class="line"></span><br><span class="line">print(isinstance(point, Point)) <span class="comment"># 判断point是不是Point的实例</span></span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><<span class="class"><span class="keyword">class</span> '<span class="title">__main__</span>.<span class="title">Point</span>'></span></span><br><span class="line"><span class="class"><span class="title">True</span></span></span><br></pre></td></tr></table></figure><h2 id="Constructors"><a href="#Constructors" class="headerlink" title="Constructors"></a>Constructors</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x, y)</span>:</span><span class="comment"># Constructor</span></span><br><span class="line"> self.x = x</span><br><span class="line"> self.y = y</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f"Point (<span class="subst">{self.x}</span>, <span class="subst">{self.y}</span>)"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">print(point.x)</span><br><span class="line">point.draw()</span><br></pre></td></tr></table></figure><p>self 指向当前 working 的 object, 比如 draw 不需要显式写 point.draw(point), 编译器会自动将当前的 object point 作为 draw() 的参数。</p><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1</span></span><br><span class="line">Point (<span class="number">1</span>, <span class="number">2</span>)</span><br></pre></td></tr></table></figure><h1 id="Class-vs-Instance-Attributes"><a href="#Class-vs-Instance-Attributes" class="headerlink" title="Class vs Instance Attributes"></a>Class vs Instance Attributes</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> default_color = <span class="string">"red"</span><span class="comment"># class attribute</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x, y)</span>:</span></span><br><span class="line"> self.x = x<span class="comment"># object/instance attribute</span></span><br><span class="line"> self.y = y</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f"Point (<span class="subst">{self.x}</span>, <span class="subst">{self.y}</span>)"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">point.draw()<span class="comment"># x和y是object attribute,每个object不同</span></span><br><span class="line"></span><br><span class="line">another = Point(<span class="number">3</span>, <span class="number">4</span>)</span><br><span class="line">another.draw()</span><br><span class="line"></span><br><span class="line">Point.default_color = <span class="string">"yellow"</span><span class="comment"># 直接用类调用更改。类中所有实例共享</span></span><br><span class="line">print(point.default_color)</span><br><span class="line">print(Point.default_color)</span><br><span class="line">print(another.default_color)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Point (<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">Point (<span class="number">3</span>, <span class="number">4</span>)</span><br><span class="line">yellow</span><br><span class="line">yellow</span><br><span class="line">yellow</span><br></pre></td></tr></table></figure><h1 id="Class-vs-Instance-Methods"><a href="#Class-vs-Instance-Methods" class="headerlink" title="Class vs Instance Methods"></a>Class vs Instance Methods</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x, y)</span>:</span></span><br><span class="line"> self.x = x</span><br><span class="line"> self.y = y</span><br><span class="line"></span><br><span class="line"><span class="meta"> @classmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">zero</span><span class="params">(cls)</span>:</span> <span class="comment"># cls指向这个class本身</span></span><br><span class="line"> <span class="keyword">return</span> cls(<span class="number">0</span>, <span class="number">0</span>) <span class="comment"># Point(0, 0)</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f"Point (<span class="subst">{self.x}</span>, <span class="subst">{self.y}</span>)"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = Point.zero()<span class="comment"># 工厂方法:将复杂的对象构造(比如多种初始值)交给类方法去完成</span></span><br><span class="line">point.draw()<span class="comment"># 输出 Point (0, 0)</span></span><br></pre></td></tr></table></figure><h1 id="Magic-Methods"><a href="#Magic-Methods" class="headerlink" title="Magic Methods"></a>Magic Methods</h1><p>编译器会自动调用Magic Methods。</p><p><a href="https://rszalski.github.io/magicmethods/" target="_blank" rel="noopener">guide book</a></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x, y)</span>:</span></span><br><span class="line"> self.x = x</span><br><span class="line"> self.y = y</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f"Point (<span class="subst">{self.x}</span>, <span class="subst">{self.y}</span>)"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">print(point)</span><br><span class="line">print(str(point))</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><__main__.Point object at 0x0000020E4C1A6FD0></span><br><span class="line"><__main__.Point object at 0x0000020E4C1A6FD0></span><br></pre></td></tr></table></figure><p>自定义magic function __str__:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x, y)</span>:</span></span><br><span class="line"> self.x = x</span><br><span class="line"> self.y = y</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__str__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">f"(<span class="subst">{self.x}</span>, <span class="subst">{self.y}</span>)"</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">f"Point (<span class="subst">{self.x}</span>, <span class="subst">{self.y}</span>)"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">print(point)</span><br><span class="line">print(str(point))</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>)</span><br></pre></td></tr></table></figure><h2 id="Comparing-Objects"><a href="#Comparing-Objects" class="headerlink" title="Comparing Objects"></a>Comparing Objects</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x, y)</span>:</span></span><br><span class="line"> self.x = x</span><br><span class="line"> self.y = y</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">other = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">print(point == other)</span><br></pre></td></tr></table></figure><p>输出:False。因为这样比较的是两个reference,是不同的。</p><p>方法:重定义magic functions</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x, y)</span>:</span></span><br><span class="line"> self.x = x</span><br><span class="line"> self.y = y</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__eq__</span><span class="params">(self, other)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.x == other.x <span class="keyword">and</span> self.y == other.y</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__gt__</span><span class="params">(self, other)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.x > other.x <span class="keyword">and</span> self.y > other.y</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = Point(<span class="number">10</span>, <span class="number">20</span>)</span><br><span class="line">other = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">print(point == other)</span><br><span class="line">print(point > other)</span><br></pre></td></tr></table></figure><p>这时就是比较两个 object 的 x 和 y 的值了</p><h2 id="Supporting-Arithmetic-Operations"><a href="#Supporting-Arithmetic-Operations" class="headerlink" title="Supporting Arithmetic Operations"></a>Supporting Arithmetic Operations</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x, y)</span>:</span></span><br><span class="line"> self.x = x</span><br><span class="line"> self.y = y</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__add__</span><span class="params">(self, other)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> Point(self.x + other.x, self.y + other.y)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = Point(<span class="number">10</span>, <span class="number">20</span>)</span><br><span class="line">other = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">combined = point + other</span><br><span class="line">print(<span class="string">f"Point (<span class="subst">{combined.x}</span>, <span class="subst">{combined.y}</span>)"</span>)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Point (<span class="number">11</span>, <span class="number">22</span>)</span><br></pre></td></tr></table></figure><h1 id="Creating-Custom-Containers"><a href="#Creating-Custom-Containers" class="headerlink" title="Creating Custom Containers"></a>Creating Custom Containers</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TagCloud</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> self.tags = {}</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">add</span><span class="params">(self, tag)</span>:</span></span><br><span class="line"> self.tags[tag.lower()] = self.tags.get(tag.lower(), <span class="number">0</span>) + <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__getitem__</span><span class="params">(self, tag)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.tags.get(tag.lower(), <span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__setitem__</span><span class="params">(self, tag, count)</span>:</span></span><br><span class="line"> self.tags[tag.lower()] = count</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__len__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> len(self.tags)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__iter__</span><span class="params">(self)</span>:</span> <span class="comment"># make it iterable</span></span><br><span class="line"> <span class="keyword">return</span> iter(self.tags)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">cloud = TagCloud()</span><br><span class="line">cloud.add(<span class="string">"Python"</span>)</span><br><span class="line">cloud.add(<span class="string">"python"</span>)</span><br><span class="line">cloud.add(<span class="string">"python"</span>)</span><br><span class="line">print(cloud.tags)</span><br><span class="line"></span><br><span class="line">print(cloud[<span class="string">"python"</span>]) <span class="comment"># __getitem__实现</span></span><br><span class="line">cloud[<span class="string">"java"</span>] = <span class="number">10</span> <span class="comment"># __setitem__实现</span></span><br><span class="line">print(cloud.tags)</span><br><span class="line"></span><br><span class="line">print(len(cloud)) <span class="comment"># __len__实现</span></span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">{<span class="string">'python'</span>: <span class="number">3</span>}</span><br><span class="line"><span class="number">3</span></span><br><span class="line">{<span class="string">'python'</span>: <span class="number">3</span>, <span class="string">'java'</span>: <span class="number">10</span>}</span><br><span class="line"><span class="number">2</span></span><br></pre></td></tr></table></figure><h1 id="Private-Members"><a href="#Private-Members" class="headerlink" title="Private Members"></a>Private Members</h1><p>将光标放到 tags 那,F2,改成__tags,回车,所有地方都改成__tags了,这就是 private member</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TagCloud</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> self.__tags = {}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">cloud = TagCloud()</span><br><span class="line">print(cloud.__dict__)</span><br><span class="line">print(cloud._TagCloud__tags)</span><br><span class="line">print(cloud.__tags)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">{<span class="string">'_TagCloud__tags'</span>: {}}</span><br><span class="line">{}</span><br><span class="line">Traceback (most recent call last):</span><br><span class="line"> File <span class="string">"e:\HelloWorld\app.py"</span>, line <span class="number">24</span>, <span class="keyword">in</span> <module></span><br><span class="line"> print(cloud.__tags)</span><br><span class="line">AttributeError: <span class="string">'TagCloud'</span> object has no attribute <span class="string">'__tags'</span></span><br></pre></td></tr></table></figure><p>不能直接用名字调用,但是实际上python的 private member还是外部可见的,用__dict__就能查看到,用那个名字’_TagCloud__tags’也还能访问到。</p><h1 id="Properties"><a href="#Properties" class="headerlink" title="Properties"></a>Properties</h1><p>Java 风格的 getter 和 setter,不 pythonic:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Product</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, price)</span>:</span></span><br><span class="line"> self.set_price(price)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_price</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.__price</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">set_price</span><span class="params">(self, value)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> value < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"Price cannot be negative."</span>)</span><br><span class="line"> self.__price = value</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">product = Product(<span class="number">-50</span>)</span><br></pre></td></tr></table></figure><p>pythonic coding:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Product</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, price)</span>:</span></span><br><span class="line"> self.price = price</span><br><span class="line"></span><br><span class="line"><span class="meta"> @property</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">price</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.__price</span><br><span class="line"></span><br><span class="line"><span class="meta"> @price.setter</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">price</span><span class="params">(self, value)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> value < <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"Price cannot be negative."</span>)</span><br><span class="line"> self.__price = value</span><br><span class="line"></span><br><span class="line"> <span class="comment"># price = property(get_price, set_price)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">product = Product(<span class="number">-10</span>)</span><br><span class="line">print(product.price)</span><br></pre></td></tr></table></figure><p>如果将setter删掉,price 就是只读的。</p><h1 id="Inheritance"><a href="#Inheritance" class="headerlink" title="Inheritance"></a>Inheritance</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Animal</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> self.age = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">eat</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"eat"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># Animal: Parent, Base</span></span><br><span class="line"><span class="comment"># Mammal: Child, Sub</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Mammal</span><span class="params">(Animal)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">walk</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"walk"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Fish</span><span class="params">(Animal)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">swim</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"swim"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">m = Mammal()</span><br><span class="line">m.eat()</span><br><span class="line">print(m.age)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">eat</span><br><span class="line"><span class="number">1</span></span><br></pre></td></tr></table></figure><h2 id="The-Object-Class"><a href="#The-Object-Class" class="headerlink" title="The Object Class"></a>The Object Class</h2><p>所有 class 都继承于 object 类</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Animal</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> self.age = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">eat</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"eat"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># Animal: Parent, Base</span></span><br><span class="line"><span class="comment"># Mammal: Child, Sub</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Mammal</span><span class="params">(Animal)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">walk</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"walk"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">m = Mammal()</span><br><span class="line">print(isinstance(m, Animal))<span class="comment"># True</span></span><br><span class="line">print(isinstance(m, Mammal))<span class="comment"># True</span></span><br><span class="line">print(isinstance(m, object))<span class="comment"># True</span></span><br><span class="line">print(issubclass(Mammal, Animal))<span class="comment"># True</span></span><br><span class="line">print(issubclass(Mammal, object))<span class="comment"># True</span></span><br></pre></td></tr></table></figure><h2 id="Method-Overriding"><a href="#Method-Overriding" class="headerlink" title="Method Overriding"></a>Method Overriding</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Animal</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"Animal Constructor"</span>)</span><br><span class="line"> self.age = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">eat</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"eat"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># Animal: Parent, Base</span></span><br><span class="line"><span class="comment"># Mammal: Child, Sub</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Mammal</span><span class="params">(Animal)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> super().__init__() <span class="comment"># 调用父类的__init__(),否则会被子类的覆盖掉而不执行</span></span><br><span class="line"> print(<span class="string">"Mammal Constructor"</span>)</span><br><span class="line"> self.weight = <span class="number">2</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">walk</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"walk"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">m = Mammal()</span><br><span class="line">print(m.age)</span><br><span class="line">print(m.weight)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Animal Constructor</span><br><span class="line">Mammal Constructor</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="number">2</span></span><br></pre></td></tr></table></figure><h2 id="Multi-level-Inheritance"><a href="#Multi-level-Inheritance" class="headerlink" title="Multi-level Inheritance"></a>Multi-level Inheritance</h2><p>Abuse inheritance:</p><p> Employee - Person - LivingCreature - Thing</p><p>make software complex</p><h2 id="Multiple-Inheritance"><a href="#Multiple-Inheritance" class="headerlink" title="Multiple Inheritance"></a>Multiple Inheritance</h2><p>Abuse case:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Employee</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">greet</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"Employee Greet"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Person</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">greet</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"Person Greet"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Manager</span><span class="params">(Employee, Person)</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">manager = Manager()</span><br><span class="line">manager.greet()</span><br></pre></td></tr></table></figure><p>将 class Manager(Employee, Person) 中的父类换个顺序就有完全不同的输出:</p><p>(Employee, Person) 输出: Employee Greet</p><p>(Person, Employee) 输出: Person Greet</p><p><strong>Good Example</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Flyer</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">fly</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Swimmer</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">swim</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">FlyingFish</span><span class="params">(Flyer, Swimmer)</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><p>子类的两个父类应该是没有什么共同点的,而子类兼具两个父类的method。</p><h2 id="A-Good-Example-of-Inheritance"><a href="#A-Good-Example-of-Inheritance" class="headerlink" title="A Good Example of Inheritance"></a>A Good Example of Inheritance</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">InvalidOperationError</span><span class="params">(Exception)</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Stream</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> self.opened = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">open</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> self.opened:</span><br><span class="line"> <span class="keyword">raise</span> InvalidOperationError(<span class="string">"Stream is already opened."</span>)</span><br><span class="line"> self.opened = <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">close</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.opened:</span><br><span class="line"> <span class="keyword">raise</span> InvalidOperationError(<span class="string">"Stream is already closed."</span>)</span><br><span class="line"> self.opened = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">FileStream</span><span class="params">(Stream)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">read</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"Reading data from a file."</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">NetworkStream</span><span class="params">(Stream)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">read</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"Reading data from a network."</span>)</span><br></pre></td></tr></table></figure><h1 id="Abstract-Base-Classes"><a href="#Abstract-Base-Classes" class="headerlink" title="Abstract Base Classes"></a>Abstract Base Classes</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> abc <span class="keyword">import</span> ABC, abstractmethod</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">InvalidOperationError</span><span class="params">(Exception)</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Stream</span><span class="params">(ABC)</span>:</span><span class="comment"># 继承自ABC(抽象类简写)</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> self.opened = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">open</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> self.opened:</span><br><span class="line"> <span class="keyword">raise</span> InvalidOperationError(<span class="string">"Stream is already opened."</span>)</span><br><span class="line"> self.opened = <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">close</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.opened:</span><br><span class="line"> <span class="keyword">raise</span> InvalidOperationError(<span class="string">"Stream is already closed."</span>)</span><br><span class="line"> self.opened = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="meta"> @abstractmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">read</span><span class="params">(self)</span>:</span><span class="comment"># 抽象方法</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">FileStream</span><span class="params">(Stream)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">read</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"Reading data from a file."</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">NetworkStream</span><span class="params">(Stream)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">read</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"Reading data from a network."</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MemoryStream</span><span class="params">(Stream)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">read</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"Reading data from the memory."</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">stream = MemoryStream()</span><br><span class="line">stream.read()</span><br></pre></td></tr></table></figure><p>👉 Stream 不能创建实例</p><p>👉 Stream 的子类必须实现 read() ,或者也是抽象类</p><h1 id="Polymorphism"><a href="#Polymorphism" class="headerlink" title="Polymorphism"></a>Polymorphism</h1><p>Many Forms</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> abc <span class="keyword">import</span> ABC, abstractmethod</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">UIControl</span><span class="params">(ABC)</span>:</span></span><br><span class="line"><span class="meta"> @abstractmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TextBox</span><span class="params">(UIControl)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"TextBox"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">DropDownList</span><span class="params">(UIControl)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"DropDownList"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(controls)</span>:</span><span class="comment"># 在run-time才知道control具体是什么</span></span><br><span class="line"> <span class="keyword">for</span> control <span class="keyword">in</span> controls:</span><br><span class="line"> control.draw()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ddl = DropDownList()</span><br><span class="line">textbox = TextBox()</span><br><span class="line">draw([ddl, textbox])<span class="comment"># 多种对象实现一种方法</span></span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">DropDownList</span><br><span class="line">TextBox</span><br></pre></td></tr></table></figure><h2 id="Duck-Typing"><a href="#Duck-Typing" class="headerlink" title="Duck Typing"></a>Duck Typing</h2><p><strong>If it walks and quacks like a duck, it is a duck.</strong></p><p>上例中并不需要抽象类UIControl。只要类中实现了draw()方法,python就认为是个UIControl,就能执行draw(controls)方法。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> abc <span class="keyword">import</span> ABC, abstractmethod</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TextBox</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"TextBox"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">DropDownList</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(self)</span>:</span></span><br><span class="line"> print(<span class="string">"DropDownList"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">draw</span><span class="params">(controls)</span>:</span></span><br><span class="line"> <span class="keyword">for</span> control <span class="keyword">in</span> controls:</span><br><span class="line"> control.draw()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">ddl = DropDownList()</span><br><span class="line">textbox = TextBox()</span><br><span class="line">draw([ddl, textbox])</span><br></pre></td></tr></table></figure><h1 id="Extending-Built-in-Types"><a href="#Extending-Built-in-Types" class="headerlink" title="Extending Built-in Types"></a>Extending Built-in Types</h1><p><strong>Demo 1: 扩展str类</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Text</span><span class="params">(str)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">duplicate</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self + self</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">text = Text(<span class="string">"Python"</span>)</span><br><span class="line">print(text.duplicate())<span class="comment"># 本类方法</span></span><br><span class="line">print(text.lower()) <span class="comment"># 父类方法</span></span><br></pre></td></tr></table></figure><p>输出:</p><p>PythonPython</p><p>python</p><p><strong>Demo 2: 扩展list类</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TrackableList</span><span class="params">(list)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">append</span><span class="params">(self, object)</span>:</span></span><br><span class="line"> print(<span class="string">"Append called"</span>)</span><br><span class="line"> super().append(object)<span class="comment"># 调用父类方法</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">list = TrackableList()</span><br><span class="line">list.append(<span class="string">"1"</span>)</span><br></pre></td></tr></table></figure><p>输出:</p><p>Append called</p><h1 id="Data-Classes"><a href="#Data-Classes" class="headerlink" title="Data Classes"></a>Data Classes</h1><p>对于一个只有data而没有方法的类:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Point</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x, y)</span>:</span></span><br><span class="line"> self.x = x</span><br><span class="line"> self.y = y</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__eq__</span><span class="params">(self, other)</span> -> bool:</span></span><br><span class="line"> <span class="keyword">return</span> self.x == other.x <span class="keyword">and</span> self.y == other.y</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p1 = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">p2 = Point(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">print(p1 == p2)</span><br></pre></td></tr></table></figure><p>可以用 namedtuple make code cleaner:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> namedtuple</span><br><span class="line"></span><br><span class="line">Point = namedtuple(<span class="string">"Point"</span>, [<span class="string">"x"</span>, <span class="string">"y"</span>])</span><br><span class="line">p1 = Point(x=<span class="number">1</span>, y=<span class="number">2</span>) <span class="comment"># must be keyword arguments</span></span><br><span class="line">p2 = Point(x=<span class="number">1</span>, y=<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line">print(p1 == p2)<span class="comment"># True</span></span><br><span class="line">print(p1.x)<span class="comment"># 像类一样调用:1</span></span><br><span class="line"></span><br><span class="line">p1.x = <span class="number">10</span><span class="comment"># AttributeError: can't set attribute</span></span><br></pre></td></tr></table></figure><p>只能新建一个namedtuple,用p1指向:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">p1 = Point(x=<span class="number">10</span>, y=<span class="number">2</span>)</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<p>👉 Class: blueprint for creating new objects — Hu
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(6)--Exceptions</title>
<link href="http://yoursite.com/2021/05/11/20210511_Python006/"/>
<id>http://yoursite.com/2021/05/11/20210511_Python006/</id>
<published>2021-05-11T09:50:09.000Z</published>
<updated>2021-05-17T04:24:22.995Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><h1 id="Handling-Exceptions"><a href="#Handling-Exceptions" class="headerlink" title="Handling Exceptions"></a>Handling Exceptions</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> age = int(input(<span class="string">"Age: "</span>))</span><br><span class="line"><span class="keyword">except</span> ValueError <span class="keyword">as</span> ex:</span><br><span class="line"> print(<span class="string">"You didn't enter a valid age."</span>)</span><br><span class="line"> print(ex)<span class="comment"># 输出错误信息</span></span><br><span class="line"> print(type(ex))<span class="comment"># 显示错误类型</span></span><br><span class="line"><span class="keyword">else</span>:<span class="comment"># 没有exception就执行这一块</span></span><br><span class="line"> print(<span class="string">"No exceptions were thrown."</span>)</span><br><span class="line"></span><br><span class="line">print(<span class="string">"Execution continues."</span>)</span><br></pre></td></tr></table></figure><p>运行结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">>python app.py</span><br><span class="line">Age: <span class="number">10</span></span><br><span class="line">No exceptions were thrown.</span><br><span class="line">Execution continues.</span><br><span class="line"></span><br><span class="line">>python app.py</span><br><span class="line">Age: a</span><br><span class="line">You didn<span class="string">'t enter a valid age.</span></span><br><span class="line"><span class="string">invalid literal for int() with base 10: '</span>a<span class="string">' </span></span><br><span class="line"><span class="string"><class '</span>ValueErro<span class="string">r'></span></span><br><span class="line"><span class="string">Execution continues.</span></span><br></pre></td></tr></table></figure><h2 id="Handling-Different-Exceptions"><a href="#Handling-Different-Exceptions" class="headerlink" title="Handling Different Exceptions"></a>Handling Different Exceptions</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> age = int(input(<span class="string">"Age: "</span>))</span><br><span class="line"> xfactor = <span class="number">10</span> / age</span><br><span class="line"><span class="keyword">except</span> (ValueError, ZeroDivisionError):<span class="comment"># 多种exception之一即执行</span></span><br><span class="line"> print(<span class="string">"You didn't enter a valid age."</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">"No exceptions were thrown."</span>)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">> python app.py</span><br><span class="line">Age: <span class="number">0</span></span><br><span class="line">You didn<span class="string">'t enter a valid age.</span></span><br></pre></td></tr></table></figure><h1 id="Cleaning-Up"><a href="#Cleaning-Up" class="headerlink" title="Cleaning Up"></a>Cleaning Up</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> file = open(<span class="string">"app.py"</span>)</span><br><span class="line"> age = int(input(<span class="string">"Age: "</span>))</span><br><span class="line"> xfactor = <span class="number">10</span> / age</span><br><span class="line"><span class="keyword">except</span> (ValueError, ZeroDivisionError):</span><br><span class="line"> print(<span class="string">"You didn't enter a valid age."</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">"No exceptions were thrown."</span>)</span><br><span class="line"><span class="keyword">finally</span>:</span><br><span class="line"> file.close()</span><br></pre></td></tr></table></figure><p>无论有没有出现exception,都要释放资源,那就放在finally块里,无论有没有exception都会执行的。</p><h2 id="The-With-Statement"><a href="#The-With-Statement" class="headerlink" title="The With Statement"></a>The With Statement</h2><p>使用with语句打开文件,随后会自动释放掉,就不用file.close()了:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">with</span> open(<span class="string">"app.py"</span>) <span class="keyword">as</span> file:</span><br><span class="line"> print(<span class="string">"File opened."</span>)</span><br></pre></td></tr></table></figure><p>file有__enter__和__exit__两个magic function,最后会自动调用__exit__,所以不用手动释放。</p><h1 id="Raising-Exceptions"><a href="#Raising-Exceptions" class="headerlink" title="Raising Exceptions"></a>Raising Exceptions</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">calculate_xfactor</span><span class="params">(age)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> age <= <span class="number">0</span>:</span><br><span class="line"> <span class="keyword">raise</span> ValueError(<span class="string">"Age cannot be 0 or less."</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="number">10</span> / age</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> calculate_xfactor(<span class="number">-1</span>)</span><br><span class="line"><span class="keyword">except</span> ValueError <span class="keyword">as</span> error:</span><br><span class="line"> print(error)</span><br></pre></td></tr></table></figure><h1 id="Cost-of-Raising-Exceptions"><a href="#Cost-of-Raising-Exceptions" class="headerlink" title="Cost of Raising Exceptions"></a>Cost of Raising Exceptions</h1><p>Mosh 不建议raise exceptions,因为代价有点大。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> timeit <span class="keyword">import</span> timeit</span><br><span class="line"></span><br><span class="line">code1 = <span class="string">"""</span></span><br><span class="line"><span class="string">def calculate_xfactor(age):</span></span><br><span class="line"><span class="string"> if age <= 0:</span></span><br><span class="line"><span class="string"> raise ValueError("Age cannot be 0 or less.")</span></span><br><span class="line"><span class="string"> return 10 / age</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">try:</span></span><br><span class="line"><span class="string"> calculate_xfactor(-1)</span></span><br><span class="line"><span class="string">except ValueError as error:</span></span><br><span class="line"><span class="string"> pass</span></span><br><span class="line"><span class="string">"""</span></span><br><span class="line"></span><br><span class="line">code2 = <span class="string">"""</span></span><br><span class="line"><span class="string">def calculate_xfactor(age):</span></span><br><span class="line"><span class="string"> if age <= 0:</span></span><br><span class="line"><span class="string"> return None</span></span><br><span class="line"><span class="string"> return 10 / age</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">xfactor = calculate_xfactor(-1)</span></span><br><span class="line"><span class="string">if xfactor == None:</span></span><br><span class="line"><span class="string"> pass</span></span><br><span class="line"><span class="string">"""</span></span><br><span class="line"></span><br><span class="line">print(<span class="string">"first code="</span>, timeit(code1, number=<span class="number">10000</span>))</span><br><span class="line">print(<span class="string">"second code="</span>, timeit(code2, number=<span class="number">10000</span>))</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">first code= <span class="number">0.0040202000000000016</span></span><br><span class="line">second code= <span class="number">0.0015166999999999958</span></span><br></pre></td></tr></table></figure><p>可以看到raise exception的用时是普通方法的两倍多。</p>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<h1 id="Handling-Exceptions"><a href="#Handling-Exce
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(5)--Data Structures</title>
<link href="http://yoursite.com/2021/05/09/20210509_Python005/"/>
<id>http://yoursite.com/2021/05/09/20210509_Python005/</id>
<published>2021-05-09T09:50:09.000Z</published>
<updated>2021-05-17T04:24:22.987Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><h1 id="List"><a href="#List" class="headerlink" title="List"></a>List</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">letters = [<span class="string">"a"</span>, <span class="string">"b"</span>, <span class="string">"c"</span>]</span><br><span class="line">matrix = [[<span class="number">0</span>, <span class="number">1</span>], [<span class="number">2</span>, <span class="number">3</span>]]</span><br><span class="line"></span><br><span class="line">zeros = [<span class="number">0</span>] * <span class="number">5</span> <span class="comment"># [0,0,0,0,0]</span></span><br><span class="line">combined = zeros + letters <span class="comment"># [0, 0, 0, 0, 0, 'a', 'b', 'c']</span></span><br><span class="line">numbers = list(range(<span class="number">20</span>))</span><br><span class="line">chars = list(<span class="string">"Hello World"</span>)<span class="comment"># ['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']</span></span><br><span class="line">print(len(chars)) <span class="comment"># 11</span></span><br></pre></td></tr></table></figure><p><strong>Demo 1</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">letters = [<span class="string">"a"</span>, <span class="string">"b"</span>, <span class="string">"c"</span>, <span class="string">"d"</span>]</span><br><span class="line">print(letters[<span class="number">0</span>])</span><br><span class="line">print(letters[<span class="number">-1</span>])</span><br><span class="line">letters[<span class="number">0</span>] = <span class="string">"A"</span></span><br><span class="line">print(letters)</span><br><span class="line">print(letters[:<span class="number">3</span>])</span><br><span class="line">print(letters[::<span class="number">2</span>])</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">a</span><br><span class="line">d</span><br><span class="line">[<span class="string">'A'</span>, <span class="string">'b'</span>, <span class="string">'c'</span>, <span class="string">'d'</span>]</span><br><span class="line">[<span class="string">'A'</span>, <span class="string">'b'</span>, <span class="string">'c'</span>]</span><br><span class="line">[<span class="string">'A'</span>, <span class="string">'c'</span>]</span><br></pre></td></tr></table></figure><p><strong>Demo 2</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">numbers = list(range(<span class="number">10</span>))</span><br><span class="line">print(numbers)</span><br><span class="line">print(numbers[::<span class="number">2</span>])</span><br><span class="line">print(numbers[::<span class="number">-1</span>])<span class="comment"># 倒序输出</span></span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>]</span><br><span class="line">[<span class="number">0</span>, <span class="number">2</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>]</span><br><span class="line">[<span class="number">9</span>, <span class="number">8</span>, <span class="number">7</span>, <span class="number">6</span>, <span class="number">5</span>, <span class="number">4</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">1</span>, <span class="number">0</span>]</span><br></pre></td></tr></table></figure><h2 id="Unpacking-Lists"><a href="#Unpacking-Lists" class="headerlink" title="Unpacking Lists"></a>Unpacking Lists</h2><p><strong>Demo 1</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">numbers = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">first, second, third = numbers<span class="comment"># first=1, second=2, third=3</span></span><br><span class="line">first, second, _ = numbers</span><br></pre></td></tr></table></figure><p><strong>Demo 2</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">numbers2 = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>]</span><br><span class="line">first, second, *other = numbers2</span><br><span class="line">print(first)<span class="comment"># 1</span></span><br><span class="line">print(other)<span class="comment"># [3, 4, 4, 4, 4, 4, 4]</span></span><br></pre></td></tr></table></figure><p>与此同理:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">multiply</span><span class="params">(*numbers)</span>:</span></span><br><span class="line"> total = <span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> number <span class="keyword">in</span> numbers:</span><br><span class="line"> total *= number</span><br><span class="line"> <span class="keyword">return</span> total</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(multiply(<span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>))</span><br><span class="line">print(multiply(<span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">2</span>, <span class="number">5</span>))</span><br></pre></td></tr></table></figure><p>Another demo:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">numbers2 = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">4</span>, <span class="number">9</span>]</span><br><span class="line">first, *other, last = numbers2</span><br><span class="line">print(first, last)<span class="comment"># 1 9</span></span><br><span class="line">print(other)<span class="comment"># [2, 3, 4, 4, 4, 4, 4]</span></span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{'id': 1, 'name': 'John', 'age': 22}</span><br><span class="line">John</span><br></pre></td></tr></table></figure><h2 id="Looping-over-Lists"><a href="#Looping-over-Lists" class="headerlink" title="Looping over Lists"></a>Looping over Lists</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">letters = [<span class="string">"a"</span>, <span class="string">"b"</span>, <span class="string">"c"</span>]</span><br><span class="line"><span class="keyword">for</span> letter <span class="keyword">in</span> enumerate(letters):</span><br><span class="line"> print(letter)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">(<span class="number">0</span>, <span class="string">'a'</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="string">'b'</span>)</span><br><span class="line">(<span class="number">2</span>, <span class="string">'c'</span>)</span><br></pre></td></tr></table></figure><p><strong>unpacking tuple:</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">letters = [<span class="string">"a"</span>, <span class="string">"b"</span>, <span class="string">"c"</span>]</span><br><span class="line"><span class="keyword">for</span> index, letter <span class="keyword">in</span> enumerate(letters):</span><br><span class="line"> print(index, letter)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">0</span> a</span><br><span class="line"><span class="number">1</span> b</span><br><span class="line"><span class="number">2</span> c</span><br></pre></td></tr></table></figure><h2 id="Adding-Removing-Items"><a href="#Adding-Removing-Items" class="headerlink" title="Adding/Removing Items"></a>Adding/Removing Items</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">letters = [<span class="string">"a"</span>, <span class="string">"b"</span>, <span class="string">"c"</span>, <span class="string">"d"</span>, <span class="string">"e"</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># Add</span></span><br><span class="line">letters.append(<span class="string">"f"</span>)<span class="comment"># 在末尾加入</span></span><br><span class="line">letters.insert(<span class="number">0</span>, <span class="string">"-"</span>)<span class="comment"># 在首部加入</span></span><br><span class="line">print(letters)</span><br><span class="line"></span><br><span class="line"><span class="comment"># Remove</span></span><br><span class="line">letters.pop()<span class="comment"># 删除最后一个元素</span></span><br><span class="line">print(letters)</span><br><span class="line"></span><br><span class="line">letters.remove(<span class="string">"b"</span>)<span class="comment"># 删除特定元素</span></span><br><span class="line">print(letters)</span><br><span class="line"></span><br><span class="line"><span class="keyword">del</span> letters[<span class="number">0</span>:<span class="number">3</span>]<span class="comment"># 删除多个元素</span></span><br><span class="line">print(letters)</span><br><span class="line"></span><br><span class="line">letters.clear()<span class="comment"># 清除所有元素</span></span><br><span class="line">print(letters)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">['-', 'a', 'b', 'c', 'd', 'e', 'f']</span><br><span class="line">['-', 'a', 'b', 'c', 'd', 'e']</span><br><span class="line">['-', 'a', 'c', 'd', 'e']</span><br><span class="line">['d', 'e']</span><br><span class="line">[]</span><br></pre></td></tr></table></figure><h2 id="Finding-Items"><a href="#Finding-Items" class="headerlink" title="Finding Items"></a>Finding Items</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">letters = [<span class="string">"a"</span>, <span class="string">"b"</span>, <span class="string">"c"</span>]</span><br><span class="line">print(letters.count(<span class="string">"d"</span>))<span class="comment"># 0</span></span><br><span class="line"><span class="keyword">if</span> <span class="string">"c"</span> <span class="keyword">in</span> letters:</span><br><span class="line"> print(letters.index(<span class="string">"c"</span>))<span class="comment"># 2</span></span><br></pre></td></tr></table></figure><h2 id="Sorting-Lists"><a href="#Sorting-Lists" class="headerlink" title="Sorting Lists"></a>Sorting Lists</h2><p><strong>Demo 1</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">numbers = [<span class="number">3</span>, <span class="number">51</span>, <span class="number">2</span>, <span class="number">8</span>, <span class="number">6</span>]</span><br><span class="line">numbers.sort(reverse=<span class="literal">True</span>)<span class="comment"># 倒序</span></span><br><span class="line">print(numbers)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[51, 8, 6, 3, 2]</span><br></pre></td></tr></table></figure><p><strong>Demo 2</strong></p><p>built-in function: 不改变原数组</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">numbers = [<span class="number">3</span>, <span class="number">51</span>, <span class="number">2</span>, <span class="number">8</span>, <span class="number">6</span>]</span><br><span class="line">print(sorted(numbers, reverse=<span class="literal">True</span>))</span><br><span class="line">print(numbers)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[<span class="number">51</span>, <span class="number">8</span>, <span class="number">6</span>, <span class="number">3</span>, <span class="number">2</span>]</span><br><span class="line">[<span class="number">3</span>, <span class="number">51</span>, <span class="number">2</span>, <span class="number">8</span>, <span class="number">6</span>]</span><br></pre></td></tr></table></figure><p><strong>Demo 3</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">items = [</span><br><span class="line"> (<span class="string">"product1"</span>, <span class="number">10</span>),</span><br><span class="line"> (<span class="string">"product2"</span>, <span class="number">9</span>),</span><br><span class="line"> (<span class="string">"product3"</span>, <span class="number">12</span>),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">sort_item</span><span class="params">(item)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> item[<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">items.sort(key=sort_item)</span><br><span class="line">print(items)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[(<span class="string">'product2'</span>, <span class="number">9</span>), (<span class="string">'product1'</span>, <span class="number">10</span>), (<span class="string">'product3'</span>, <span class="number">12</span>)]</span><br></pre></td></tr></table></figure><h2 id="Lambdas"><a href="#Lambdas" class="headerlink" title="Lambdas"></a>Lambdas</h2><p>改造上述的例子(Demo 3):</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">items = [</span><br><span class="line"> (<span class="string">"product1"</span>, <span class="number">10</span>),</span><br><span class="line"> (<span class="string">"product2"</span>, <span class="number">9</span>),</span><br><span class="line"> (<span class="string">"product3"</span>, <span class="number">12</span>),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">items.sort(key=<span class="keyword">lambda</span> item: item[<span class="number">1</span>])</span><br><span class="line">print(items)</span><br></pre></td></tr></table></figure><p>语法:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">lambda</span> parameters:expression</span><br></pre></td></tr></table></figure><h3 id="Map-Function"><a href="#Map-Function" class="headerlink" title="Map Function"></a>Map Function</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">items = [</span><br><span class="line"> (<span class="string">"product1"</span>, <span class="number">10</span>),</span><br><span class="line"> (<span class="string">"product2"</span>, <span class="number">9</span>),</span><br><span class="line"> (<span class="string">"product3"</span>, <span class="number">12</span>),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># prices = []</span></span><br><span class="line"><span class="comment"># for item in items:</span></span><br><span class="line"><span class="comment"># prices.append(item[1])</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># print(prices)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># A better way</span></span><br><span class="line">prices = list(map(<span class="keyword">lambda</span> item: item[<span class="number">1</span>], items))</span><br><span class="line">print(prices)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[10, 9, 12]</span><br></pre></td></tr></table></figure><h3 id="Filter-Function"><a href="#Filter-Function" class="headerlink" title="Filter Function"></a>Filter Function</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">items = [</span><br><span class="line"> (<span class="string">"product1"</span>, <span class="number">10</span>),</span><br><span class="line"> (<span class="string">"product2"</span>, <span class="number">9</span>),</span><br><span class="line"> (<span class="string">"product3"</span>, <span class="number">12</span>),</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">filtered = list(filter(<span class="keyword">lambda</span> item: item[<span class="number">1</span>] >= <span class="number">10</span>, items))</span><br><span class="line">print(filtered)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[('product1', 10), ('product3', 12)]</span><br></pre></td></tr></table></figure><h2 id="List-Comprehension"><a href="#List-Comprehension" class="headerlink" title="List Comprehension"></a>List Comprehension</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[expression <span class="keyword">for</span> item <span class="keyword">in</span> items]</span><br></pre></td></tr></table></figure><p>改造上面的 map function 和 filter function:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">prices = [item[<span class="number">1</span>] <span class="keyword">for</span> item <span class="keyword">in</span> items]</span><br><span class="line"></span><br><span class="line">filtered = [item <span class="keyword">for</span> item <span class="keyword">in</span> items <span class="keyword">if</span> item[<span class="number">1</span>] >= <span class="number">10</span>]</span><br></pre></td></tr></table></figure><h2 id="Zip-Function"><a href="#Zip-Function" class="headerlink" title="Zip Function"></a>Zip Function</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">list1 = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">list2 = [<span class="number">10</span>, <span class="number">20</span>, <span class="number">30</span>]</span><br><span class="line"></span><br><span class="line">print(list(zip(<span class="string">"abc"</span>, list1, list2)))</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[('a', 1, 10), ('b', 2, 20), ('c', 3, 30)]</span><br></pre></td></tr></table></figure><h1 id="Stacks"><a href="#Stacks" class="headerlink" title="Stacks"></a>Stacks</h1><p><strong>LIFO: Last In - First Out</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">browsing_session = []</span><br><span class="line">browsing_session.append(<span class="number">1</span>)<span class="comment"># 压栈</span></span><br><span class="line">browsing_session.append(<span class="number">2</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> <span class="keyword">not</span> browsing_session:</span><br><span class="line"> print(browsing_session.pop())<span class="comment"># 出栈</span></span><br></pre></td></tr></table></figure><h1 id="Queues"><a href="#Queues" class="headerlink" title="Queues"></a>Queues</h1><p><strong>FIFO: First In - First Out</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> deque</span><br><span class="line"></span><br><span class="line">queue = deque([])</span><br><span class="line">queue.append(<span class="number">1</span>)<span class="comment"># 入队</span></span><br><span class="line">queue.append(<span class="number">2</span>)</span><br><span class="line">queue.append(<span class="number">3</span>)</span><br><span class="line">queue.popleft()<span class="comment"># 出队</span></span><br><span class="line">print(queue)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span> queue:<span class="comment"># 检查队列是否为空</span></span><br><span class="line"> print(<span class="string">"Empty"</span>)</span><br></pre></td></tr></table></figure><h1 id="Tuples"><a href="#Tuples" class="headerlink" title="Tuples"></a>Tuples</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 都是tuple:</span></span><br><span class="line">point = <span class="number">1</span>, <span class="number">2</span></span><br><span class="line"><span class="comment"># point = 1,</span></span><br><span class="line"><span class="comment"># point = ()</span></span><br><span class="line">print(type(point))</span><br></pre></td></tr></table></figure><p><strong>Demo</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">point = (<span class="number">1</span>, <span class="number">2</span>) + (<span class="number">3</span>, <span class="number">4</span>)</span><br><span class="line">print(point)<span class="comment"># (1, 2, 3, 4)</span></span><br><span class="line"></span><br><span class="line">point = (<span class="number">1</span>, <span class="number">2</span>) * <span class="number">3</span></span><br><span class="line">print(point)<span class="comment"># (1, 2, 1, 2, 1, 2)</span></span><br><span class="line"></span><br><span class="line">point = tuple([<span class="number">1</span>, <span class="number">2</span>])</span><br><span class="line">print(point)<span class="comment"># (1, 2)</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point = tuple(<span class="string">"hello"</span>)</span><br><span class="line">print(point)<span class="comment"># ('h', 'e', 'l', 'l', 'o')</span></span><br><span class="line"></span><br><span class="line">point = (<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>)</span><br><span class="line">print(point[<span class="number">0</span>:<span class="number">2</span>])<span class="comment"># (1, 2)</span></span><br><span class="line"></span><br><span class="line">x, y, z = point</span><br><span class="line"><span class="keyword">if</span> <span class="number">10</span> <span class="keyword">in</span> point:</span><br><span class="line"> print(<span class="string">"exists"</span>)</span><br></pre></td></tr></table></figure><h2 id="Swapping-Variables"><a href="#Swapping-Variables" class="headerlink" title="Swapping Variables"></a>Swapping Variables</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">x = <span class="number">10</span></span><br><span class="line">y = <span class="number">11</span></span><br><span class="line"></span><br><span class="line">z = x</span><br><span class="line">x = y</span><br><span class="line">y = z</span><br><span class="line">print(x, y)<span class="comment"># 11 10</span></span><br></pre></td></tr></table></figure><p>simpler way:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">x, y = y, x</span><br><span class="line">print(x, y)</span><br></pre></td></tr></table></figure><p>实际上是先定义了一个tuple,然后给x, y赋值,即 x, y = (11, 10)</p><h1 id="Arrays"><a href="#Arrays" class="headerlink" title="Arrays"></a>Arrays</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> array <span class="keyword">import</span> array</span><br><span class="line"></span><br><span class="line">numbers = array(<span class="string">"i"</span>, [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>])</span><br><span class="line"><span class="comment"># numbers[0] = 1.0# TypeError: integer argument expected, got float</span></span><br><span class="line"></span><br><span class="line">list1 = [<span class="number">1.0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">print(type(list1[<span class="number">0</span>]))<span class="comment"># <class 'float'></span></span><br><span class="line">print(type(list1[<span class="number">1</span>]))<span class="comment"># <class 'int'></span></span><br></pre></td></tr></table></figure><p>arrays 可以调用 append, pop, index 等与 lists 相同的 built-in function,但是只能有一种数据类型(由参数 typecode 如 ”i“ 指定)</p><p>而一个 list 里面可以有多种数据类型:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">list1 = [<span class="number">1.0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">list1.append(<span class="string">"hello"</span>)</span><br><span class="line">print(list1)<span class="comment"># [1.0, 1, 2, 3, 'hello']</span></span><br></pre></td></tr></table></figure><h1 id="Sets"><a href="#Sets" class="headerlink" title="Sets"></a>Sets</h1><p>一个 set 内不能有重复项</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">numbers = [<span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line">first = set(numbers)</span><br><span class="line">print(first)<span class="comment"># {1, 2, 3, 4}</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">second = {<span class="number">1</span>, <span class="number">4</span>}</span><br><span class="line">second.add(<span class="number">5</span>)</span><br><span class="line">print(second) <span class="comment"># {1, 4, 5}</span></span><br><span class="line"></span><br><span class="line">second.remove(<span class="number">5</span>)</span><br><span class="line">len(second)</span><br><span class="line">print(second)<span class="comment"># {1, 4}</span></span><br></pre></td></tr></table></figure><p><strong>Demo</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">numbers = [<span class="number">1</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line">first = set(numbers)</span><br><span class="line"></span><br><span class="line">second = {<span class="number">1</span>, <span class="number">5</span>}</span><br><span class="line"></span><br><span class="line">print(first | second) <span class="comment"># 在first或在second</span></span><br><span class="line">print(first & second) <span class="comment"># 在first也在second</span></span><br><span class="line">print(first - second) <span class="comment"># 在first不在second</span></span><br><span class="line">print(first ^ second) <span class="comment"># 在first或在second但不同时在两个set</span></span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">{1, 2, 3, 4, 5}</span><br><span class="line">{1}</span><br><span class="line">{2, 3, 4}</span><br><span class="line">{2, 3, 4, 5}</span><br></pre></td></tr></table></figure><p>set是无序的,不能用index,如first[0]是不合法的</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> <span class="number">1</span> <span class="keyword">in</span> first:<span class="comment"># 判断set里是否有某元素</span></span><br><span class="line"> print(<span class="string">"yes"</span>)</span><br></pre></td></tr></table></figure><h1 id="Dictionary"><a href="#Dictionary" class="headerlink" title="Dictionary"></a>Dictionary</h1><p><strong>创建</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Two ways to create a dictionary</span></span><br><span class="line">point = {<span class="string">"x"</span>: <span class="number">1</span>, <span class="string">"y"</span>: <span class="number">2</span>}</span><br><span class="line">point = dict(x=<span class="number">1</span>, y=<span class="number">2</span>)</span><br></pre></td></tr></table></figure><p><strong>增改</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">point[<span class="string">"x"</span>] = <span class="number">10</span><span class="comment"># modify element</span></span><br><span class="line">print(point)<span class="comment"># {'x': 10, 'y': 2}</span></span><br><span class="line">point[<span class="string">"z"</span>] = <span class="number">20</span><span class="comment"># create new element</span></span><br><span class="line">print(point)<span class="comment"># {'x': 10, 'y': 2, 'z': 20}</span></span><br></pre></td></tr></table></figure><p><strong>获取</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">print(point.get(<span class="string">"a"</span>))<span class="comment"># None</span></span><br><span class="line">print(point.get(<span class="string">"a"</span>, <span class="number">0</span>))<span class="comment"># 0 (若没有指定的key,则返回指定值0)</span></span><br></pre></td></tr></table></figure><p><strong>删除</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">del</span> point[<span class="string">"x"</span>]<span class="comment"># 删除元素</span></span><br><span class="line">print(point)<span class="comment"># {'y': 2, 'z': 20}</span></span><br></pre></td></tr></table></figure><p><strong>for loop</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> key <span class="keyword">in</span> point:</span><br><span class="line"> print(key, point[key])</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> item <span class="keyword">in</span> point.items():<span class="comment"># 返回tuple</span></span><br><span class="line"> print(item)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> key, value <span class="keyword">in</span> point.items():</span><br><span class="line"> print(key, value)</span><br></pre></td></tr></table></figure><p>返回:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">y <span class="number">2</span></span><br><span class="line">z <span class="number">20</span></span><br><span class="line">(<span class="string">'y'</span>, <span class="number">2</span>)</span><br><span class="line">(<span class="string">'z'</span>, <span class="number">20</span>)</span><br><span class="line">y <span class="number">2</span></span><br><span class="line">z <span class="number">20</span></span><br></pre></td></tr></table></figure><h2 id="Dictionary-Comprehensions"><a href="#Dictionary-Comprehensions" class="headerlink" title="Dictionary Comprehensions"></a>Dictionary Comprehensions</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># values = []</span></span><br><span class="line"><span class="comment"># for x in range(5):</span></span><br><span class="line"><span class="comment"># values.append(x * 2)</span></span><br><span class="line"></span><br><span class="line">values = [x * <span class="number">2</span> <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">5</span>)]<span class="comment"># 作用同上</span></span><br></pre></td></tr></table></figure><p>set、dictionary 的:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">values = {x * <span class="number">2</span> <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">5</span>)}</span><br><span class="line">print(values)<span class="comment"># {0, 2, 4, 6, 8}</span></span><br><span class="line"></span><br><span class="line">values = {x: x * <span class="number">2</span> <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">5</span>)}</span><br><span class="line">print(values)<span class="comment"># {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}</span></span><br></pre></td></tr></table></figure><h1 id="Generators"><a href="#Generators" class="headerlink" title="Generators"></a>Generators</h1><p>用于有大量(无限)元素,要节省内存空间的情形</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> sys <span class="keyword">import</span> getsizeof</span><br><span class="line"></span><br><span class="line">values = (x * <span class="number">2</span> <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">100000</span>))<span class="comment"># generator</span></span><br><span class="line">print(<span class="string">"gen:"</span>, getsizeof(values))</span><br><span class="line"></span><br><span class="line">values = [x * <span class="number">2</span> <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">100000</span>)]<span class="comment"># list</span></span><br><span class="line">print(<span class="string">"list:"</span>, getsizeof(values))</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">gen: <span class="number">112</span></span><br><span class="line">list: <span class="number">800984</span></span><br></pre></td></tr></table></figure><p>对于 generator object, 无论有多少元素,都只占112的位置(就算只有一个元素也是)。generator object 在迭代时才生成元素,而不是将所有的元素都存在内存中。</p><h1 id="Unpacking-Operator"><a href="#Unpacking-Operator" class="headerlink" title="Unpacking Operator"></a>Unpacking Operator</h1><p><strong>Demo 1</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">numbers = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">print(numbers)<span class="comment"># [1, 2, 3]</span></span><br><span class="line">print(*numbers)<span class="comment"># 1 2 3</span></span><br></pre></td></tr></table></figure><p>numbers 是一个list, 而 *numbers 是 unpack 之后的3个独立的数</p><p><strong>Demo 2</strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">values = list(range(<span class="number">5</span>))</span><br><span class="line">values = [*range(<span class="number">5</span>), *<span class="string">"Hello"</span>] </span><br><span class="line">print(values)<span class="comment"># [0, 1, 2, 3, 4, 'H', 'e', 'l', 'l', 'o']</span></span><br></pre></td></tr></table></figure><p><strong>Demo 3</strong></p><p>组合两个lists:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">first = [<span class="number">1</span>, <span class="number">2</span>]</span><br><span class="line">second = [<span class="number">3</span>]</span><br><span class="line">values = [*first, <span class="string">"a"</span>, *second, *<span class="string">"Hello"</span>]</span><br><span class="line">print(values)<span class="comment"># [1, 2, 'a', 3, 'H', 'e', 'l', 'l', 'o']</span></span><br></pre></td></tr></table></figure><p><strong>Demo 4</strong></p><p>组合两个字典:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">first = {<span class="string">"x"</span>: <span class="number">1</span>}</span><br><span class="line">second = {<span class="string">"x"</span>: <span class="number">10</span>, <span class="string">"y"</span>: <span class="number">2</span>}</span><br><span class="line">combined = {**first, **second, <span class="string">"z"</span>: <span class="number">1</span>}</span><br><span class="line">print(combined) <span class="comment"># {'x': 10, 'y': 2, 'z': 1}</span></span><br></pre></td></tr></table></figure><p>相同 key 值的元素 (“x”) 取最后一个元素的 value (10)</p><h1 id="Exercise"><a href="#Exercise" class="headerlink" title="Exercise"></a>Exercise</h1><p>得出一个句子中出现频率最高的字母:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> pprint <span class="keyword">import</span> pprint</span><br><span class="line"></span><br><span class="line">sentence = <span class="string">"This is a common interview question"</span></span><br><span class="line"></span><br><span class="line">char_frequency = {}</span><br><span class="line"><span class="keyword">for</span> char <span class="keyword">in</span> sentence:</span><br><span class="line"> <span class="keyword">if</span> char <span class="keyword">in</span> char_frequency:</span><br><span class="line"> char_frequency[char] += <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> char_frequency[char] = <span class="number">1</span></span><br><span class="line">pprint(char_frequency, width=<span class="number">1</span>) <span class="comment"># 一行只打印一个</span></span><br><span class="line"></span><br><span class="line">char_frequency_sorted = sorted(</span><br><span class="line"> char_frequency.items(),</span><br><span class="line"> key=<span class="keyword">lambda</span> kv: kv[<span class="number">1</span>],</span><br><span class="line"> reverse=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">print(char_frequency_sorted[<span class="number">0</span>])</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">{<span class="string">' '</span>: <span class="number">5</span>,</span><br><span class="line"> <span class="string">'T'</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="string">'a'</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="string">'c'</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="string">'e'</span>: <span class="number">3</span>,</span><br><span class="line"> <span class="string">'h'</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="string">'i'</span>: <span class="number">5</span>,</span><br><span class="line"> <span class="string">'m'</span>: <span class="number">2</span>,</span><br><span class="line"> <span class="string">'n'</span>: <span class="number">3</span>,</span><br><span class="line"> <span class="string">'o'</span>: <span class="number">3</span>,</span><br><span class="line"> <span class="string">'q'</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="string">'r'</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="string">'s'</span>: <span class="number">3</span>,</span><br><span class="line"> <span class="string">'t'</span>: <span class="number">2</span>,</span><br><span class="line"> <span class="string">'u'</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="string">'v'</span>: <span class="number">1</span>,</span><br><span class="line"> <span class="string">'w'</span>: <span class="number">1</span>}</span><br><span class="line">(<span class="string">'i'</span>, <span class="number">5</span>)</span><br></pre></td></tr></table></figure><p>我的改进:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#char_frequency = {}</span></span><br><span class="line"><span class="comment">#for char in sentence:</span></span><br><span class="line"><span class="comment"># if char in char_frequency:</span></span><br><span class="line"><span class="comment"># char_frequency[char] += 1</span></span><br><span class="line"><span class="comment"># else:</span></span><br><span class="line"><span class="comment"># char_frequency[char] = 1</span></span><br><span class="line"><span class="comment"># pprint(char_frequency, width=1) # 一行只打印一个</span></span><br><span class="line"></span><br><span class="line">char_frequency = {}</span><br><span class="line"><span class="keyword">for</span> char <span class="keyword">in</span> sentence:</span><br><span class="line"> char_frequency[char] = char_frequency.get(char, <span class="number">0</span>) + <span class="number">1</span></span><br><span class="line">pprint(char_frequency, width=<span class="number">1</span>)</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<h1 id="List"><a href="#List" class="headerlink" tit
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(4)--Functions</title>
<link href="http://yoursite.com/2021/05/06/20210506_Python004/"/>
<id>http://yoursite.com/2021/05/06/20210506_Python004/</id>
<published>2021-05-06T09:50:09.000Z</published>
<updated>2021-05-17T04:24:22.981Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><h1 id="Arguments"><a href="#Arguments" class="headerlink" title="Arguments"></a>Arguments</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">greet</span><span class="params">(first_name, last_name)</span>:</span></span><br><span class="line"> print(<span class="string">f"Hi <span class="subst">{first_name}</span> <span class="subst">{last_name}</span>"</span>)</span><br><span class="line"> print(<span class="string">"Welcome aboard"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">greet(<span class="string">"Stone"</span>, <span class="string">"Purple"</span>)</span><br><span class="line">greet(<span class="string">"Stephen"</span>, <span class="string">"Curry"</span>)</span><br></pre></td></tr></table></figure><h1 id="Types-of-Functions"><a href="#Types-of-Functions" class="headerlink" title="Types of Functions"></a>Types of Functions</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">👉 <span class="number">1</span> - Perform a task</span><br><span class="line">👉 <span class="number">2</span> - Return a value</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">greet</span><span class="params">(name)</span>:</span></span><br><span class="line"> <span class="string">""" Type 1 function """</span></span><br><span class="line"> print(<span class="string">f"Hi <span class="subst">{name}</span>"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">get_greeting</span><span class="params">(name)</span>:</span></span><br><span class="line"> <span class="string">""" Type 2 function """</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">f"Hi <span class="subst">{name}</span>"</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">message = get_greeting(<span class="string">"Stone"</span>)</span><br><span class="line">file = open(<span class="string">"content.txt"</span>, <span class="string">"w"</span>)</span><br><span class="line">file.write(message)</span><br></pre></td></tr></table></figure><p>python return <strong>None</strong> by default.</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(greet(<span class="string">"Stone"</span>))</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">None</span><br></pre></td></tr></table></figure><h1 id="Types-of-Arguments"><a href="#Types-of-Arguments" class="headerlink" title="Types of Arguments"></a>Types of Arguments</h1><h2 id="Keyword-Arguments"><a href="#Keyword-Arguments" class="headerlink" title="Keyword Arguments"></a>Keyword Arguments</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">increment</span><span class="params">(number, by)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> number + by</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># more readable: by=...</span></span><br><span class="line">print(increment(<span class="number">2</span>, by=<span class="number">1</span>))</span><br></pre></td></tr></table></figure><h2 id="Default-Arguments"><a href="#Default-Arguments" class="headerlink" title="Default Arguments"></a>Default Arguments</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">increment</span><span class="params">(number, by=<span class="number">1</span>)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> number + by</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(increment(<span class="number">2</span>))</span><br></pre></td></tr></table></figure><p>所有 optional arguments 应该在无 default value 的 argument 后面</p><h2 id="args"><a href="#args" class="headerlink" title="*args"></a>*args</h2><p>输入参数数量可变(存成一个tuple,且iterable)</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">multiply</span><span class="params">(*numbers)</span>:</span></span><br><span class="line"> total = <span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> number <span class="keyword">in</span> numbers:</span><br><span class="line"> total *= number</span><br><span class="line"> <span class="keyword">return</span> total</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(multiply(<span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>))</span><br><span class="line">print(multiply(<span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="number">2</span>, <span class="number">5</span>))</span><br></pre></td></tr></table></figure><p>输出</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">120</span><br><span class="line">1200</span><br></pre></td></tr></table></figure><h2 id="args-1"><a href="#args-1" class="headerlink" title="**args"></a>**args</h2><p>打包 keyword arguments 成 dict 给函数体调用</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">save_user</span><span class="params">(**user)</span>:</span></span><br><span class="line"> print(user)</span><br><span class="line"> print(user[<span class="string">"name"</span>])</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">save_user(id=<span class="number">1</span>, name=<span class="string">"John"</span>, age=<span class="number">22</span>)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">{'id': 1, 'name': 'John', 'age': 22}</span><br><span class="line">John</span><br></pre></td></tr></table></figure><h1 id="Scope"><a href="#Scope" class="headerlink" title="Scope"></a>Scope</h1><p>局部变量局部可见</p><p>全局变量全局可见</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">message = <span class="string">"a"</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">greet</span><span class="params">(name)</span>:</span></span><br><span class="line"> message = <span class="string">"b"</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">greet(<span class="string">"Stone"</span>)</span><br><span class="line">print(message)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a</span><br></pre></td></tr></table></figure><p>因为 Python 将 greet 函数内的 message 视为 local variable,尽管它与全局变量同名。</p><h1 id="Debugging"><a href="#Debugging" class="headerlink" title="Debugging"></a>Debugging</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">👉 F9 -- 设置断点</span><br><span class="line">👉 F5 -- 开始调试</span><br><span class="line">👉 F10 -- 下一步</span><br><span class="line">👉 F11 -- 进入 function 内单步 debug</span><br><span class="line">👉 Shift+F11 -- 退出 function 内单步 debug</span><br></pre></td></tr></table></figure><h1 id="VSCode-Tricks-Windows"><a href="#VSCode-Tricks-Windows" class="headerlink" title="VSCode Tricks (Windows)"></a>VSCode Tricks (Windows)</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">👉 Home 光标移到行首</span><br><span class="line">👉 End 光标移到行尾</span><br><span class="line">👉 Ctrl+Home 光标移到文件头</span><br><span class="line">👉 Ctrl+End 光标移到文件尾</span><br><span class="line">👉 Ctrl+L 选择当前行</span><br><span class="line">👉 Alt+↑or↓ 代码上移或下移</span><br><span class="line">👉 Shift+Alt+↓选中某(几)行后用此组合键复制粘贴</span><br><span class="line">👉 Ctrl+/多行注释</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<h1 id="Arguments"><a href="#Arguments" class="heade
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(3)--Control Flow</title>
<link href="http://yoursite.com/2021/05/06/20210506_Python003/"/>
<id>http://yoursite.com/2021/05/06/20210506_Python003/</id>
<published>2021-05-06T08:50:09.000Z</published>
<updated>2021-05-17T04:24:22.973Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><h1 id="Comparison-Operators"><a href="#Comparison-Operators" class="headerlink" title="Comparison Operators"></a>Comparison Operators</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span><span class="number">10</span> > <span class="number">3</span></span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="meta">>>> </span><span class="number">10</span> >= <span class="number">3</span></span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="meta">>>> </span><span class="number">10</span> < <span class="number">20</span></span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="meta">>>> </span><span class="number">10</span> == <span class="number">10</span></span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="meta">>>> </span><span class="number">10</span> == <span class="string">"10"</span> </span><br><span class="line"><span class="literal">False</span></span><br><span class="line"><span class="meta">>>> </span><span class="number">10</span> != <span class="string">"10"</span> </span><br><span class="line"><span class="literal">True</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>>> </span><span class="string">"bag"</span> > <span class="string">"apple"</span> </span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="meta">>>> </span><span class="string">"bag"</span> == <span class="string">"BAG"</span> </span><br><span class="line"><span class="literal">False</span></span><br><span class="line"><span class="meta">>>> </span>ord(<span class="string">"b"</span>) </span><br><span class="line"><span class="number">98</span> </span><br><span class="line"><span class="meta">>>> </span>ord(<span class="string">"B"</span>) </span><br><span class="line"><span class="number">66</span></span><br></pre></td></tr></table></figure><h2 id="Chaining-Comparison-Operators"><a href="#Chaining-Comparison-Operators" class="headerlink" title="Chaining Comparison Operators"></a>Chaining Comparison Operators</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># age should be between 18 and 65</span></span><br><span class="line">age = <span class="number">22</span></span><br><span class="line"><span class="keyword">if</span> <span class="number">18</span> <= age < <span class="number">65</span>:</span><br><span class="line"> print(<span class="string">"Eligible"</span>)</span><br></pre></td></tr></table></figure><h1 id="Conditional-Statements"><a href="#Conditional-Statements" class="headerlink" title="Conditional Statements"></a>Conditional Statements</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">temperature = <span class="number">15</span></span><br><span class="line"><span class="keyword">if</span> temperature > <span class="number">30</span>:</span><br><span class="line"> print(<span class="string">"It is warm"</span>)</span><br><span class="line"> print(<span class="string">"Drink water"</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">elif</span> temperature > <span class="number">20</span>:</span><br><span class="line"> print(<span class="string">"It's nice"</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">"It's cold"</span>)</span><br><span class="line"> </span><br><span class="line">print(<span class="string">"Done"</span>)</span><br></pre></td></tr></table></figure><h1 id="Ternary-Operator"><a href="#Ternary-Operator" class="headerlink" title="Ternary Operator"></a>Ternary Operator</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">age = <span class="number">2</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># if age >= 18:</span></span><br><span class="line"><span class="comment"># message = "Eligible"</span></span><br><span class="line"><span class="comment"># else:</span></span><br><span class="line"><span class="comment"># message = "Not eligible"</span></span><br><span class="line"></span><br><span class="line">message = <span class="string">"Eligible"</span> <span class="keyword">if</span> age >= <span class="number">18</span> <span class="keyword">else</span> <span class="string">"Not eligible"</span></span><br><span class="line"></span><br><span class="line">print(message)</span><br></pre></td></tr></table></figure><h1 id="Logical-Operators"><a href="#Logical-Operators" class="headerlink" title="Logical Operators"></a>Logical Operators</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># logical operators: and, or, not</span></span><br><span class="line"></span><br><span class="line">high_income = <span class="literal">True</span></span><br><span class="line">good_credit = <span class="literal">False</span></span><br><span class="line">student = <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (high_income <span class="keyword">or</span> good_credit) <span class="keyword">and</span> <span class="keyword">not</span> student:</span><br><span class="line"> print(<span class="string">"Eligible"</span>)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">"Not eligible"</span>)</span><br></pre></td></tr></table></figure><h2 id="Short-circuit-Evaluation"><a href="#Short-circuit-Evaluation" class="headerlink" title="Short-circuit Evaluation"></a>Short-circuit Evaluation</h2><p>多条件判断时:</p><p>and 前面的 expression 为 False, 则不再(执行)判断后面的expression</p><p>or 前面的 expression 为 True, 则不再(执行)判断后面的expression</p><h1 id="For-Loops"><a href="#For-Loops" class="headerlink" title="For Loops"></a>For Loops</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> number <span class="keyword">in</span> range(<span class="number">1</span>, <span class="number">10</span>, <span class="number">2</span>):<span class="comment"># step: 2</span></span><br><span class="line"> print(<span class="string">"Attempt"</span>, number, number * <span class="string">"."</span>)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Attempt 1 .</span><br><span class="line">Attempt 3 ...</span><br><span class="line">Attempt 5 .....</span><br><span class="line">Attempt 7 .......</span><br><span class="line">Attempt 9 .........</span><br></pre></td></tr></table></figure><h2 id="For…Else"><a href="#For…Else" class="headerlink" title="For…Else"></a>For…Else</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">successful = <span class="literal">False</span></span><br><span class="line"><span class="keyword">for</span> number <span class="keyword">in</span> range(<span class="number">3</span>):</span><br><span class="line"> print(<span class="string">"Attempt"</span>)</span><br><span class="line"> <span class="keyword">if</span> successful:</span><br><span class="line"> print(<span class="string">"Successful"</span>)</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> print(<span class="string">"Attempted 3 times and failed."</span>)</span><br></pre></td></tr></table></figure><p>如果一直没有执行break,就执行下面的else</p><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Attempt</span><br><span class="line">Attempt</span><br><span class="line">Attempt</span><br><span class="line">Attempted <span class="number">3</span> times <span class="keyword">and</span> failed</span><br></pre></td></tr></table></figure><h2 id="Nested-Loops"><a href="#Nested-Loops" class="headerlink" title="Nested Loops"></a>Nested Loops</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">5</span>):</span><br><span class="line"> <span class="keyword">for</span> y <span class="keyword">in</span> range(<span class="number">3</span>):</span><br><span class="line"> print(<span class="string">f"(<span class="subst">{x}</span>, <span class="subst">{y}</span>)"</span>)</span><br></pre></td></tr></table></figure><p>输出结果</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">(<span class="number">0</span>, <span class="number">0</span>)</span><br><span class="line">(<span class="number">0</span>, <span class="number">1</span>)</span><br><span class="line">(<span class="number">0</span>, <span class="number">2</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="number">0</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="number">1</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">(<span class="number">2</span>, <span class="number">0</span>)</span><br><span class="line">(<span class="number">2</span>, <span class="number">1</span>)</span><br><span class="line">(<span class="number">2</span>, <span class="number">2</span>)</span><br><span class="line">(<span class="number">3</span>, <span class="number">0</span>)</span><br><span class="line">(<span class="number">3</span>, <span class="number">1</span>)</span><br><span class="line">(<span class="number">3</span>, <span class="number">2</span>)</span><br><span class="line">(<span class="number">4</span>, <span class="number">0</span>)</span><br><span class="line">(<span class="number">4</span>, <span class="number">1</span>)</span><br><span class="line">(<span class="number">4</span>, <span class="number">2</span>)</span><br></pre></td></tr></table></figure><h2 id="Iterables"><a href="#Iterables" class="headerlink" title="Iterables"></a>Iterables</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Iterable : range(), string, list...</span></span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> <span class="string">"Python"</span>:</span><br><span class="line"> print(x)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> x <span class="keyword">in</span> [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]:</span><br><span class="line"> print(x)</span><br></pre></td></tr></table></figure><p>输出:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">P</span><br><span class="line">y</span><br><span class="line">t</span><br><span class="line">h</span><br><span class="line">o</span><br><span class="line">n</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="number">3</span></span><br><span class="line"><span class="number">4</span></span><br></pre></td></tr></table></figure><h1 id="While-Loops"><a href="#While-Loops" class="headerlink" title="While Loops"></a>While Loops</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">command = <span class="string">""</span></span><br><span class="line"><span class="keyword">while</span> command.lower() != <span class="string">"quit"</span>:</span><br><span class="line"> command = input(<span class="string">">"</span>)</span><br><span class="line"> print(<span class="string">"ECHO"</span>, command)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">><span class="number">2</span>+<span class="number">2</span></span><br><span class="line">ECHO <span class="number">2</span>+<span class="number">2</span></span><br><span class="line">><span class="number">3</span>*<span class="number">4</span> </span><br><span class="line">ECHO <span class="number">3</span>*<span class="number">4</span></span><br><span class="line">>quit </span><br><span class="line">ECHO quit</span><br></pre></td></tr></table></figure><h1 id="Infinite-Loops"><a href="#Infinite-Loops" class="headerlink" title="Infinite Loops"></a>Infinite Loops</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> command = input(<span class="string">">"</span>)</span><br><span class="line"> print(<span class="string">"ECHO"</span>, command)</span><br><span class="line"> <span class="keyword">if</span> command.lower() == <span class="string">"quit"</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br></pre></td></tr></table></figure><h1 id="Exercise"><a href="#Exercise" class="headerlink" title="Exercise"></a>Exercise</h1><p>编写一段code,输出1~10之间(不含10)的偶数,如下:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">2</span></span><br><span class="line"><span class="number">4</span></span><br><span class="line"><span class="number">6</span></span><br><span class="line"><span class="number">8</span></span><br><span class="line">We have <span class="number">4</span> even numbers</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<h1 id="Comparison-Operators"><a href="#Comparison-O
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
<entry>
<title>Mosh的Python课程笔记(2)--基本类型</title>
<link href="http://yoursite.com/2021/05/06/20210506_Python002/"/>
<id>http://yoursite.com/2021/05/06/20210506_Python002/</id>
<published>2021-05-06T06:25:09.000Z</published>
<updated>2021-05-17T04:24:22.966Z</updated>
<content type="html"><![CDATA[<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p><h1 id="Primitive-Types"><a href="#Primitive-Types" class="headerlink" title="Primitive Types"></a>Primitive Types</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">students_count = <span class="number">1000</span></span><br><span class="line">rating = <span class="number">4.99</span></span><br><span class="line">is_published = <span class="literal">False</span> <span class="comment"># case sensitive (区分大小写)</span></span><br><span class="line">course_name = <span class="string">"Python Programming"</span></span><br></pre></td></tr></table></figure><h1 id="String"><a href="#String" class="headerlink" title="String"></a>String</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">course_name = <span class="string">"Python Programming"</span></span><br><span class="line">message = <span class="string">"""</span></span><br><span class="line"><span class="string">Hi John</span></span><br><span class="line"><span class="string">This is Stone from China</span></span><br><span class="line"><span class="string">blablabla</span></span><br><span class="line"><span class="string">"""</span></span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">course_name = <span class="string">"Python Programming"</span></span><br><span class="line">print(len(course_name))<span class="comment"># 18</span></span><br><span class="line">print(course_name[<span class="number">0</span>])<span class="comment"># P</span></span><br><span class="line">print(course_name[<span class="number">-1</span>])<span class="comment"># g</span></span><br><span class="line">print(course_name[<span class="number">0</span>:<span class="number">3</span>])<span class="comment"># Pyt</span></span><br><span class="line">print(course_name[<span class="number">0</span>:])<span class="comment"># Python Programming</span></span><br><span class="line">print(course_name[:<span class="number">3</span>])<span class="comment"># Pyt</span></span><br><span class="line">print(course_name[:])<span class="comment"># Python Programming</span></span><br></pre></td></tr></table></figure><h2 id="Escape-Sequences"><a href="#Escape-Sequences" class="headerlink" title="Escape Sequences"></a>Escape Sequences</h2><p>转义字符</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">course_name = <span class="string">"Python \"Programming"</span></span><br><span class="line">print(course_name) <span class="comment"># Python "Programming</span></span><br><span class="line"><span class="comment"># \" \' \\ \n</span></span><br></pre></td></tr></table></figure><h2 id="Formatted-Strings"><a href="#Formatted-Strings" class="headerlink" title="Formatted Strings"></a>Formatted Strings</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">first = <span class="string">"Stone"</span></span><br><span class="line">last = <span class="string">"Purple"</span></span><br><span class="line">full = <span class="string">f"<span class="subst">{first}</span> <span class="subst">{last}</span>"</span></span><br><span class="line">print(full)<span class="comment"># Stone Purple</span></span><br><span class="line">print(<span class="string">f"<span class="subst">{len(first)}</span> <span class="subst">{<span class="number">2</span> + <span class="number">2</span>}</span>"</span>)<span class="comment"># 5 4</span></span><br></pre></td></tr></table></figure><h2 id="String-Methods"><a href="#String-Methods" class="headerlink" title="String Methods"></a>String Methods</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">course = <span class="string">" Python Programming"</span></span><br><span class="line">print(course.upper())</span><br><span class="line">print(course.lower())</span><br><span class="line">print(course.title())</span><br><span class="line">print(course.strip()) <span class="comment"># lstrip, rstrip</span></span><br><span class="line">print(course.find(<span class="string">"Pro"</span>))</span><br><span class="line">print(course.replace(<span class="string">"P"</span>, <span class="string">"J"</span>))</span><br><span class="line">print(<span class="string">"Pro"</span> <span class="keyword">in</span> course)</span><br><span class="line">print(<span class="string">"swift"</span> <span class="keyword">not</span> <span class="keyword">in</span> course)</span><br></pre></td></tr></table></figure><p>输出结果:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"> PYTHON PROGRAMMING</span><br><span class="line"> python programming</span><br><span class="line"> Python Programming</span><br><span class="line">Python Programming</span><br><span class="line"><span class="number">9</span></span><br><span class="line"> Jython Jrogramming</span><br><span class="line"><span class="literal">True</span></span><br><span class="line"><span class="literal">True</span></span><br></pre></td></tr></table></figure><h1 id="Numbers"><a href="#Numbers" class="headerlink" title="Numbers"></a>Numbers</h1><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">x = <span class="number">1</span></span><br><span class="line">x = <span class="number">1.1</span></span><br><span class="line">x = <span class="number">1</span> + <span class="number">2j</span> <span class="comment"># complex number</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># + - * / % // **</span></span><br><span class="line">print(<span class="number">10</span> / <span class="number">3</span>) <span class="comment"># 3.3333333333333335</span></span><br><span class="line">print(<span class="number">10</span> // <span class="number">3</span>)<span class="comment"># 3</span></span><br><span class="line">print(<span class="number">10</span> ** <span class="number">3</span>)<span class="comment"># 1000</span></span><br><span class="line"></span><br><span class="line">x = <span class="number">10</span></span><br><span class="line">x = x + <span class="number">3</span></span><br><span class="line">x += <span class="number">3</span></span><br></pre></td></tr></table></figure><h2 id="Working-with-Numbers"><a href="#Working-with-Numbers" class="headerlink" title="Working with Numbers"></a>Working with Numbers</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> math</span><br><span class="line"></span><br><span class="line">print(round(<span class="number">2.9</span>))<span class="comment"># 3</span></span><br><span class="line">print(abs(<span class="number">-2.9</span>))<span class="comment"># 2.9</span></span><br><span class="line"></span><br><span class="line">print(math.ceil(<span class="number">2.2</span>))<span class="comment"># 3</span></span><br></pre></td></tr></table></figure><h2 id="Type-Conversion"><a href="#Type-Conversion" class="headerlink" title="Type Conversion"></a>Type Conversion</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">x = input(<span class="string">"x: "</span>)</span><br><span class="line">print(type(x))</span><br><span class="line">y = int(x) + <span class="number">1</span><span class="comment"># type conversion</span></span><br><span class="line">print(<span class="string">f"x: <span class="subst">{x}</span>, y: <span class="subst">{y}</span>"</span>)</span><br></pre></td></tr></table></figure><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">x: <span class="number">2</span></span><br><span class="line"><<span class="class"><span class="keyword">class</span> '<span class="title">str</span>'></span></span><br><span class="line"><span class="class"><span class="title">x</span>:</span> <span class="number">2</span>, y: <span class="number">3</span></span><br></pre></td></tr></table></figure><p>对于bool(x),为 False 的情况<strong>只有</strong>:“”,0,None</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(bool(<span class="string">""</span>))<span class="comment"># False</span></span><br></pre></td></tr></table></figure><h1 id="Quiz"><a href="#Quiz" class="headerlink" title="Quiz"></a>Quiz</h1><p>👉 What are the primitive types in Python?</p><p>👉 What are the results?</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">fruit = <span class="string">"Apple"</span></span><br><span class="line">print(fruit[<span class="number">1</span>])</span><br><span class="line">print(fruit[<span class="number">1</span>:<span class="number">-1</span>])</span><br></pre></td></tr></table></figure><p>👉 What are the results?</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">print(<span class="number">10</span> % <span class="number">3</span>)</span><br><span class="line">print(bool(<span class="string">"False"</span>))</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p><a href="https://codewithmosh.com/" target="_blank" rel="noopener">Mosh的课程网址</a></p>
<h1 id="Primitive-Types"><a href="#Primitive-Types"
</summary>
<category term="Python" scheme="http://yoursite.com/categories/Python/"/>
<category term="job notes-python" scheme="http://yoursite.com/tags/job-notes-python/"/>
</entry>
</feed>