-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
481 lines (234 loc) · 650 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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>TIME IN PIECE</title>
<subtitle>I MUST ASSEMBL THEM</subtitle>
<link href="https://wicherqaq.github.io/atom.xml" rel="self"/>
<link href="https://wicherqaq.github.io/"/>
<updated>2020-12-23T09:37:18.313Z</updated>
<id>https://wicherqaq.github.io/</id>
<author>
<name>wicherQAQ</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>spring 配置 cache 缓存使用 Redis(基于注解)</title>
<link href="https://wicherqaq.github.io/2020/12/23/spring-%E9%85%8D%E7%BD%AE-cache-%E7%BC%93%E5%AD%98%E4%BD%BF%E7%94%A8-Redis%EF%BC%88%E5%9F%BA%E4%BA%8E%E6%B3%A8%E8%A7%A3%EF%BC%89/"/>
<id>https://wicherqaq.github.io/2020/12/23/spring-%E9%85%8D%E7%BD%AE-cache-%E7%BC%93%E5%AD%98%E4%BD%BF%E7%94%A8-Redis%EF%BC%88%E5%9F%BA%E4%BA%8E%E6%B3%A8%E8%A7%A3%EF%BC%89/</id>
<published>2020-12-23T09:32:57.000Z</published>
<updated>2020-12-23T09:37:18.313Z</updated>
<content type="html"><![CDATA[<h2 id="Spring-boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。"><a href="#Spring-boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。" class="headerlink" title="Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。"></a>Spring boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。</h2><p>Spring cache是代码级的缓存,一般是使用一个ConcurrentMap,也就是说实际上还是是使用JVM的内存来缓存对象的,这势必会造成大量的内存消耗。但好处是显然的:使用方便。<br> Redis 作为一个缓存服务器,是内存级的缓存。它是使用单纯的内存来进行缓存。<br> 集群环境下,每台服务器的spring cache是不同步的,这样会出问题的,spring cache只适合单机环境。<br> Redis是设置单独的缓存服务器,所有集群服务器统一访问redis,不会出现缓存不同步的情况。</p><h3 id="CacheManager负责对缓存的增删改查-CacheManager的缓存的介质可配置ConcurrentMap-EhCache-Redis等,这里我用的是redis配置"><a href="#CacheManager负责对缓存的增删改查-CacheManager的缓存的介质可配置ConcurrentMap-EhCache-Redis等,这里我用的是redis配置" class="headerlink" title="CacheManager负责对缓存的增删改查, CacheManager的缓存的介质可配置ConcurrentMap/EhCache/Redis等,这里我用的是redis配置"></a>CacheManager负责对缓存的增删改查, CacheManager的缓存的介质可配置ConcurrentMap/EhCache/Redis等,这里我用的是redis配置</h3><p>Redis配置类</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><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><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line">@Configuration</span><br><span class="line">public class RedisConfiguration {</span><br><span class="line"></span><br><span class="line"> @Bean</span><br><span class="line"> @ConfigurationProperties(prefix = "session.redis")</span><br><span class="line"> protected RedisConfigVo redisConfig() {</span><br><span class="line"> return new RedisConfigVo();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> /**</span><br><span class="line"> * 解决redis.clients.jedis.exceptions.JedisDataException: ERR unknown command ' CONFIG '</span><br><span class="line"> *</span><br><span class="line"> * @return</span><br><span class="line"> */</span><br><span class="line"> @Bean</span><br><span class="line"> public static ConfigureRedisAction configureRedisAction() {</span><br><span class="line"> return ConfigureRedisAction.NO_OP;</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"> *</span><br><span class="line"> * @return</span><br><span class="line"> */</span><br><span class="line"> @Bean</span><br><span class="line"> public RedisConnectionFactory connectionFactory() {</span><br><span class="line"> RedisConfigVo configVo = redisConfig();</span><br><span class="line"> JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();</span><br><span class="line"> jedisConnectionFactory.setHostName(configVo.getHost());</span><br><span class="line"> jedisConnectionFactory.setPort(configVo.getPort());</span><br><span class="line"> jedisConnectionFactory.setTimeout(configVo.getTimeout());</span><br><span class="line"> if (configVo.getPassword() != null && !"".equals(configVo.getPassword())) {</span><br><span class="line"> jedisConnectionFactory.setPassword(configVo.getPassword());</span><br><span class="line"> }</span><br><span class="line"> jedisConnectionFactory.setDatabase(configVo.getDatabase());</span><br><span class="line"> jedisConnectionFactory.setPoolConfig(poolCofig(configVo));</span><br><span class="line"> jedisConnectionFactory.setUsePool(true);</span><br><span class="line"> // 初始化连接pool</span><br><span class="line"> jedisConnectionFactory.afterPropertiesSet();</span><br><span class="line"> return jedisConnectionFactory;</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"> *</span><br><span class="line"> * @return</span><br><span class="line"> */</span><br><span class="line"> private static JedisPoolConfig poolCofig(RedisConfigVo configVo) {</span><br><span class="line"> JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();</span><br><span class="line"> jedisPoolConfig.setMaxIdle(configVo.getMaxIdle() > 0 ? configVo.getMaxIdle() : GenericObjectPoolConfig.DEFAULT_MAX_IDLE);</span><br><span class="line"> jedisPoolConfig.setMinIdle(configVo.getMinIdle() > 0 ? configVo.getMinIdle() : GenericObjectPoolConfig.DEFAULT_MIN_IDLE);</span><br><span class="line"> jedisPoolConfig.setMaxTotal(configVo.getMaxTotal() > 0 ? configVo.getMaxTotal() : GenericObjectPoolConfig.DEFAULT_MAX_TOTAL);</span><br><span class="line"> jedisPoolConfig.setMaxWaitMillis(configVo.getMaxWaitMillis() > 0 ? configVo.getMaxWaitMillis() : GenericObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS);</span><br><span class="line"> jedisPoolConfig.setTestOnBorrow(configVo.isTestOnBorrow());</span><br><span class="line"> return jedisPoolConfig;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> @Bean</span><br><span class="line"> public CacheManager cacheManager(RedisTemplate redisTemplate) {</span><br><span class="line"></span><br><span class="line"> RedisCacheManager rcm = new RedisCacheManager(redisTemplate);</span><br><span class="line"> //seconds</span><br><span class="line"> rcm.setDefaultExpiration(5 * 60L);</span><br><span class="line"> return rcm;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>使用@Cacheable 注解<br> <img src="/2020/12/23/spring-%E9%85%8D%E7%BD%AE-cache-%E7%BC%93%E5%AD%98%E4%BD%BF%E7%94%A8-Redis%EF%BC%88%E5%9F%BA%E4%BA%8E%E6%B3%A8%E8%A7%A3%EF%BC%89/.._posts%5Cspring-%E9%85%8D%E7%BD%AE-cache-%E7%BC%93%E5%AD%98%E4%BD%BF%E7%94%A8-Redis%EF%BC%88%E5%9F%BA%E4%BA%8E%E6%B3%A8%E8%A7%A3%EF%BC%89%5C1.png" alt></p>]]></content>
<summary type="html"><h2 id="Spring-boot默认使用的是SimpleCacheConfiguration,即使用ConcurrentMapCacheManager来实现缓存。"><a href="#Spring-boot默认使用的是SimpleCacheConfiguration,即使</summary>
<category term="springboot" scheme="https://wicherqaq.github.io/tags/springboot/"/>
</entry>
<entry>
<title>git同时配置gitee和github</title>
<link href="https://wicherqaq.github.io/2020/12/11/git%E5%90%8C%E6%97%B6%E9%85%8D%E7%BD%AEgitee%E5%92%8Cgithub/"/>
<id>https://wicherqaq.github.io/2020/12/11/git%E5%90%8C%E6%97%B6%E9%85%8D%E7%BD%AEgitee%E5%92%8Cgithub/</id>
<published>2020-12-11T08:21:08.000Z</published>
<updated>2021-07-25T02:27:45.983Z</updated>
<content type="html"><![CDATA[<h4 id="ssh文件本地环境配置"><a href="#ssh文件本地环境配置" class="headerlink" title="ssh文件本地环境配置"></a>ssh文件本地环境配置</h4><ul><li><p>在自己系统中找到.ssh文件夹,将此目录下的文件全部删除</p><ul><li><p>方法一: 在GUI模式下手动寻找 (window系统在 “C:\Users\账号名.ssh ” )<br><img src="https://img-blog.csdnimg.cn/2019071711052845.png" alt="在这里插入图片描述"></p></li><li><p>方法二: 鼠标右键打开 Git Bash,在弹出的窗口中输入</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">cd ~/.ssh # 进入.ssh文件夹</span><br></pre></td></tr></table></figure></li></ul></li><li><p>生成ssh配置文件</p><ul><li><p>在 .ssh 文件夹下鼠标右键打开 Git Base Here</p></li><li><p>输入命令:</p><figure class="highlight console"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -C "xxxxx@xxxxx.com" # 填写自己Github / Gitee的邮箱</span><br></pre></td></tr></table></figure></li><li><p>上述命令的执行次数由你要绑定几个代码仓库有关(eg: 要同时绑定Github和Gitee,则上述命令需执行两次),执行的时候可以自己指定生成文件的文件名(默认是id_rsa),然后填写密码(可以为空):</p><figure class="highlight console"><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">Generating public/private rsa key pair.</span><br><span class="line">Enter file in which to save the key (C:/Users/jiaha/.ssh): github_rsa</span><br></pre></td></tr></table></figure></li></ul></li><li><p>创建config文件,写入一些相应配置</p><p><code>touch config</code></p><figure class="highlight console"><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="bash"> gitee</span></span><br><span class="line">Host gitee.com</span><br><span class="line">HostName gitee.com</span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/id_rsa.gitee</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> github</span></span><br><span class="line">Host github.com</span><br><span class="line">HostName github.com</span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/id_rsa.github</span><br><span class="line">1234567891011</span><br></pre></td></tr></table></figure></li></ul><h4 id="在Github、Gitee上配置SSH-keys(以Github为例)"><a href="#在Github、Gitee上配置SSH-keys(以Github为例)" class="headerlink" title="在Github、Gitee上配置SSH keys(以Github为例)"></a>在Github、Gitee上配置SSH keys(以Github为例)</h4><ul><li>登录自己的Github / Gitee 网站,点击网站右上角自己的头像, 点击 Settings 选项,打开如下窗口,点击”New SSH key”。<br><img src="https://img-blog.csdnimg.cn/20190717134149744.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjIzMDU1MA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></li><li>“文本框1”中可以自己填写一个自定义标识(可以随便填写),“文本框2”中将之前在本地生成的**_rsa.pub文件中的内容复制粘贴到这里即可。然后点击“Add SSH key”。<br><img src="https://img-blog.csdnimg.cn/201907171344244.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjIzMDU1MA==,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></li></ul><h4 id="测试是否成功"><a href="#测试是否成功" class="headerlink" title="测试是否成功"></a>测试是否成功</h4><ul><li><p>打开 git 的控制窗口,输入如下命令:</p><figure class="highlight console"><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="meta">#</span><span class="bash"> 测试连接 Github </span></span><br><span class="line">ssh -T git@github.com</span><br><span class="line"><span class="meta">#</span><span class="bash"> 测试连接 Gitee </span></span><br><span class="line">ssh -T git@gitee.com</span><br></pre></td></tr></table></figure></li><li><p>如果出现如下结果,则说明你已经配置成功了。<br><img src="https://img-blog.csdnimg.cn/20190717135314964.png" alt="在这里插入图片描述"></p></li></ul>]]></content>
<summary type="html"><h4 id="ssh文件本地环境配置"><a href="#ssh文件本地环境配置" class="headerlink" title="ssh文件本地环境配置"></a>ssh文件本地环境配置</h4><ul>
<li><p>在自己系统中找到.ssh文件夹,将此目录下的文件全</summary>
<category term="git" scheme="https://wicherqaq.github.io/categories/git/"/>
</entry>
<entry>
<title>DockerFile命令</title>
<link href="https://wicherqaq.github.io/2020/12/07/DockerFile%E5%91%BD%E4%BB%A4/"/>
<id>https://wicherqaq.github.io/2020/12/07/DockerFile%E5%91%BD%E4%BB%A4/</id>
<published>2020-12-07T02:30:13.000Z</published>
<updated>2020-12-07T02:37:15.835Z</updated>
<content type="html"><![CDATA[<h4 id="FROM命令"><a href="#FROM命令" class="headerlink" title="FROM命令"></a>FROM命令</h4><p>功能为指定基础镜像,并且必须是第一条指令。</p><p>如果不以任何镜像为基础,那么写法为:FROM scratch。</p><p>同时意味着接下来所写的指令将作为镜像的第一层开始</p><blockquote><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></pre></td><td class="code"><pre><span class="line">FROM <image></span><br><span class="line">FROM <image>:<tag></span><br><span class="line">FROM <image>:<digest> </span><br></pre></td></tr></table></figure><p>三种写法,其中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest</digest></tag></p></blockquote><h4 id="RUN命令"><a href="#RUN命令" class="headerlink" title="RUN命令"></a>RUN命令</h4><p>功能为运行指定的命令</p><p>RUN命令有两种格式</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">1. RUN <command></span><br><span class="line">2. RUN ["executable", "param1", "param2"]</span><br></pre></td></tr></table></figure><p>第一种后边直接跟shell命令</p><ul><li>在linux操作系统上默认 /bin/sh -c</li><li>在windows操作系统上默认 cmd /S /C</li></ul><p>第二种是类似于函数调用。</p><p>可将executable理解成为可执行文件,后面就是两个参数。</p><p>两种写法比对:</p><ul><li>```<br>RUN /bin/bash -c ‘source $HOME/.bashrc; echo $HOME<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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure>RUN [“/bin/bash”, “-c”, “echo hello”]<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><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><br><span class="line">注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.</span><br><span class="line"></span><br><span class="line">多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。</span><br><span class="line"></span><br><span class="line">RUN书写时的换行符是\</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#### CMD命令</span><br><span class="line"></span><br><span class="line">功能为容器启动时要运行的命令</span><br><span class="line"></span><br><span class="line">语法有三种写法</span><br></pre></td></tr></table></figure></li></ul><ol><li>CMD [“executable”,”param1”,”param2”]</li><li>CMD [“param1”,”param2”]</li><li>CMD command param1 param2<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"></span><br><span class="line">第三种比较好理解了,就时shell这种执行方式和写法</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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure>CMD [ “sh”, “-c”, “echo $HOME” <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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure>CMD [ “echo”, “$HOME” ]<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><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><br><span class="line">补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。</span><br><span class="line"></span><br><span class="line">原因是参数传递后,docker解析的是一个JSON array</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">##### RUN & CMD</span><br><span class="line"></span><br><span class="line">不要把RUN和CMD搞混了。</span><br><span class="line"></span><br><span class="line">RUN是构件容器时就运行的命令以及提交运行结果</span><br><span class="line"></span><br><span class="line">CMD是容器启动时执行的命令,在构件时并不运行,构件时紧紧指定了这个命令到底是个什么样子</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#### LABEL命令</span><br><span class="line"></span><br><span class="line">功能是为镜像指定标签</span><br><span class="line"></span><br><span class="line">语法:</span><br></pre></td></tr></table></figure>LABEL <key>=<value> <key>=<value> <key>=<value> …<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"></span><br><span class="line">一个Dockerfile种可以有多个LABEL,如下:</span><br></pre></td></tr></table></figure>LABEL “com.example.vendor”=”ACME Incorporated”<br>LABEL com.example.label-with-value=”foo”<br>LABEL version=”1.0”<br>LABEL description=”This text illustrates <br>that label-values can span multiple lines.”<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"></span><br><span class="line"> 但是并不建议这样写,最好就写成一行,如太长需要换行的话则使用\符号</span><br><span class="line"></span><br><span class="line">如下:</span><br></pre></td></tr></table></figure>LABEL multi.label1=”value1” <br>multi.label2=”value2” <br>other=”value3”<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><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">说明:LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">#### MAINTAINER命令</span><br><span class="line"></span><br><span class="line">指定作者</span><br><span class="line"></span><br><span class="line">语法:</span><br></pre></td></tr></table></figure>MAINTAINER <name><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><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><br><span class="line"> </span><br><span class="line"></span><br><span class="line">#### EXPOSE命令</span><br><span class="line"></span><br><span class="line">功能为暴漏容器运行时的监听端口给外部</span><br><span class="line"></span><br><span class="line">但是EXPOSE并不会使容器访问主机的端口</span><br><span class="line"></span><br><span class="line">如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">#### ENV命令</span><br><span class="line"></span><br><span class="line">功能为设置环境变量</span><br><span class="line"></span><br><span class="line">语法有两种</span><br></pre></td></tr></table></figure></name></value></key></value></key></value></key></li><li>ENV <key> <value></value></key></li><li>ENV <key>=<value> …<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><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><br><span class="line">两者的区别就是第一种是一次设置一个,第二种是一次设置多个</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">#### ADD命令</span><br><span class="line"></span><br><span class="line"> 一个复制命令,把文件复制到景象中。</span><br><span class="line"></span><br><span class="line">如果把虚拟机与容器想象成两台linux服务器的话,那么这个命令就类似于scp,只是scp需要加用户名和密码的权限验证,而ADD不用。 </span><br><span class="line"></span><br><span class="line">语法如下:</span><br></pre></td></tr></table></figure></value></key></li><li>ADD <src>… <dest></dest></src></li><li>ADD [“<src>“,… “<dest>“] <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><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><dest>路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径</span><br><span class="line"></span><br><span class="line"><src>可以是一个本地文件或者是一个本地压缩文件,还可以是一个url</span><br><span class="line"></span><br><span class="line">如果把<src>写成一个url,那么ADD就类似于wget命令</span><br><span class="line"></span><br><span class="line">如以下写法都是可以的:</span><br><span class="line"></span><br><span class="line">-</span><br></pre></td></tr></table></figure>ADD test relativeDir/ <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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure>ADD test /relativeDir<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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure>ADD <a href="http://example.com/foobar" target="_blank" rel="noopener">http://example.com/foobar</a> /<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><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">尽量不要把<scr>写成一个文件夹,如果<src>是一个文件夹了,复制整个目录的内容,包括文件系统元数据</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">#### COPY命令</span><br><span class="line"></span><br><span class="line">看这个名字就知道,又是一个复制命令</span><br><span class="line"></span><br><span class="line">语法如下:</span><br></pre></td></tr></table></figure></dest></src></li><li>COPY <src>… <dest></dest></src></li><li>COPY [“<src>“,… “<dest>“]<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><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><br><span class="line">与ADD的区别</span><br><span class="line"></span><br><span class="line">COPY的<src>只能是本地文件,其他用法一致</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#### ENTRYPOINT命令</span><br><span class="line"></span><br><span class="line">功能是启动时的默认命令</span><br><span class="line"></span><br><span class="line">语法如下:</span><br></pre></td></tr></table></figure></dest></src></li><li>ENTRYPOINT [“executable”, “param1”, “param2”]</li><li>ENTRYPOINT command param1 param2<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><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><br><span class="line">如果从上到下看到这里的话,那么你应该对这两种语法很熟悉啦。</span><br><span class="line"></span><br><span class="line">第二种就是写shell</span><br><span class="line"></span><br><span class="line">第一种就是可执行文件加参数</span><br><span class="line"></span><br><span class="line">与CMD比较说明(这俩命令太像了,而且还可以配合使用):</span><br><span class="line"></span><br><span class="line">1. 相同点:</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">2. 不同点:</span><br><span class="line"></span><br><span class="line">- ENTRYPOINT不会被运行的command覆盖,而CMD则会被覆盖</span><br><span class="line">- 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数</span><br><span class="line"></span><br><span class="line">如下:</span><br></pre></td></tr></table></figure>FROM ubuntu<br>ENTRYPOINT [“top”, “-b”]<br>CMD [“-c”]<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"></span><br><span class="line">- 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效</span><br><span class="line"></span><br><span class="line">如下:</span><br></pre></td></tr></table></figure>FROM ubuntu<br>ENTRYPOINT [“top”, “-b”]<br>CMD ls -al<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><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><br><span class="line">那么将执行ls -al ,top -b不会执行。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">Docker官方使用一张表格来展示了ENTRYPOINT 和CMD不同组合的执行情况</span><br><span class="line"></span><br><span class="line">(下方表格来自docker官网)</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"></span><br><span class="line">#### VOLUME命令</span><br><span class="line"></span><br><span class="line">可实现挂载功能,可以将内地文件夹或者其他容器种得文件夹挂在到这个容器种</span><br><span class="line"></span><br><span class="line">语法为:</span><br></pre></td></tr></table></figure>VOLUME [“/data”]<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"></span><br><span class="line">说明:</span><br><span class="line"></span><br><span class="line"> ["/data"]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的</span><br></pre></td></tr></table></figure>VOLUME [“/var/log/“]<br>VOLUME /var/log<br>VOLUME /var/log /var/db<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><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><br><span class="line">一般的使用场景为需要持久化存储数据时</span><br><span class="line"></span><br><span class="line">容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。</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"></span><br><span class="line">#### USER命令</span><br><span class="line"></span><br><span class="line">设置启动容器的用户,可以是用户名或UID,所以,只有下面的两种写法是正确的</span><br><span class="line"></span><br><span class="line">-</span><br></pre></td></tr></table></figure>USER daemo<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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure>USER UID<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><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">#### WORKDIR命令</span><br><span class="line"></span><br><span class="line">设置工作目录,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。</span><br><span class="line"></span><br><span class="line">语法:</span><br></pre></td></tr></table></figure>WORKDIR /path/to/workdir<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"></span><br><span class="line">如:</span><br></pre></td></tr></table></figure>WORKDIR /a<br>WORKDIR b<br>WORKDIR c<br>RUN pwd<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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">pwd执行的结果是/a/b/c</span><br><span class="line"></span><br><span class="line">WORKDIR也可以解析环境变量</span><br><span class="line"></span><br><span class="line">如:</span><br></pre></td></tr></table></figure>ENV DIRPATH /path<br>WORKDIR $DIRPATH/$DIRNAME<br>RUN pwd<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"></span><br><span class="line">pwd的执行结果是/path/$DIRNAME</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#### ARG命令</span><br><span class="line"></span><br><span class="line">语法:</span><br></pre></td></tr></table></figure>ARG <name>[=<default value>]<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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">设置变量命令,ARG命令定义了一个变量,在docker build创建镜像的时候,使用 --build-arg <varname>=<value>来指定参数</span><br><span class="line"></span><br><span class="line">如果用户在build镜像时指定了一个参数没有定义在Dockerfile种,那么将有一个Warning</span><br><span class="line"></span><br><span class="line">提示如下:</span><br></pre></td></tr></table></figure>[Warning] One or more build-args [foo] were not consumed.<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"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">我们可以定义一个或多个参数,如下:</span><br></pre></td></tr></table></figure>FROM busybox<br>ARG user1<br>ARG buildno<br>…<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"></span><br><span class="line">也可以给参数一个默认值:</span><br></pre></td></tr></table></figure>FROM busybox<br>ARG user1=someuser<br>ARG buildno=1<br>…<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"></span><br><span class="line">如果我们给了ARG定义的参数默认值,那么当build镜像时没有指定参数值,将会使用这个默认值</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#### ONBUILD命令</span><br><span class="line"></span><br><span class="line">语法:</span><br></pre></td></tr></table></figure>ONBUILD [INSTRUCTION]<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"></span><br><span class="line">这个命令只对当前镜像的子镜像生效。</span><br><span class="line"></span><br><span class="line">比如当前镜像为A,在Dockerfile种添加:</span><br></pre></td></tr></table></figure>ONBUILD RUN ls -al<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><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><br><span class="line">这个 ls -al 命令不会在A镜像构建或启动的时候执行</span><br><span class="line"></span><br><span class="line">此时有一个镜像B是基于A镜像构建的,那么这个ls -al 命令会在B镜像构建的时候被执行。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">#### STOPSIGNAL命令</span><br><span class="line"></span><br><span class="line">*STOPSIGNAL命令是的作用是当容器推出时给系统发送什么样的指令*</span><br><span class="line"></span><br><span class="line">语法:</span><br></pre></td></tr></table></figure>STOPSIGNAL signal<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"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#### HEALTHCHECK命令</span><br><span class="line"></span><br><span class="line">*容器健康状况检查命令*</span><br><span class="line"></span><br><span class="line">语法有两种:</span><br></pre></td></tr></table></figure></default></name></li><li>HEALTHCHECK [OPTIONS] CMD command</li><li>HEALTHCHECK NONE<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><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></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"> </span><br><span class="line"></span><br><span class="line">[OPTIONS]的选项支持以下三中选项:</span><br><span class="line"></span><br><span class="line"> ***--interval=DURATION 两次检查默认的时间间隔为30秒***</span><br><span class="line"></span><br><span class="line"> ***--timeout=DURATION 健康检查命令运行超时时长,默认30秒***</span><br><span class="line"></span><br><span class="line"> ***--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3***</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"></span><br><span class="line">HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下:</span><br><span class="line"></span><br><span class="line">***0: success - 表示容器是健康的***</span><br><span class="line"></span><br><span class="line">***1: unhealthy - 表示容器已经不能工作了***</span><br><span class="line"></span><br><span class="line">***2: reserved - 保留值***</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">例子:</span><br></pre></td></tr></table></figure>HEALTHCHECK –interval=5m –timeout=3s <br>CMD curl -f <a href="http://localhost/" target="_blank" rel="noopener">http://localhost/</a> || exit 1<pre><code></code></pre></li></ol><p>健康检查命令是:curl -f <a href="http://localhost/" target="_blank" rel="noopener">http://localhost/</a> || exit 1</p><p>两次检查的间隔时间是5秒</p><p>命令超时时间为3秒</p>]]></content>
<summary type="html"><h4 id="FROM命令"><a href="#FROM命令" class="headerlink" title="FROM命令"></a>FROM命令</h4><p>功能为指定基础镜像,并且必须是第一条指令。</p>
<p>如果不以任何镜像为基础,那么写法为:FROM sc</summary>
<category term="Docker" scheme="https://wicherqaq.github.io/tags/Docker/"/>
</entry>
<entry>
<title>LeetCode-283-移动0</title>
<link href="https://wicherqaq.github.io/2020/10/25/LeetCode-283-%E7%A7%BB%E5%8A%A80/"/>
<id>https://wicherqaq.github.io/2020/10/25/LeetCode-283-%E7%A7%BB%E5%8A%A80/</id>
<published>2020-10-25T02:27:53.000Z</published>
<updated>2020-10-25T02:29:34.042Z</updated>
<content type="html"><![CDATA[<p>给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。</p><p>示例:</p><p>输入: [0,1,0,3,12]<br>输出: [1,3,12,0,0]<br>说明:</p><p>必须在原数组上操作,不能拷贝额外的数组。<br>尽量减少操作次数。</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><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">class Solution(object):</span><br><span class="line"> def moveZeroes(self, nums):</span><br><span class="line"> """</span><br><span class="line"> :type nums: List[int]</span><br><span class="line"> :rtype: None Do not return anything, modify nums in-place instead.</span><br><span class="line"> """</span><br><span class="line"> # 0的个数</span><br><span class="line"> size = len(nums)</span><br><span class="line"> index = 0</span><br><span class="line"></span><br><span class="line"> for num in nums:</span><br><span class="line"> if num is not 0:</span><br><span class="line"> nums[index] = num</span><br><span class="line"> index+=1</span><br><span class="line"> </span><br><span class="line"> for i in range(size-index):</span><br><span class="line"> nums[index] = 0</span><br><span class="line"> index+=1</span><br></pre></td></tr></table></figure><h4 id="空间最优,操作局部优化(双指针)"><a href="#空间最优,操作局部优化(双指针)" class="headerlink" title="空间最优,操作局部优化(双指针)"></a>空间最优,操作局部优化(双指针)</h4><p>这种方法与上面的工作方式相同,即先满足一个需求,然后满足另一个需求。它以一种巧妙的方式做到了这一点。上述问题也可以用另一种方式描述,“将所有非 0 元素置于数组前面,保持它们的相对顺序相同”。<br>这是双指针的方法。由变量 “cur” 表示的快速指针负责处理新元素。如果新找到的元素不是 0,我们就在最后找到的非 0 元素之后记录它。最后找到的非 0 元素的位置由慢指针 “lastnonzerofoundat” 变量表示。当我们不断发现新的非 0 元素时,我们只是在 “lastnonzerofoundat+1” 第个索引处覆盖它们。此覆盖不会导致任何数据丢失,因为我们已经处理了其中的内容(如果它是非 0 的,则它现在已经写入了相应的索引,或者如果它是 0,则稍后将进行处理)。<br>在 “cur” 索引到达数组的末尾之后,我们现在知道所有非 0 元素都已按原始顺序移动到数组的开头。现在是时候满足其他要求了,“将所有 0 移动到末尾”。我们现在只需要在 “lastnonzerofoundat” 索引之后用 0 填充所有索引。</p><h4 id="复杂度分析"><a href="#复杂度分析" class="headerlink" title="复杂度分析"></a>复杂度分析</h4><p>时间复杂度:O(n)O(n)。但是,操作仍然是局部优化的。代码执行的总操作(数组写入)为 nn(元素总数)。<br>空间复杂度:O(1)O(1),只使用常量空间。</p>]]></content>
<summary type="html"><p>给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。</p>
<p>示例:</p>
<p>输入: [0,1,0,3,12]<br>输出: [1,3,12,0,0]<br>说明:</p>
<p>必须在原数组上操作,不能拷贝额外的数组。</summary>
<category term="LeetCode" scheme="https://wicherqaq.github.io/categories/LeetCode/"/>
</entry>
<entry>
<title>windows安装rabbitmq</title>
<link href="https://wicherqaq.github.io/2020/10/21/windows%E5%AE%89%E8%A3%85rabbitmq/"/>
<id>https://wicherqaq.github.io/2020/10/21/windows%E5%AE%89%E8%A3%85rabbitmq/</id>
<published>2020-10-21T02:49:39.000Z</published>
<updated>2020-10-21T02:54:40.505Z</updated>
<content type="html"><![CDATA[<h1 id="Windows安装RabbitMQ"><a href="#Windows安装RabbitMQ" class="headerlink" title="Windows安装RabbitMQ"></a>Windows安装RabbitMQ</h1><h4 id="第一步:下载并安装erlang"><a href="#第一步:下载并安装erlang" class="headerlink" title="第一步:下载并安装erlang"></a>第一步:下载并安装erlang</h4><ul><li><ul><li>原因:RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang。</li><li>下载地址:<a href="http://www.erlang.org/downloads" target="_blank" rel="noopener">http://www.erlang.org/downloads</a></li></ul></li></ul><p><img src="https://img2018.cnblogs.com/blog/773413/201910/773413-20191025144318759-1430833390.png" alt></p><p><img src="https://img2018.cnblogs.com/blog/773413/201910/773413-20191025144400115-2136772609.png" alt></p><ul><li>安装后要配置一下系统的环境变量。</li></ul><p>此电脑–>鼠标右键“属性”–>高级系统设置–>环境变量–>“新建”系统环境变量</p><p><img src="https://img-blog.csdn.net/20180208133656531?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM5NzM1OTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt></p><p>变量名:ERLANG_HOME</p><p>变量值就是刚才erlang的安装地址,点击确定。</p><p>然后双击系统变量path</p><p><img src="https://img-blog.csdn.net/20180208133941480?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM5NzM1OTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="img"></p><p>点击“新建”,将%ERLANG_HOME%\bin加入到path中。</p><p><img src="https://img-blog.csdn.net/20180208134038141?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM5NzM1OTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="img"></p><ul><li><p>最后windows键+R键,输入cmd,再输入erl,看到版本号就说明erlang安装成功了。</p></li><li></li></ul><h4 id="第二步:下载并安装RabbitMQ"><a href="#第二步:下载并安装RabbitMQ" class="headerlink" title="第二步:下载并安装RabbitMQ"></a>第二步:下载并安装RabbitMQ</h4><ul><li>下载地址:<a href="http://www.rabbitmq.com/download.html" target="_blank" rel="noopener">http://www.rabbitmq.com/download.html</a></li></ul><p><img src="https://img-blog.csdn.net/20180208140346384?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM5NzM1OTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="img"></p><ul><li>双击下载后的.exe文件,安装过程与erlang的安装过程相同。</li><li>RabbitMQ安装好后接下来安装RabbitMQ-Plugins。打开命令行cd,输入RabbitMQ的sbin目录。</li></ul><p>我的目录是:D:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.3\sbin</p><p>然后在后面输入rabbitmq-plugins enable rabbitmq_management命令进行安装</p><p><img src="https://img-blog.csdn.net/20180208141846581?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM5NzM1OTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="img"></p><p>打开命令行命令行,进入RabbitMQ的安装目录: sbin</p><p>,输入 rabbitmqctl status , 如果出现以下的图,说明安装是成功的,并且说明现在RabbitMQ Server已经启动了,运行正常。</p><p><a href="http://jingyan.baidu.com/album/a17d5285173ce68098c8f2e5.html?picindex=11" target="_blank" rel="noopener"><img src="https://imgsa.baidu.com/exp/w=500/sign=f02f000de2dde711e7d243f697efcef4/b03533fa828ba61e8d9e78274634970a304e5941.jpg" alt="RabbitMQ在windows下的安装"></a></p><p>打开sbin目录,双击rabbitmq-server.bat</p><p><img src="https://img-blog.csdn.net/2018020814402581?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM5NzM1OTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="img"></p><p>等几秒钟看到这个界面后,访问<a href="http://localhost:15672" target="_blank" rel="noopener">http://localhost:15672</a></p><p><img src="https://img-blog.csdn.net/20180208142631460?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM5NzM1OTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="img"></p><p>然后可以看到如下界面</p><p><img src="https://img-blog.csdn.net/20180208144226627?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM5NzM1OTIz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="img"></p><p>默认用户名和密码都是guest</p><p>登陆即可。</p>]]></content>
<summary type="html"><h1 id="Windows安装RabbitMQ"><a href="#Windows安装RabbitMQ" class="headerlink" title="Windows安装RabbitMQ"></a>Windows安装RabbitMQ</h1><h4 id="第一步:下</summary>
</entry>
<entry>
<title>python的切片操作</title>
<link href="https://wicherqaq.github.io/2020/10/07/python%E7%9A%84%E5%88%87%E7%89%87%E6%93%8D%E4%BD%9C/"/>
<id>https://wicherqaq.github.io/2020/10/07/python%E7%9A%84%E5%88%87%E7%89%87%E6%93%8D%E4%BD%9C/</id>
<published>2020-10-07T01:58:13.000Z</published>
<updated>2021-07-25T02:27:08.980Z</updated>
<content type="html"><![CDATA[<h4 id="写在前面:"><a href="#写在前面:" class="headerlink" title="写在前面:"></a>写在前面:</h4><p>利用python解决问题的过程中,经常会遇到从某个对象中抽取部分值的情况。“切片”操作正是专门用于实现这一目标的有力武器。理论上,只要条件表达式得当,可以通过单次或多次切片操作实现任意目标值切取。切片操作的基本语法比较简单,但如果不彻底搞清楚内在逻辑,也极容易产生错误,而且这种错误有时隐蔽得较深,难以察觉。本文通过详细例子总结归纳了切片操作的各种情形,下文均以list类型作为实验对象,其结论可推广至其他可切片对象。</p><h4 id="一、-Python可切片对象的索引方式"><a href="#一、-Python可切片对象的索引方式" class="headerlink" title="一、 Python可切片对象的索引方式"></a>一、 Python可切片对象的索引方式</h4><p>包括:正索引和负索引两部分,如下图所示,以list对象a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:</p><p><img src="https:////upload-images.jianshu.io/upload_images/14029140-3da45bbfe1029df4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/464/format/webp" alt="img"></p><p>python索引方式.jpg</p><h4 id="二、-Python切片操作的一般方式"><a href="#二、-Python切片操作的一般方式" class="headerlink" title="二、 Python切片操作的一般方式"></a>二、 Python切片操作的一般方式</h4><p>一个完整的切片表达式包含两个“:”,用于分隔三个参数(start_index、end_index、step)。当只有一个“:”时,默认第三个参数step=1;当一个“:”也没有时,start_index=end_index,表示切取start_index指定的那个元素。</p><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">切片操作基本表达式:<span class="keyword">object</span>[start_index:end_index:step]</span><br></pre></td></tr></table></figure><p>step:正负数均可,其绝对值大小决定了切取数据时的‘‘步长”,而正负号决定了“切取方向”,正表示“从左往右”取值,负表示“从右往左”取值。当step省略时,默认为1,即从左往右以步长1取值。“切取方向非常重要!”“切取方向非常重要!”“切取方向非常重要!”,重要的事情说三遍!</p><p>start_index:表示起始索引(包含该索引对应值);该参数省略时,表示从对象“端点”开始取值,至于是从“起点”还是从“终点”开始,则由step参数的正负决定,step为正从“起点”开始,为负从“终点”开始。</p><p>end_index:表示终止索引(不包含该索引对应值);该参数省略时,表示一直取到数据“端点”,至于是到“起点”还是到“终点”,同样由step参数的正负决定,step为正时直到“终点”,为负时直到“起点”。</p><h4 id="三、-Python切片操作详细例子"><a href="#三、-Python切片操作详细例子" class="headerlink" title="三、 Python切片操作详细例子"></a>三、 Python切片操作详细例子</h4><p>以下示例均以list对象a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]为例:</p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">>></span>>a = [<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></pre></td></tr></table></figure><h5 id="1-切取单个元素"><a href="#1-切取单个元素" class="headerlink" title="1. 切取单个元素"></a>1. 切取单个元素</h5><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">0</span>]</span><br><span class="line"><span class="meta">>></span>><span class="number">0</span></span><br><span class="line"><span class="meta">>></span>>a[-<span class="number">4</span>]</span><br><span class="line"><span class="meta">>></span>><span class="number">6</span></span><br><span class="line">当索引只有一个数时,表示切取某一个元素。</span><br></pre></td></tr></table></figure><h5 id="2-切取完整对象"><a href="#2-切取完整对象" class="headerlink" title="2. 切取完整对象"></a>2. 切取完整对象</h5><figure class="highlight ruby"><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="meta">>></span>>a[<span class="symbol">:</span>] <span class="comment">#从左往右</span></span><br><span class="line"><span class="meta">>></span>> [<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="meta">>></span>>a[<span class="symbol">:</span><span class="symbol">:</span>]<span class="comment">#从左往右</span></span><br><span class="line"><span class="meta">>></span>> [<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="meta">>></span>>a[<span class="symbol">:</span><span class="symbol">:-</span><span class="number">1</span>]<span class="comment">#从右往左</span></span><br><span class="line"><span class="meta">>></span>> [<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><h5 id="3-start-index和end-index全为正(-)索引的情况"><a href="#3-start-index和end-index全为正(-)索引的情况" class="headerlink" title="3. start_index和end_index全为正(+)索引的情况"></a>3. start_index和end_index全为正(+)索引的情况</h5><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">1</span><span class="symbol">:</span><span class="number">6</span>]</span><br><span class="line"><span class="meta">>></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><br><span class="line">step=<span class="number">1</span>,从左往右取值,start_index=<span class="number">1</span>到end_index=<span class="number">6</span>同样表示从左往右取值。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">1</span><span class="symbol">:</span><span class="number">6</span><span class="symbol">:-</span><span class="number">1</span>]</span><br><span class="line"><span class="meta">>></span>> []</span><br><span class="line">输出为空列表,说明没取到数据。</span><br><span class="line">step=-<span class="number">1</span>,决定了从右往左取值,而start_index=<span class="number">1</span>到end_index=<span class="number">6</span>决定了从左往右取值,两者矛盾,所以为空。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">6</span><span class="symbol">:</span><span class="number">2</span>]</span><br><span class="line"><span class="meta">>></span>> []</span><br><span class="line">同样输出为空列表。</span><br><span class="line">step=<span class="number">1</span>,决定了从左往右取值,而start_index=<span class="number">6</span>到end_index=<span class="number">2</span>决定了从右往左取值,两者矛盾,所以为空。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[<span class="symbol">:</span><span class="number">6</span>]</span><br><span class="line"><span class="meta">>></span>> [<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><br><span class="line">step=<span class="number">1</span>,表示从左往右取值,而start_index省略时,表示从端点开始,因此这里的端点是“起点”,即从“起点”值<span class="number">0</span>开始一直取到end_index=<span class="number">6</span>(该点不包括)。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[<span class="symbol">:</span><span class="number">6</span><span class="symbol">:-</span><span class="number">1</span>]</span><br><span class="line"><span class="meta">>></span>> [<span class="number">9</span>, <span class="number">8</span>, <span class="number">7</span>]</span><br><span class="line">step=-<span class="number">1</span>,从右往左取值,而start_index省略时,表示从端点开始,因此这里的端点是“终点”,即从“终点”值<span class="number">9</span>开始一直取到end_index=<span class="number">6</span>(该点不包括)。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">6</span><span class="symbol">:</span>]</span><br><span class="line"><span class="meta">>></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">step=<span class="number">1</span>,从左往右取值,从start_index=<span class="number">6</span>开始,一直取到“终点”值<span class="number">9</span>。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">6</span><span class="symbol">:</span><span class="symbol">:-</span><span class="number">1</span>]</span><br><span class="line"><span class="meta">>></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><span class="line">step=-<span class="number">1</span>,从右往左取值,从start_index=<span class="number">6</span>开始,一直取到“起点”<span class="number">0</span>。</span><br></pre></td></tr></table></figure><h5 id="4-start-index和end-index全为负(-)索引的情况"><a href="#4-start-index和end-index全为负(-)索引的情况" class="headerlink" title="4. start_index和end_index全为负(-)索引的情况"></a>4. start_index和end_index全为负(-)索引的情况</h5><figure class="highlight ruby"><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="meta">>></span>>a[-<span class="number">1</span><span class="symbol">:-</span><span class="number">6</span>]</span><br><span class="line"><span class="meta">>></span>> []</span><br><span class="line">step=<span class="number">1</span>,从左往右取值,而start_index=-<span class="number">1</span>到end_index=-<span class="number">6</span>决定了从右往左取值,两者矛盾,所以为空。</span><br><span class="line">索引-<span class="number">1</span>在-<span class="number">6</span>的右边(如上图)</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[-<span class="number">1</span><span class="symbol">:-</span><span class="number">6</span><span class="symbol">:-</span><span class="number">1</span>]</span><br><span class="line"><span class="meta">>></span>> [<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><br><span class="line">step=-<span class="number">1</span>,从右往左取值,start_index=-<span class="number">1</span>到end_index=-<span class="number">6</span>同样是从右往左取值。</span><br><span class="line">索引-<span class="number">1</span>在<span class="number">6</span>的右边(如上图)</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[-<span class="number">6</span><span class="symbol">:-</span><span class="number">1</span>]</span><br><span class="line"><span class="meta">>></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><br><span class="line">step=<span class="number">1</span>,从左往右取值,而start_index=-<span class="number">6</span>到end_index=-<span class="number">1</span>同样是从左往右取值。</span><br><span class="line">索引-<span class="number">6</span>在-<span class="number">1</span>的左边(如上图)</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[<span class="symbol">:-</span><span class="number">6</span>]</span><br><span class="line"><span class="meta">>></span>> [<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">step=<span class="number">1</span>,从左往右取值,从“起点”开始一直取到end_index=-<span class="number">6</span>(该点不包括)。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[<span class="symbol">:-</span><span class="number">6</span><span class="symbol">:-</span><span class="number">1</span>]</span><br><span class="line"><span class="meta">>></span>> [<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><br><span class="line">step=-<span class="number">1</span>,从右往左取值,从“终点”开始一直取到end_index=-<span class="number">6</span>(该点不包括)。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[-<span class="number">6</span><span class="symbol">:</span>]</span><br><span class="line"><span class="meta">>></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">step=<span class="number">1</span>,从左往右取值,从start_index=-<span class="number">6</span>开始,一直取到“终点”。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[-<span class="number">6</span><span class="symbol">:</span><span class="symbol">:-</span><span class="number">1</span>]</span><br><span class="line"><span class="meta">>></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><span class="line">step=-<span class="number">1</span>,从右往左取值,从start_index=-<span class="number">6</span>开始,一直取到“起点”。</span><br></pre></td></tr></table></figure><h5 id="5-start-index和end-index正(-)负(-)混合索引的情况"><a href="#5-start-index和end-index正(-)负(-)混合索引的情况" class="headerlink" title="5. start_index和end_index正(+)负(-)混合索引的情况"></a>5. start_index和end_index正(+)负(-)混合索引的情况</h5><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">1</span><span class="symbol">:-</span><span class="number">6</span>]</span><br><span class="line"><span class="meta">>></span>> [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">start_index=<span class="number">1</span>在end_index=-<span class="number">6</span>的左边,因此从左往右取值,而step=<span class="number">1</span>同样决定了从左往右取值,因此结果正确</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">1</span><span class="symbol">:-</span><span class="number">6</span><span class="symbol">:-</span><span class="number">1</span>]</span><br><span class="line"><span class="meta">>></span>> []</span><br><span class="line">start_index=<span class="number">1</span>在end_index=-<span class="number">6</span>的左边,因此从左往右取值,但step=-则决定了从右往左取值,两者矛盾,因此为空。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[-<span class="number">1</span><span class="symbol">:</span><span class="number">6</span>]</span><br><span class="line"><span class="meta">>></span>> []</span><br><span class="line">start_index=-<span class="number">1</span>在end_index=<span class="number">6</span>的右边,因此从右往左取值,但step=<span class="number">1</span>则决定了从左往右取值,两者矛盾,因此为空。</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>>a[-<span class="number">1</span><span class="symbol">:</span><span class="number">6</span><span class="symbol">:-</span><span class="number">1</span>]</span><br><span class="line"><span class="meta">>></span>> [<span class="number">9</span>, <span class="number">8</span>, <span class="number">7</span>]</span><br><span class="line">start_index=-<span class="number">1</span>在end_index=<span class="number">6</span>的右边,因此从右往左取值,而step=-<span class="number">1</span>同样决定了从右往左取值,因此结果正确。</span><br></pre></td></tr></table></figure><h5 id="6-多层切片操作"><a href="#6-多层切片操作" class="headerlink" title="6. 多层切片操作"></a>6. 多层切片操作</h5><figure class="highlight ruby"><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="meta">>></span>>a[<span class="symbol">:</span><span class="number">8</span>][<span class="number">2</span><span class="symbol">:</span><span class="number">5</span>][-<span class="number">1</span><span class="symbol">:</span>]</span><br><span class="line"><span class="meta">>></span>> [<span class="number">4</span>]</span><br><span class="line">相当于:</span><br><span class="line">a[<span class="symbol">:</span><span class="number">8</span>]=[<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><br><span class="line">a[<span class="symbol">:</span><span class="number">8</span>][<span class="number">2</span><span class="symbol">:</span><span class="number">5</span>]= [<span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line">a[<span class="symbol">:</span><span class="number">8</span>][<span class="number">2</span><span class="symbol">:</span><span class="number">5</span>][-<span class="number">1</span><span class="symbol">:</span>] = [<span class="number">4</span>]</span><br><span class="line">理论上可无限次多层切片操作,只要上一次返回的是非空可切片对象即可。</span><br></pre></td></tr></table></figure><h5 id="7-切片操作的三个参数可以用表达式"><a href="#7-切片操作的三个参数可以用表达式" class="headerlink" title="7. 切片操作的三个参数可以用表达式"></a>7. 切片操作的三个参数可以用表达式</h5><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">2</span>+<span class="number">1</span><span class="symbol">:</span><span class="number">3</span>*<span class="number">2</span><span class="symbol">:</span><span class="number">7</span>%<span class="number">3</span>]</span><br><span class="line"><span class="meta">>></span>> [<span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">即:a[<span class="number">2</span>+<span class="number">1</span><span class="symbol">:</span><span class="number">3</span>*<span class="number">2</span><span class="symbol">:</span><span class="number">7</span>%<span class="number">3</span>] = a[<span class="number">3</span><span class="symbol">:</span><span class="number">6</span><span class="symbol">:</span><span class="number">1</span>]</span><br></pre></td></tr></table></figure><h5 id="8-其他对象的切片操作"><a href="#8-其他对象的切片操作" class="headerlink" title="8. 其他对象的切片操作"></a>8. 其他对象的切片操作</h5><p>前面的切片操作以list对象为例进行说明,但实际上可进行切片操作的数据类型还有很多,包括元组、字符串等等。</p><figure class="highlight ruby"><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="meta">>></span>> (<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="symbol">:</span><span class="number">3</span>]</span><br><span class="line"><span class="meta">>></span>> (<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line">元组的切片操作</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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="meta">>></span>><span class="string">'ABCDEFG'</span>[<span class="symbol">:</span><span class="symbol">:</span><span class="number">2</span>]</span><br><span class="line"><span class="meta">>></span>><span class="string">'ACEG'</span></span><br><span class="line">字符串的切片操作</span><br></pre></td></tr></table></figure><figure class="highlight ruby"><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>>for i in range(<span class="number">1</span>,<span class="number">100</span>)[<span class="number">2</span><span class="symbol">:</span><span class="symbol">:</span><span class="number">3</span>][-<span class="number">5</span><span class="symbol">:</span>]: </span><br><span class="line"> print(i)</span><br><span class="line"><span class="meta">>></span>><span class="number">87</span></span><br><span class="line"><span class="number">90</span></span><br><span class="line"><span class="number">93</span></span><br><span class="line"><span class="number">96</span></span><br><span class="line"><span class="number">99</span></span><br><span class="line">就是利用range()函数生成<span class="number">1</span>-<span class="number">99</span>的整数,然后从start_index=<span class="number">2</span>(即<span class="number">3</span>)开始以step=<span class="number">3</span>取值,直到终点,再在新序列中取最后五个数。</span><br></pre></td></tr></table></figure><h4 id="四、-常用切片操作"><a href="#四、-常用切片操作" class="headerlink" title="四、 常用切片操作"></a>四、 常用切片操作</h4><h5 id="1-取偶数位置"><a href="#1-取偶数位置" class="headerlink" title="1.取偶数位置"></a>1.取偶数位置</h5><figure class="highlight ruby"><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="meta">>></span>>b = a[<span class="symbol">:</span><span class="symbol">:</span><span class="number">2</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></pre></td></tr></table></figure><h5 id="2-取奇数位置"><a href="#2-取奇数位置" class="headerlink" title="2.取奇数位置"></a>2.取奇数位置</h5><figure class="highlight ruby"><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="meta">>></span>>b = a[<span class="number">1</span><span class="symbol">:</span><span class="symbol">:</span><span class="number">2</span>]</span><br><span class="line">[<span class="number">1</span>, <span class="number">3</span>, <span class="number">5</span>, <span class="number">7</span>, <span class="number">9</span>]</span><br></pre></td></tr></table></figure><h5 id="3-拷贝整个对象"><a href="#3-拷贝整个对象" class="headerlink" title="3.拷贝整个对象"></a>3.拷贝整个对象</h5><figure class="highlight ruby"><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="meta">>></span>>b = a[<span class="symbol">:</span>] <span class="comment">#</span></span><br><span class="line"><span class="meta">>></span>>print(b) <span class="comment">#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</span></span><br><span class="line"><span class="meta">>></span>>print(id(a)) <span class="comment">#41946376</span></span><br><span class="line"><span class="meta">>></span>>print(id(b)) <span class="comment">#41921864</span></span><br><span class="line">或</span><br><span class="line"><span class="meta">>></span>>b = a.copy()</span><br><span class="line"><span class="meta">>></span>>print(b) <span class="comment">#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</span></span><br><span class="line"><span class="meta">>></span>>print(id(a)) <span class="comment">#39783752</span></span><br><span class="line"><span class="meta">>></span>>print(id(b)) <span class="comment">#39759176</span></span><br></pre></td></tr></table></figure><p>需要注意的是:<strong>[:]和.copy()都属于“浅拷贝”,只拷贝最外层元素,内层嵌套元素则通过引用方式共享,而非独立分配内存</strong>,如果需要彻底拷贝则需采用“深拷贝”方式,如下例所示:</p><figure class="highlight ruby"><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="meta">>></span>>a = [<span class="number">1</span>,<span class="number">2</span>,[<span class="string">'A'</span>,<span class="string">'B'</span>]]</span><br><span class="line"><span class="meta">>></span>>print(<span class="string">'a={}'</span>.format(a))</span><br><span class="line"><span class="meta">>></span>>b = a[<span class="symbol">:</span>]</span><br><span class="line"><span class="meta">>></span>>b[<span class="number">0</span>] = <span class="number">9</span> <span class="comment">#修改b的最外层元素,将1变成9</span></span><br><span class="line"><span class="meta">>></span>>b[<span class="number">2</span>][<span class="number">0</span>] = <span class="string">'D'</span> <span class="comment">#修改b的内嵌层元素</span></span><br><span class="line"><span class="meta">>></span>>print(<span class="string">'a={}'</span>.format(a))</span><br><span class="line"><span class="meta">>></span>>print(<span class="string">'b={}'</span>.format(b))</span><br><span class="line"><span class="meta">>></span>>print(<span class="string">'id(a)={}'</span>.format(id(a)))</span><br><span class="line"><span class="meta">>></span>>print(<span class="string">'id(b)={}'</span>.format(id(b)))</span><br><span class="line">a=[<span class="number">1</span>, <span class="number">2</span>, [<span class="string">'A'</span>, <span class="string">'B'</span>]] <span class="comment">#原始a</span></span><br><span class="line">a=[<span class="number">1</span>, <span class="number">2</span>, [<span class="string">'D'</span>, <span class="string">'B'</span>]] <span class="comment">#b修改内部元素A为D后,a中的A也变成了D,说明共享内部嵌套元素,但外部元素1没变。</span></span><br><span class="line">b=[<span class="number">9</span>, <span class="number">2</span>, [<span class="string">'D'</span>, <span class="string">'B'</span>]] <span class="comment">#修改后的b</span></span><br><span class="line">id(a)=<span class="number">38669128</span></span><br><span class="line">id(b)=<span class="number">38669192</span></span><br></pre></td></tr></table></figure><h5 id="4-修改单个元素"><a href="#4-修改单个元素" class="headerlink" title="4.修改单个元素"></a>4.修改单个元素</h5><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">3</span>] = [<span class="string">'A'</span>,<span class="string">'B'</span>]</span><br><span class="line">[<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, [<span class="string">'A'</span>, <span class="string">'B'</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></pre></td></tr></table></figure><h5 id="5-在某个位置插入元素"><a href="#5-在某个位置插入元素" class="headerlink" title="5.在某个位置插入元素"></a>5.在某个位置插入元素</h5><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">3</span><span class="symbol">:</span><span class="number">3</span>] = [<span class="string">'A'</span>,<span class="string">'B'</span>,<span class="string">'C'</span>]</span><br><span class="line">[<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="string">'A'</span>, <span class="string">'B'</span>, <span class="string">'C'</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="meta">>></span>>a[<span class="number">0</span><span class="symbol">:</span><span class="number">0</span>] = [<span class="string">'A'</span>,<span class="string">'B'</span>]</span><br><span class="line">[<span class="string">'A'</span>, <span class="string">'B'</span>, <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></pre></td></tr></table></figure><h5 id="6-替换一部分元素"><a href="#6-替换一部分元素" class="headerlink" title="6.替换一部分元素"></a>6.替换一部分元素</h5><figure class="highlight ruby"><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="meta">>></span>>a[<span class="number">3</span><span class="symbol">:</span><span class="number">6</span>] = [<span class="string">'A'</span>,<span class="string">'B'</span>]</span><br><span class="line">[<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="string">'A'</span>, <span class="string">'B'</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>]</span><br></pre></td></tr></table></figure><h4 id="五、-总结"><a href="#五、-总结" class="headerlink" title="五、 总结"></a>五、 总结</h4><p>(一)start_index、end_index、step三者可同为正、同为负,或正负混合。但必须遵循一个原则,即:当start_index表示的实际位置在end_index的左边时,从左往右取值,此时step必须是正数(同样表示从左往右);当start_index表示的实际位置在end_index的右边时,表示从右往左取值,此时step必须是负数(同样表示从右往左),即两者的取值顺序必须相同。</p><p>(二)当start_index或end_index省略时,取值的起始索引和终止索引由step的正负来决定,这种情况不会有取值方向矛盾(即不会返回空列表[]),但正和负取到的结果顺序是相反的,因为一个向左一个向右。</p><p>(三)step的正负是必须要考虑的,尤其是当step省略时。比如a[-1:],很容易就误认为是从“终点”开始一直取到“起点”,即a[-1:]= [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],但实际上a[-1:]=[9](注意不是9),原因在于step省略时step=1表示从左往右取值,而起始索引start_index=-1本身就是对象的最右边元素了,再往右已经没数据了,因此结果只含有9一个元素。</p><p>(四)需要注意:“取单个元素(不带“:”)”时,返回的是对象的某个元素,其类型由元素本身的类型决定,而与母对象无关,如上面的a[0]=0、a[-4]=6,元素0和6都是“数值型”,而母对象a却是“list”型;“取连续切片(带“:”)”时,返回结果的类型与母对象相同,哪怕切取的连续切片只包含一个元素,如上面的a[-1:]=[9],返回的是一个只包含元素“9”的list,而非数值型“9”。</p><p><a href="https://www.jianshu.com/p/15715d6f4dad" target="_blank" rel="noopener">原文链接</a></p>]]></content>
<summary type="html"><h4 id="写在前面:"><a href="#写在前面:" class="headerlink" title="写在前面:"></a>写在前面:</h4><p>利用python解决问题的过程中,经常会遇到从某个对象中抽取部分值的情况。“切片”操作正是专门用于实现这一目标的有力</summary>
<category term="python基础" scheme="https://wicherqaq.github.io/categories/python%E5%9F%BA%E7%A1%80/"/>
</entry>
<entry>
<title>清华开源镜像站的使用</title>
<link href="https://wicherqaq.github.io/2020/09/16/%E6%B8%85%E5%8D%8E%E5%BC%80%E6%BA%90%E9%95%9C%E5%83%8F%E7%AB%99%E7%9A%84%E4%BD%BF%E7%94%A8/"/>
<id>https://wicherqaq.github.io/2020/09/16/%E6%B8%85%E5%8D%8E%E5%BC%80%E6%BA%90%E9%95%9C%E5%83%8F%E7%AB%99%E7%9A%84%E4%BD%BF%E7%94%A8/</id>
<published>2020-09-16T07:17:43.000Z</published>
<updated>2020-09-16T07:19:43.477Z</updated>
<content type="html"><![CDATA[<p><a href="https://mirror.tuna.tsinghua.edu.cn/help/anaconda/" target="_blank" rel="noopener">源链接https://mirror.tuna.tsinghua.edu.cn/help/anaconda/</a></p><h2 id="Anaconda-镜像使用帮助"><a href="#Anaconda-镜像使用帮助" class="headerlink" title="Anaconda 镜像使用帮助"></a>Anaconda 镜像使用帮助</h2><p>Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。</p><p>Anaconda 安装包可以到 <a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/</a> 下载。</p><p>TUNA 还提供了 Anaconda 仓库与第三方源(conda-forge、msys2、pytorch等,<a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/" target="_blank" rel="noopener">查看完整列表</a>)的镜像,各系统都可以通过修改用户目录下的 <code>.condarc</code> 文件。Windows 用户无法直接创建名为 <code>.condarc</code> 的文件,可先执行 <code>conda config --set show_channel_urls yes</code> 生成该文件之后再修改。</p><p>注:由于更新过快难以同步,我们不同步<code>pytorch-nightly</code>, <code>pytorch-nightly-cpu</code>, <code>ignite-nightly</code>这三个包。</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><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">channels:</span><br><span class="line"> - defaults</span><br><span class="line">show_channel_urls: true</span><br><span class="line">channel_alias: https://mirrors.tuna.tsinghua.edu.cn/anaconda</span><br><span class="line">default_channels:</span><br><span class="line"> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main</span><br><span class="line"> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free</span><br><span class="line"> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r</span><br><span class="line"> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro</span><br><span class="line"> - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2</span><br><span class="line">custom_channels:</span><br><span class="line"> conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span><br><span class="line"> msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span><br><span class="line"> bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span><br><span class="line"> menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span><br><span class="line"> pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span><br><span class="line"> simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud</span><br></pre></td></tr></table></figure><p>即可添加 Anaconda Python 免费仓库。</p><p>运行 <code>conda clean -i</code> 清除索引缓存,保证用的是镜像站提供的索引。</p><p>运行 <code>conda create -n myenv numpy</code> 测试一下吧。</p><h2 id="Miniconda-镜像使用帮助"><a href="#Miniconda-镜像使用帮助" class="headerlink" title="Miniconda 镜像使用帮助"></a>Miniconda 镜像使用帮助</h2><p>Miniconda 是一个 Anaconda 的轻量级替代,默认只包含了 python 和 conda,但是可以通过 pip 和 conda 来安装所需要的包。</p><p>Miniconda 安装包可以到 <a href="https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/</a> 下载。</p><h3 id="其他三方源"><a href="#其他三方源" class="headerlink" title="其他三方源"></a>其他三方源</h3><p>对于conda的其他三方源,如有需要请修改<a href="https://github.com/tuna/tunasync-scripts/blob/master/anaconda.py" target="_blank" rel="noopener">anaconda.py</a>文件,并提交pull request,我们会综合考虑多方因素来酌情增减。</p>]]></content>
<summary type="html"><p><a href="https://mirror.tuna.tsinghua.edu.cn/help/anaconda/" target="_blank" rel="noopener">源链接https://mirror.tuna.tsinghua.edu.cn/help/a</summary>
<category term="机器学习" scheme="https://wicherqaq.github.io/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
<category term="环境搭建" scheme="https://wicherqaq.github.io/tags/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/"/>
</entry>
<entry>
<title>python入门(下)</title>
<link href="https://wicherqaq.github.io/2020/09/15/python%E5%85%A5%E9%97%A8%EF%BC%88%E4%B8%8B%EF%BC%89/"/>
<id>https://wicherqaq.github.io/2020/09/15/python%E5%85%A5%E9%97%A8%EF%BC%88%E4%B8%8B%EF%BC%89/</id>
<published>2020-09-15T01:12:47.000Z</published>
<updated>2020-09-15T01:13:22.273Z</updated>
<content type="html"><![CDATA[<h1 id="Python入门-下"><a href="#Python入门-下" class="headerlink" title="Python入门(下)"></a>Python入门(下)</h1><ol><li><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#简介" target="_blank" rel="noopener">简介</a></li><li><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#函数" target="_blank" rel="noopener">函数</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#函数的定义" target="_blank" rel="noopener">1. 函数的定义</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#函数的调用" target="_blank" rel="noopener">2. 函数的调用</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#函数文档" target="_blank" rel="noopener">3. 函数文档</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#函数参数" target="_blank" rel="noopener">4. 函数参数</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#函数的返回值" target="_blank" rel="noopener">5. 函数的返回值</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#变量作用域" target="_blank" rel="noopener">6. 变量作用域</a></li><li><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#Lambda-表达式" target="_blank" rel="noopener">Lambda-表达式</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#匿名函数的定义" target="_blank" rel="noopener">1. 匿名函数的定义</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#匿名函数的应用" target="_blank" rel="noopener">2. 匿名函数的应用</a></li><li><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#类与对象" target="_blank" rel="noopener">类与对象</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#属性和方法组成对象" target="_blank" rel="noopener">1. 属性和方法组成对象</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#self-是什么?" target="_blank" rel="noopener">2. self是什么?</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#Python-的魔法方法" target="_blank" rel="noopener">3. Python的魔法方法</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#公有和私有" target="_blank" rel="noopener">4. 公有和私有</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#继承" target="_blank" rel="noopener">5. 继承</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#组合" target="_blank" rel="noopener">6. 组合</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#类、类对象和实例对象" target="_blank" rel="noopener">7. 类、类对象和实例对象</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#什么是绑定?" target="_blank" rel="noopener">8. 什么是绑定?</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#一些相关的内置函数(BIF)" target="_blank" rel="noopener">9. 一些相关的内置函数(BIF)</a></li><li><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#魔法方法" target="_blank" rel="noopener">魔法方法</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#基本的魔法方法" target="_blank" rel="noopener">1. 基本的魔法方法</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#算术运算符" target="_blank" rel="noopener">2. 算术运算符</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#反算术运算符" target="_blank" rel="noopener">3. 反算术运算符</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#增量赋值运算符" target="_blank" rel="noopener">4. 增量赋值运算</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#一元运算符" target="_blank" rel="noopener">5. 一元运算符</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#属性访问" target="_blank" rel="noopener">6. 属性访问</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#描述符" target="_blank" rel="noopener">7. 描述符</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#定制序列" target="_blank" rel="noopener">8. 定制序列</a><br><a href="https://dsw2-dsw-d20200915091044ef48ed9fd208000141783-8888.pcs-gw-cn-shanghai.aliyun.com/lab#迭代器" target="_blank" rel="noopener">9. 迭代器</a></li></ol><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。本 Python 入门系列体验就是为这样的初学者精心准备的。</p><p>本实验包括以下内容:</p><ul><li>函数<ul><li>函数的定义</li><li>函数的调用</li><li>函数文档</li><li>函数参数</li><li>函数的返回值</li><li>变量作用域</li></ul></li><li>Lambda 表达式<ul><li>匿名函数的定义</li><li>匿名函数的应用</li></ul></li><li>类与对象<ul><li>对象 = 属性 + 方法</li><li>self 是什么?</li><li>Python 的魔法方法</li><li>公有和私有</li><li>继承</li><li>组合</li><li>类、类对象和实例对象</li><li>什么是绑定?</li><li>一些相关的内置函数(BIF)</li></ul></li><li>魔法方法<ul><li>基本的魔法方法</li><li>算术运算符</li><li>反算术运算符</li><li>增量赋值运算符</li><li>一元运算符</li><li>属性访问</li><li>描述符</li><li>定制序列</li><li>迭代器</li></ul></li></ul><h1 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h1><h2 id="函数的定义"><a href="#函数的定义" class="headerlink" title="函数的定义"></a>函数的定义</h2><p>还记得 Python 里面“万物皆对象”么?Python 把函数也当成对象,可以从另一个函数中返回出来而去构建高阶函数,比如: 参数是函数、返回值是函数。</p><p>我们首先来介绍函数的定义。</p><ul><li>函数以<code>def</code>关键词开头,后接函数名和圆括号()。</li><li>函数执行的代码以冒号起始,并且缩进。</li><li>return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回<code>None</code>。</li></ul><blockquote><p>def functionname (parameters):<br> “函数_文档字符串”<br> function_suite<br> return [expression]</p></blockquote><h2 id="函数的调用"><a href="#函数的调用" class="headerlink" title="函数的调用"></a>函数的调用</h2><p>【例子】</p><p>[1]:</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><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">def printme(str):</span><br><span class="line"> print(str)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">printme("我要调用用户自定义函数!") # 我要调用用户自定义函数!</span><br><span class="line">printme("再次调用同一函数") # 再次调用同一函数</span><br><span class="line">temp = printme('hello') # hello</span><br><span class="line">print(temp) # None</span><br><span class="line">我要调用用户自定义函数!</span><br><span class="line">再次调用同一函数</span><br><span class="line">hello</span><br><span class="line">None</span><br></pre></td></tr></table></figure><h2 id="函数文档"><a href="#函数文档" class="headerlink" title="函数文档"></a>函数文档</h2><p>[2]:</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><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">def MyFirstFunction(name):</span><br><span class="line"> "函数定义过程中name是形参"</span><br><span class="line"> # 因为Ta只是一个形式,表示占据一个参数位置</span><br><span class="line"> print('传递进来的{0}叫做实参,因为Ta是具体的参数值!'.format(name))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">MyFirstFunction('老马的程序人生') </span><br><span class="line"># 传递进来的老马的程序人生叫做实参,因为Ta是具体的参数值!</span><br><span class="line"></span><br><span class="line">print(MyFirstFunction.__doc__) </span><br><span class="line"># 函数定义过程中name是形参</span><br><span class="line"></span><br><span class="line">help(MyFirstFunction)</span><br><span class="line"># Help on function MyFirstFunction in module __main__:</span><br><span class="line"># MyFirstFunction(name)</span><br><span class="line"># 函数定义过程中name是形参</span><br><span class="line">传递进来的老马的程序人生叫做实参,因为Ta是具体的参数值!</span><br><span class="line">函数定义过程中name是形参</span><br><span class="line">Help on function MyFirstFunction in module __main__:</span><br><span class="line"></span><br><span class="line">MyFirstFunction(name)</span><br><span class="line"> 函数定义过程中name是形参</span><br></pre></td></tr></table></figure><h2 id="函数参数"><a href="#函数参数" class="headerlink" title="函数参数"></a>函数参数</h2><p>Python 的函数具有非常灵活多样的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。从简到繁的参数形态如下:</p><ul><li>位置参数 (positional argument)</li><li>默认参数 (default argument)</li><li>可变参数 (variable argument)</li><li>关键字参数 (keyword argument)</li><li>命名关键字参数 (name keyword argument)</li><li>参数组合</li></ul><p><strong>1. 位置参数</strong></p><blockquote><p>def functionname(arg1):<br> “函数_文档字符串”<br> function_suite<br> return [expression]</p></blockquote><ul><li><code>arg1</code> - 位置参数 ,这些参数在调用函数 (call function) 时位置要固定。</li></ul><p><strong>2. 默认参数</strong></p><blockquote><p>def functionname(arg1, arg2=v):<br> “函数_文档字符串”<br> function_suite<br> return [expression]</p></blockquote><ul><li><code>arg2 = v</code> - 默认参数 = 默认值,调用函数时,默认参数的值如果没有传入,则被认为是默认值。</li><li>默认参数一定要放在位置参数 <strong>后面</strong>,不然程序会报错。</li></ul><p>【例子】</p><p>[3]:</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><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">def printinfo(name, age=8):</span><br><span class="line"> print('Name:{0},Age:{1}'.format(name, age))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">printinfo('小马') # Name:小马,Age:8</span><br><span class="line">printinfo('小马', 10) # Name:小马,Age:10</span><br><span class="line">Name:小马,Age:8</span><br><span class="line">Name:小马,Age:10</span><br></pre></td></tr></table></figure><ul><li>Python 允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。</li></ul><p>【例子】</p><p>[4]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">def printinfo(name, age):</span><br><span class="line"> print('Name:{0},Age:{1}'.format(name, age))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">printinfo(age=8, name='小马') # Name:小马,Age:8</span><br><span class="line">Name:小马,Age:8</span><br></pre></td></tr></table></figure><p><strong>3. 可变参数</strong></p><p>顾名思义,可变参数就是传入的参数个数是可变的,可以是 0, 1, 2 到任意个,是不定长的参数。</p><blockquote><p>def functionname(arg1, arg2=v, *args):<br> “函数_文档字符串”<br> function_suite<br> return [expression]</p></blockquote><ul><li><code>*args</code> - 可变参数,可以是从零个到任意个,自动组装成元组。</li><li>加了星号(*)的变量名会存放所有未命名的变量参数。</li></ul><p>【例子】</p><p>[5]:</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><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">def printinfo(arg1, *args):</span><br><span class="line"> print(arg1)</span><br><span class="line"> for var in args:</span><br><span class="line"> print(var)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">printinfo(10) # 10</span><br><span class="line">printinfo(70, 60, 50)</span><br><span class="line"># 70</span><br><span class="line"># 60</span><br><span class="line"># 50</span><br><span class="line">10</span><br><span class="line">70</span><br><span class="line">60</span><br><span class="line">50</span><br></pre></td></tr></table></figure><p><strong>4. 关键字参数</strong></p><blockquote><p>def functionname(arg1, arg2=v, <em>args, *</em>kw):<br> “函数_文档字符串”<br> function_suite<br> return [expression]</p></blockquote><ul><li><code>**kw</code> - 关键字参数,可以是从零个到任意个,自动组装成字典。</li></ul><p>【例子】</p><p>[6]:</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><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">def printinfo(arg1, *args, **kwargs):</span><br><span class="line"> print(arg1)</span><br><span class="line"> print(args)</span><br><span class="line"> print(kwargs)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">printinfo(70, 60, 50)</span><br><span class="line"># 70</span><br><span class="line"># (60, 50)</span><br><span class="line"># {}</span><br><span class="line">printinfo(70, 60, 50, a=1, b=2)</span><br><span class="line"># 70</span><br><span class="line"># (60, 50)</span><br><span class="line"># {'a': 1, 'b': 2}</span><br><span class="line">70</span><br><span class="line">(60, 50)</span><br><span class="line">{}</span><br><span class="line">70</span><br><span class="line">(60, 50)</span><br><span class="line">{'a': 1, 'b': 2}</span><br></pre></td></tr></table></figure><p>「可变参数」和「关键字参数」的同异总结如下:</p><ul><li>可变参数允许传入零个到任意个参数,它们在函数调用时自动组装为一个元组 (tuple)。</li><li>关键字参数允许传入零个到任意个参数,它们在函数内部自动组装为一个字典 (dict)。</li></ul><p><strong>5. 命名关键字参数</strong></p><blockquote><p>def functionname(arg1, arg2=v, <em>args, \</em>, nkw, **kw):<br> “函数_文档字符串”<br> function_suite<br> return [expression]</p></blockquote><ul><li><code>*, nkw</code> - 命名关键字参数,用户想要输入的关键字参数,定义方式是在nkw 前面加个分隔符 <code>*</code>。</li><li>如果要限制关键字参数的名字,就可以用「命名关键字参数」</li><li>使用命名关键字参数时,要特别注意不能缺少参数名。</li></ul><p>【例子】</p><p>[8]:</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><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">def printinfo(arg1, *, nkw, **kwargs):</span><br><span class="line"> print(arg1)</span><br><span class="line"> print(nkw)</span><br><span class="line"> print(kwargs)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">printinfo(70, nkw=10, a=1, b=2)</span><br><span class="line"># 70</span><br><span class="line"># 10</span><br><span class="line"># {'a': 1, 'b': 2}</span><br><span class="line"></span><br><span class="line">printinfo(70, 10, a=1, b=2)</span><br><span class="line"># TypeError: printinfo() takes 1 positional argument but 2 were given</span><br><span class="line">70</span><br><span class="line">10</span><br><span class="line">{'a': 1, 'b': 2}</span><br></pre></td></tr></table></figure><ul><li>没有写参数名<code>nwk</code>,因此 10 被当成「位置参数」,而原函数只有 1 个位置函数,现在调用了 2 个,因此程序会报错。</li></ul><p><strong>6. 参数组合</strong></p><p>在 Python 中定义函数,可以用位置参数、默认参数、可变参数、命名关键字参数和关键字参数,这 5 种参数中的 4 个都可以一起使用,但是注意,参数定义的顺序必须是:</p><ul><li>位置参数、默认参数、可变参数和关键字参数。</li><li>位置参数、默认参数、命名关键字参数和关键字参数。</li></ul><p>要注意定义可变参数和关键字参数的语法:</p><ul><li><code>*args</code> 是可变参数,<code>args</code> 接收的是一个 <code>tuple</code></li><li><code>**kw</code> 是关键字参数,<code>kw</code> 接收的是一个 <code>dict</code></li></ul><p>命名关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。定义命名关键字参数不要忘了写分隔符 <code>*</code>,否则定义的是位置参数。</p><p>警告:虽然可以组合多达 5 种参数,但不要同时使用太多的组合,否则函数很难懂。</p><h2 id="函数的返回值"><a href="#函数的返回值" class="headerlink" title="函数的返回值"></a>函数的返回值</h2><p>【例子】</p><p>[9]:</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><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">def add(a, b):</span><br><span class="line"> return a + b</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(add(1, 2)) # 3</span><br><span class="line">print(add([1, 2, 3], [4, 5, 6])) # [1, 2, 3, 4, 5, 6]</span><br><span class="line">3</span><br><span class="line">[1, 2, 3, 4, 5, 6]</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[10]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">def back():</span><br><span class="line"> return [1, '小马的程序人生', 3.14]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(back()) # [1, '小马的程序人生', 3.14]</span><br><span class="line">[1, '小马的程序人生', 3.14]</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[11]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">def back():</span><br><span class="line"> return 1, '小马的程序人生', 3.14</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(back()) # (1, '小马的程序人生', 3.14)</span><br><span class="line">(1, '小马的程序人生', 3.14)</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[12]:</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><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">def printme(str):</span><br><span class="line"> print(str)</span><br><span class="line"></span><br><span class="line">temp = printme('hello') # hello</span><br><span class="line">print(temp) # None</span><br><span class="line">print(type(temp)) # <class 'NoneType'></span><br><span class="line">hello</span><br><span class="line">None</span><br><span class="line"><class 'NoneType'></span><br></pre></td></tr></table></figure><h2 id="变量作用域"><a href="#变量作用域" class="headerlink" title="变量作用域"></a>变量作用域</h2><ul><li>Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。</li><li>定义在函数内部的变量拥有局部作用域,该变量称为局部变量。</li><li>定义在函数外部的变量拥有全局作用域,该变量称为全局变量。</li><li>局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。</li></ul><p>【例子】</p><p>[13]:</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><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">def discounts(price, rate):</span><br><span class="line"> final_price = price * rate</span><br><span class="line"> return final_price</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">old_price = float(input('请输入原价:')) # 98</span><br><span class="line">rate = float(input('请输入折扣率:')) # 0.9</span><br><span class="line">new_price = discounts(old_price, rate)</span><br><span class="line">print('打折后价格是:%.2f' % new_price) # 88.20</span><br><span class="line">请输入原价:98</span><br><span class="line">请输入折扣率:0.9</span><br><span class="line">打折后价格是:88.20</span><br></pre></td></tr></table></figure><ul><li>当内部作用域想修改外部作用域的变量时,就要用到<code>global</code>和<code>nonlocal</code>关键字了。</li></ul><p>【例子】</p><p>[14]:</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><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">num = 1</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def fun1():</span><br><span class="line"> global num # 需要使用 global 关键字声明</span><br><span class="line"> print(num) # 1</span><br><span class="line"> num = 123</span><br><span class="line"> print(num) # 123</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">fun1()</span><br><span class="line">print(num) # 123</span><br><span class="line">1</span><br><span class="line">123</span><br><span class="line">123</span><br></pre></td></tr></table></figure><p><strong>内嵌函数</strong></p><p>【例子】</p><p>[15]:</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><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">def outer():</span><br><span class="line"> print('outer函数在这被调用')</span><br><span class="line"></span><br><span class="line"> def inner():</span><br><span class="line"> print('inner函数在这被调用')</span><br><span class="line"></span><br><span class="line"> inner() # 该函数只能在outer函数内部被调用</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">outer()</span><br><span class="line"># outer函数在这被调用</span><br><span class="line"># inner函数在这被调用</span><br><span class="line">outer函数在这被调用</span><br><span class="line">inner函数在这被调用</span><br></pre></td></tr></table></figure><p><strong>闭包</strong></p><ul><li>是函数式编程的一个重要的语法结构,是一种特殊的内嵌函数。</li><li>如果在一个内部函数里对外层非全局作用域的变量进行引用,那么内部函数就被认为是闭包。</li><li>通过闭包可以访问外层非全局作用域的变量,这个作用域称为 <strong>闭包作用域</strong>。</li></ul><p>【例子】</p><p>[16]:</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><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">def funX(x):</span><br><span class="line"> def funY(y):</span><br><span class="line"> return x * y</span><br><span class="line"></span><br><span class="line"> return funY</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">i = funX(8)</span><br><span class="line">print(type(i)) # <class 'function'></span><br><span class="line">print(i(5)) # 40</span><br><span class="line"><class 'function'></span><br><span class="line">40</span><br></pre></td></tr></table></figure><p>【例子】闭包的返回值通常是函数。</p><p>[17]:</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><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">def make_counter(init):</span><br><span class="line"> counter = [init]</span><br><span class="line"></span><br><span class="line"> def inc(): counter[0] += 1</span><br><span class="line"></span><br><span class="line"> def dec(): counter[0] -= 1</span><br><span class="line"></span><br><span class="line"> def get(): return counter[0]</span><br><span class="line"></span><br><span class="line"> def reset(): counter[0] = init</span><br><span class="line"></span><br><span class="line"> return inc, dec, get, reset</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">inc, dec, get, reset = make_counter(0)</span><br><span class="line">inc()</span><br><span class="line">inc()</span><br><span class="line">inc()</span><br><span class="line">print(get()) # 3</span><br><span class="line">dec()</span><br><span class="line">print(get()) # 2</span><br><span class="line">reset()</span><br><span class="line">print(get()) # 0</span><br><span class="line">3</span><br><span class="line">2</span><br><span class="line">0</span><br></pre></td></tr></table></figure><p>【例子】 如果要修改闭包作用域中的变量则需要 <code>nonlocal</code> 关键字</p><p>[18]:</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><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">def outer():</span><br><span class="line"> num = 10</span><br><span class="line"></span><br><span class="line"> def inner():</span><br><span class="line"> nonlocal num # nonlocal关键字声明</span><br><span class="line"> num = 100</span><br><span class="line"> print(num)</span><br><span class="line"></span><br><span class="line"> inner()</span><br><span class="line"> print(num)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">outer()</span><br><span class="line"></span><br><span class="line"># 100</span><br><span class="line"># 100</span><br><span class="line">100</span><br><span class="line">100</span><br></pre></td></tr></table></figure><p><strong>递归</strong></p><ul><li>如果一个函数在内部调用自身本身,这个函数就是递归函数。</li></ul><p>【例子】<code>n! = 1 x 2 x 3 x ... x n</code></p><p>[20]:</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><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><br><span class="line">n = 5</span><br><span class="line">for k in range(1, 5):</span><br><span class="line"> n = n * k</span><br><span class="line">print(n) # 120</span><br><span class="line"></span><br><span class="line"># 利用递归</span><br><span class="line">def factorial(n):</span><br><span class="line"> if n == 1:</span><br><span class="line"> return 1</span><br><span class="line"> return n * factorial(n - 1)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(factorial(5)) # 120</span><br><span class="line">120</span><br><span class="line">120</span><br></pre></td></tr></table></figure><p>【例子】斐波那契数列 <code>f(n)=f(n-1)+f(n-2), f(0)=0 f(1)=1</code></p><p>[21]:</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><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><br><span class="line">i = 0</span><br><span class="line">j = 1</span><br><span class="line">lst = list([i, j])</span><br><span class="line">for k in range(2, 11):</span><br><span class="line"> k = i + j</span><br><span class="line"> lst.append(k)</span><br><span class="line"> i = j</span><br><span class="line"> j = k</span><br><span class="line">print(lst) </span><br><span class="line"># [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]</span><br><span class="line"></span><br><span class="line"># 利用递归</span><br><span class="line">def recur_fibo(n):</span><br><span class="line"> if n <= 1:</span><br><span class="line"> return n</span><br><span class="line"> return recur_fibo(n - 1) + recur_fibo(n - 2)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">lst = list()</span><br><span class="line">for k in range(11):</span><br><span class="line"> lst.append(recur_fibo(k))</span><br><span class="line">print(lst) </span><br><span class="line"># [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]</span><br><span class="line">[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]</span><br><span class="line">[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]</span><br></pre></td></tr></table></figure><p>【例子】设置递归的层数,Python默认递归层数为 100</p><p>[22]:</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></pre></td><td class="code"><pre><span class="line">import sys</span><br><span class="line"></span><br><span class="line">sys.setrecursionlimit(1000)</span><br></pre></td></tr></table></figure><h1 id="Lambda-表达式"><a href="#Lambda-表达式" class="headerlink" title="Lambda 表达式"></a>Lambda 表达式</h1><h2 id="匿名函数的定义"><a href="#匿名函数的定义" class="headerlink" title="匿名函数的定义"></a>匿名函数的定义</h2><p>在 Python 里有两类函数:</p><ul><li>第一类:用 <code>def</code> 关键词定义的正规函数</li><li>第二类:用 <code>lambda</code> 关键词定义的匿名函数</li></ul><p>Python 使用 <code>lambda</code> 关键词来创建匿名函数,而非<code>def</code>关键词,它没有函数名,其语法结构如下:</p><blockquote><p>lambda argument_list: expression</p></blockquote><ul><li><code>lambda</code> - 定义匿名函数的关键词。</li><li><code>argument_list</code> - 函数参数,它们可以是位置参数、默认参数、关键字参数,和正规函数里的参数类型一样。</li><li><code>:</code>- 冒号,在函数参数和表达式中间要加个冒号。</li><li><code>expression</code> - 只是一个表达式,输入函数参数,输出一些值。</li></ul><p>注意:</p><ul><li><code>expression</code> 中没有 return 语句,因为 lambda 不需要它来返回,表达式本身结果就是返回值。</li><li>匿名函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。</li></ul><p>【例子】</p><p>[23]:</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><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">def sqr(x):</span><br><span class="line"> return x ** 2</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(sqr)</span><br><span class="line"># <function sqr at 0x000000BABD3A4400></span><br><span class="line"></span><br><span class="line">y = [sqr(x) for x in range(10)]</span><br><span class="line">print(y)</span><br><span class="line"># [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]</span><br><span class="line"></span><br><span class="line">lbd_sqr = lambda x: x ** 2</span><br><span class="line">print(lbd_sqr)</span><br><span class="line"># <function <lambda> at 0x000000BABB6AC1E0></span><br><span class="line"></span><br><span class="line">y = [lbd_sqr(x) for x in range(10)]</span><br><span class="line">print(y)</span><br><span class="line"># [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">sumary = lambda arg1, arg2: arg1 + arg2</span><br><span class="line">print(sumary(10, 20)) # 30</span><br><span class="line"></span><br><span class="line">func = lambda *args: sum(args)</span><br><span class="line">print(func(1, 2, 3, 4, 5)) # 15</span><br><span class="line"><function sqr at 0x00000220081D9E18></span><br><span class="line">[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]</span><br><span class="line"><function <lambda> at 0x00000220081FF400></span><br><span class="line">[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]</span><br><span class="line">30</span><br><span class="line">15</span><br></pre></td></tr></table></figure><h2 id="匿名函数的应用"><a href="#匿名函数的应用" class="headerlink" title="匿名函数的应用"></a>匿名函数的应用</h2><p>函数式编程 是指代码中每一块都是不可变的,都由纯函数的形式组成。这里的纯函数,是指函数本身相互独立、互不影响,对于相同的输入,总会有相同的输出,没有任何副作用。</p><p>【例子】非函数式编程</p><p>[24]:</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><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">def f(x):</span><br><span class="line"> for i in range(0, len(x)):</span><br><span class="line"> x[i] += 10</span><br><span class="line"> return x</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">x = [1, 2, 3]</span><br><span class="line">f(x)</span><br><span class="line">print(x)</span><br><span class="line"># [11, 12, 13]</span><br><span class="line">[11, 12, 13]</span><br></pre></td></tr></table></figure><p>【例子】函数式编程</p><p>[25]:</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><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">def f(x):</span><br><span class="line"> y = []</span><br><span class="line"> for item in x:</span><br><span class="line"> y.append(item + 10)</span><br><span class="line"> return y</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">x = [1, 2, 3]</span><br><span class="line">f(x)</span><br><span class="line">print(x)</span><br><span class="line"># [1, 2, 3]</span><br><span class="line">[1, 2, 3]</span><br></pre></td></tr></table></figure><p>匿名函数 常常应用于函数式编程的高阶函数 (high-order function)中,主要有两种形式:</p><ul><li>参数是函数 (filter, map)</li><li>返回值是函数 (closure)</li></ul><p>如,在 <code>filter</code>和<code>map</code>函数中的应用:</p><ul><li><code>filter(function, iterable)</code> 过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 <code>list()</code> 来转换。</li></ul><p>【例子】</p><p>[26]:</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">odd = lambda x: x % 2 == 1</span><br><span class="line">templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])</span><br><span class="line">print(list(templist)) # [1, 3, 5, 7, 9]</span><br><span class="line">[1, 3, 5, 7, 9]</span><br></pre></td></tr></table></figure><ul><li><code>map(function, *iterables)</code> 根据提供的函数对指定序列做映射。</li></ul><p>【例子】</p><p>[27]:</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><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">m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])</span><br><span class="line">print(list(m1)) </span><br><span class="line"># [1, 4, 9, 16, 25]</span><br><span class="line"></span><br><span class="line">m2 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])</span><br><span class="line">print(list(m2)) </span><br><span class="line"># [3, 7, 11, 15, 19]</span><br><span class="line">[1, 4, 9, 16, 25]</span><br><span class="line">[3, 7, 11, 15, 19]</span><br></pre></td></tr></table></figure><p>除了 Python 这些内置函数,我们也可以自己定义高阶函数。</p><p>【例子】</p><p>[28]:</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><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">def apply_to_list(fun, some_list):</span><br><span class="line"> return fun(some_list)</span><br><span class="line"></span><br><span class="line">lst = [1, 2, 3, 4, 5]</span><br><span class="line">print(apply_to_list(sum, lst))</span><br><span class="line"># 15</span><br><span class="line"></span><br><span class="line">print(apply_to_list(len, lst))</span><br><span class="line"># 5</span><br><span class="line"></span><br><span class="line">print(apply_to_list(lambda x: sum(x) / len(x), lst))</span><br><span class="line"># 3.0</span><br><span class="line">15</span><br><span class="line">5</span><br><span class="line">3.0</span><br></pre></td></tr></table></figure><h1 id="类与对象"><a href="#类与对象" class="headerlink" title="类与对象"></a>类与对象</h1><h2 id="对象-属性-方法"><a href="#对象-属性-方法" class="headerlink" title="对象 = 属性 + 方法"></a>对象 = 属性 + 方法</h2><p>对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含方法定义,而且还包含所有实例共享的数据。</p><ul><li>封装:信息隐蔽技术</li></ul><p>我们可以使用关键字 <code>class</code> 定义 Python 类,关键字后面紧跟类的名称、分号和类的实现。</p><p>【例子】</p><p>[31]:</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><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><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line">class Turtle: # Python中的类名约定以大写字母开头</span><br><span class="line"> """关于类的一个简单例子"""</span><br><span class="line"> # 属性</span><br><span class="line"> color = 'green'</span><br><span class="line"> weight = 10</span><br><span class="line"> legs = 4</span><br><span class="line"> shell = True</span><br><span class="line"> mouth = '大嘴'</span><br><span class="line"></span><br><span class="line"> # 方法</span><br><span class="line"> def climb(self):</span><br><span class="line"> print('我正在很努力的向前爬...')</span><br><span class="line"></span><br><span class="line"> def run(self):</span><br><span class="line"> print('我正在飞快的向前跑...')</span><br><span class="line"></span><br><span class="line"> def bite(self):</span><br><span class="line"> print('咬死你咬死你!!')</span><br><span class="line"></span><br><span class="line"> def eat(self):</span><br><span class="line"> print('有得吃,真满足...')</span><br><span class="line"></span><br><span class="line"> def sleep(self):</span><br><span class="line"> print('困了,睡了,晚安,zzz')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">tt = Turtle()</span><br><span class="line">print(tt)</span><br><span class="line"># <__main__.Turtle object at 0x0000007C32D67F98></span><br><span class="line"></span><br><span class="line">print(type(tt))</span><br><span class="line"># <class '__main__.Turtle'></span><br><span class="line"></span><br><span class="line">print(tt.__class__)</span><br><span class="line"># <class '__main__.Turtle'></span><br><span class="line"></span><br><span class="line">print(tt.__class__.__name__)</span><br><span class="line"># Turtle</span><br><span class="line"></span><br><span class="line">tt.climb()</span><br><span class="line"># 我正在很努力的向前爬...</span><br><span class="line"></span><br><span class="line">tt.run()</span><br><span class="line"># 我正在飞快的向前跑...</span><br><span class="line"></span><br><span class="line">tt.bite()</span><br><span class="line"># 咬死你咬死你!!</span><br><span class="line"></span><br><span class="line"># Python类也是对象。它们是type的实例</span><br><span class="line">print(type(Turtle))</span><br><span class="line"># <class 'type'></span><br><span class="line"><__main__.Turtle object at 0x000002200820E898></span><br><span class="line"><class '__main__.Turtle'></span><br><span class="line"><class '__main__.Turtle'></span><br><span class="line">Turtle</span><br><span class="line">我正在很努力的向前爬...</span><br><span class="line">我正在飞快的向前跑...</span><br><span class="line">咬死你咬死你!!</span><br><span class="line"><class 'type'></span><br></pre></td></tr></table></figure><ul><li>继承:子类自动共享父类之间数据和方法的机制</li></ul><p>【例子】</p><p>[32]:</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><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">class MyList(list):</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">lst = MyList([1, 5, 2, 7, 8])</span><br><span class="line">lst.append(9)</span><br><span class="line">lst.sort()</span><br><span class="line">print(lst)</span><br><span class="line"></span><br><span class="line"># [1, 2, 5, 7, 8, 9]</span><br><span class="line">[1, 2, 5, 7, 8, 9]</span><br></pre></td></tr></table></figure><ul><li>多态:不同对象对同一方法响应不同的行动</li></ul><p>【例子】</p><p>[33]:</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><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">class Animal:</span><br><span class="line"> def run(self):</span><br><span class="line"> raise AttributeError('子类必须实现这个方法')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class People(Animal):</span><br><span class="line"> def run(self):</span><br><span class="line"> print('人正在走')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Pig(Animal):</span><br><span class="line"> def run(self):</span><br><span class="line"> print('pig is walking')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Dog(Animal):</span><br><span class="line"> def run(self):</span><br><span class="line"> print('dog is running')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">def func(animal):</span><br><span class="line"> animal.run()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">func(Pig())</span><br><span class="line"># pig is walking</span><br><span class="line">pig is walking</span><br></pre></td></tr></table></figure><hr><h2 id="self-是什么?"><a href="#self-是什么?" class="headerlink" title="self 是什么?"></a>self 是什么?</h2><p>Python 的 <code>self</code> 相当于 C++ 的 <code>this</code> 指针。</p><p>【例子】</p><p>[34]:</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><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">class Test:</span><br><span class="line"> def prt(self):</span><br><span class="line"> print(self)</span><br><span class="line"> print(self.__class__)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">t = Test()</span><br><span class="line">t.prt()</span><br><span class="line"># <__main__.Test object at 0x000000BC5A351208></span><br><span class="line"># <class '__main__.Test'></span><br><span class="line"><__main__.Test object at 0x000002200820EA20></span><br><span class="line"><class '__main__.Test'></span><br></pre></td></tr></table></figure><p>类的方法与普通的函数只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身),按照惯例它的名称是 <code>self</code>。在调用方法时,我们无需明确提供与参数 <code>self</code> 相对应的参数。</p><p>【例子】</p><p>[35]:</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><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">class Ball:</span><br><span class="line"> def setName(self, name):</span><br><span class="line"> self.name = name</span><br><span class="line"></span><br><span class="line"> def kick(self):</span><br><span class="line"> print("我叫%s,该死的,谁踢我..." % self.name)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">a = Ball()</span><br><span class="line">a.setName("球A")</span><br><span class="line">b = Ball()</span><br><span class="line">b.setName("球B")</span><br><span class="line">c = Ball()</span><br><span class="line">c.setName("球C")</span><br><span class="line">a.kick()</span><br><span class="line"># 我叫球A,该死的,谁踢我...</span><br><span class="line">b.kick()</span><br><span class="line"># 我叫球B,该死的,谁踢我...</span><br><span class="line">我叫球A,该死的,谁踢我...</span><br><span class="line">我叫球B,该死的,谁踢我...</span><br></pre></td></tr></table></figure><hr><h2 id="Python-的魔法方法"><a href="#Python-的魔法方法" class="headerlink" title="Python 的魔法方法"></a>Python 的魔法方法</h2><p>据说,Python 的对象天生拥有一些神奇的方法,它们是面向对象的 Python 的一切…</p><p>它们是可以给你的类增加魔力的特殊方法…</p><p>如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,而这一切都是自动发生的…</p><p>类有一个名为<code>__init__(self[, param1, param2...])</code>的魔法方法,该方法在类实例化时会自动调用。</p><p>【例子】</p><p>[36]:</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><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><br><span class="line">class Ball:</span><br><span class="line"> def __init__(self, name):</span><br><span class="line"> self.name = name</span><br><span class="line"></span><br><span class="line"> def kick(self):</span><br><span class="line"> print("我叫%s,该死的,谁踢我..." % self.name)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">a = Ball("球A")</span><br><span class="line">b = Ball("球B")</span><br><span class="line">c = Ball("球C")</span><br><span class="line">a.kick()</span><br><span class="line"># 我叫球A,该死的,谁踢我...</span><br><span class="line">b.kick()</span><br><span class="line"># 我叫球B,该死的,谁踢我...</span><br><span class="line">我叫球A,该死的,谁踢我...</span><br><span class="line">我叫球B,该死的,谁踢我...</span><br></pre></td></tr></table></figure><hr><h2 id="公有和私有"><a href="#公有和私有" class="headerlink" title="公有和私有"></a>公有和私有</h2><p>在 Python 中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。</p><p>【例子】类的私有属性实例</p><p>[38]:</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><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">class JustCounter:</span><br><span class="line"> __secretCount = 0 # 私有变量</span><br><span class="line"> publicCount = 0 # 公开变量</span><br><span class="line"></span><br><span class="line"> def count(self):</span><br><span class="line"> self.__secretCount += 1</span><br><span class="line"> self.publicCount += 1</span><br><span class="line"> print(self.__secretCount)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">counter = JustCounter()</span><br><span class="line">counter.count() # 1</span><br><span class="line">counter.count() # 2</span><br><span class="line">print(counter.publicCount) # 2</span><br><span class="line"></span><br><span class="line"># Python的私有为伪私有</span><br><span class="line">print(counter._JustCounter__secretCount) # 2 </span><br><span class="line">print(counter.__secretCount) </span><br><span class="line"># AttributeError: 'JustCounter' object has no attribute '__secretCount'</span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">2</span><br><span class="line">2</span><br></pre></td></tr></table></figure><p>【例子】类的私有方法实例</p><p>[40]:</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><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></pre></td><td class="code"><pre><span class="line">class Site:</span><br><span class="line"> def __init__(self, name, url):</span><br><span class="line"> self.name = name # public</span><br><span class="line"> self.__url = url # private</span><br><span class="line"></span><br><span class="line"> def who(self):</span><br><span class="line"> print('name : ', self.name)</span><br><span class="line"> print('url : ', self.__url)</span><br><span class="line"></span><br><span class="line"> def __foo(self): # 私有方法</span><br><span class="line"> print('这是私有方法')</span><br><span class="line"></span><br><span class="line"> def foo(self): # 公共方法</span><br><span class="line"> print('这是公共方法')</span><br><span class="line"> self.__foo()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">x = Site('老马的程序人生', 'https://blog.csdn.net/LSGO_MYP')</span><br><span class="line">x.who()</span><br><span class="line"># name : 老马的程序人生</span><br><span class="line"># url : https://blog.csdn.net/LSGO_MYP</span><br><span class="line"></span><br><span class="line">x.foo()</span><br><span class="line"># 这是公共方法</span><br><span class="line"># 这是私有方法</span><br><span class="line"></span><br><span class="line">x.__foo()</span><br><span class="line"># AttributeError: 'Site' object has no attribute '__foo'</span><br><span class="line">name : 老马的程序人生</span><br><span class="line">url : https://blog.csdn.net/LSGO_MYP</span><br><span class="line">这是公共方法</span><br><span class="line">这是私有方法</span><br></pre></td></tr></table></figure><hr><h2 id="继承"><a href="#继承" class="headerlink" title="继承"></a>继承</h2><p>Python 同样支持类的继承,派生类的定义如下所示:</p><blockquote><p>class DerivedClassName(BaseClassName):<br> statement-1<br> .<br> .<br> .<br> statement-N</p></blockquote><p><code>BaseClassName</code>(基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:</p><blockquote><p>class DerivedClassName(modname.BaseClassName):<br> statement-1<br> .<br> .<br> .<br> statement-N</p></blockquote><p>【例子】如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。</p><p>[41]:</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><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></pre></td><td class="code"><pre><span class="line"># 类定义</span><br><span class="line">class people:</span><br><span class="line"> # 定义基本属性</span><br><span class="line"> name = ''</span><br><span class="line"> age = 0</span><br><span class="line"> # 定义私有属性,私有属性在类外部无法直接进行访问</span><br><span class="line"> __weight = 0</span><br><span class="line"></span><br><span class="line"> # 定义构造方法</span><br><span class="line"> def __init__(self, n, a, w):</span><br><span class="line"> self.name = n</span><br><span class="line"> self.age = a</span><br><span class="line"> self.__weight = w</span><br><span class="line"></span><br><span class="line"> def speak(self):</span><br><span class="line"> print("%s 说: 我 %d 岁。" % (self.name, self.age))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># 单继承示例</span><br><span class="line">class student(people):</span><br><span class="line"> grade = ''</span><br><span class="line"></span><br><span class="line"> def __init__(self, n, a, w, g):</span><br><span class="line"> # 调用父类的构函</span><br><span class="line"> people.__init__(self, n, a, w)</span><br><span class="line"> self.grade = g</span><br><span class="line"></span><br><span class="line"> # 覆写父类的方法</span><br><span class="line"> def speak(self):</span><br><span class="line"> print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">s = student('小马的程序人生', 10, 60, 3)</span><br><span class="line">s.speak()</span><br><span class="line"># 小马的程序人生 说: 我 10 岁了,我在读 3 年级</span><br><span class="line">小马的程序人生 说: 我 10 岁了,我在读 3 年级</span><br></pre></td></tr></table></figure><p>注意:如果上面的程序去掉:<code>people.__init__(self, n, a, w)</code>,则输出:<code>说: 我 0 岁了,我在读 3 年级</code>,因为子类的构造方法把父类的构造方法覆盖了。</p><p>【例子】</p><p>[43]:</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><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><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">import random</span><br><span class="line"></span><br><span class="line">class Fish:</span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.x = random.randint(0, 10)</span><br><span class="line"> self.y = random.randint(0, 10)</span><br><span class="line"></span><br><span class="line"> def move(self):</span><br><span class="line"> self.x -= 1</span><br><span class="line"> print("我的位置", self.x, self.y)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class GoldFish(Fish): # 金鱼</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Carp(Fish): # 鲤鱼</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Salmon(Fish): # 三文鱼</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Shark(Fish): # 鲨鱼</span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.hungry = True</span><br><span class="line"></span><br><span class="line"> def eat(self):</span><br><span class="line"> if self.hungry:</span><br><span class="line"> print("吃货的梦想就是天天有得吃!")</span><br><span class="line"> self.hungry = False</span><br><span class="line"> else:</span><br><span class="line"> print("太撑了,吃不下了!")</span><br><span class="line"> self.hungry = True</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">g = GoldFish()</span><br><span class="line">g.move() # 我的位置 9 4</span><br><span class="line">s = Shark()</span><br><span class="line">s.eat() # 吃货的梦想就是天天有得吃!</span><br><span class="line">s.move() </span><br><span class="line"># AttributeError: 'Shark' object has no attribute 'x'</span><br><span class="line">我的位置 3 8</span><br><span class="line">吃货的梦想就是天天有得吃!</span><br></pre></td></tr></table></figure><p>解决该问题可用以下两种方式:</p><ul><li>调用未绑定的父类方法<code>Fish.__init__(self)</code></li></ul><p>[44]:</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><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">class Shark(Fish): # 鲨鱼</span><br><span class="line"> def __init__(self):</span><br><span class="line"> Fish.__init__(self)</span><br><span class="line"> self.hungry = True</span><br><span class="line"></span><br><span class="line"> def eat(self):</span><br><span class="line"> if self.hungry:</span><br><span class="line"> print("吃货的梦想就是天天有得吃!")</span><br><span class="line"> self.hungry = False</span><br><span class="line"> else:</span><br><span class="line"> print("太撑了,吃不下了!")</span><br><span class="line"> self.hungry = True</span><br></pre></td></tr></table></figure><ul><li>使用super函数<code>super().__init__()</code></li></ul><p>[45]:</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><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">class Shark(Fish): # 鲨鱼</span><br><span class="line"> def __init__(self):</span><br><span class="line"> super().__init__()</span><br><span class="line"> self.hungry = True</span><br><span class="line"></span><br><span class="line"> def eat(self):</span><br><span class="line"> if self.hungry:</span><br><span class="line"> print("吃货的梦想就是天天有得吃!")</span><br><span class="line"> self.hungry = False</span><br><span class="line"> else:</span><br><span class="line"> print("太撑了,吃不下了!")</span><br><span class="line"> self.hungry = True</span><br></pre></td></tr></table></figure><p>Python 虽然支持多继承的形式,但我们一般不使用多继承,因为容易引起混乱。</p><blockquote><p>class DerivedClassName(Base1, Base2, Base3):<br> statement-1<br> .<br> .<br> .<br> statement-N</p></blockquote><p>需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,Python 从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含方法。</p><p>【例子】</p><p>[47]:</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><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><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"># 类定义</span><br><span class="line">class People:</span><br><span class="line"> # 定义基本属性</span><br><span class="line"> name = ''</span><br><span class="line"> age = 0</span><br><span class="line"> # 定义私有属性,私有属性在类外部无法直接进行访问</span><br><span class="line"> __weight = 0</span><br><span class="line"></span><br><span class="line"> # 定义构造方法</span><br><span class="line"> def __init__(self, n, a, w):</span><br><span class="line"> self.name = n</span><br><span class="line"> self.age = a</span><br><span class="line"> self.__weight = w</span><br><span class="line"></span><br><span class="line"> def speak(self):</span><br><span class="line"> print("%s 说: 我 %d 岁。" % (self.name, self.age))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># 单继承示例</span><br><span class="line">class Student(People):</span><br><span class="line"> grade = ''</span><br><span class="line"></span><br><span class="line"> def __init__(self, n, a, w, g):</span><br><span class="line"> # 调用父类的构函</span><br><span class="line"> People.__init__(self, n, a, w)</span><br><span class="line"> self.grade = g</span><br><span class="line"></span><br><span class="line"> # 覆写父类的方法</span><br><span class="line"> def speak(self):</span><br><span class="line"> print("%s 说: 我 %d 岁了,我在读 %d 年级" % (self.name, self.age, self.grade))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># 另一个类,多重继承之前的准备</span><br><span class="line">class Speaker:</span><br><span class="line"> topic = ''</span><br><span class="line"> name = ''</span><br><span class="line"></span><br><span class="line"> def __init__(self, n, t):</span><br><span class="line"> self.name = n</span><br><span class="line"> self.topic = t</span><br><span class="line"></span><br><span class="line"> def speak(self):</span><br><span class="line"> print("我叫 %s,我是一个演说家,我演讲的主题是 %s" % (self.name, self.topic))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># 多重继承</span><br><span class="line">class Sample01(Speaker, Student):</span><br><span class="line"> a = ''</span><br><span class="line"></span><br><span class="line"> def __init__(self, n, a, w, g, t):</span><br><span class="line"> Student.__init__(self, n, a, w, g)</span><br><span class="line"> Speaker.__init__(self, n, t)</span><br><span class="line"></span><br><span class="line"># 方法名同,默认调用的是在括号中排前地父类的方法</span><br><span class="line">test = Sample01("Tim", 25, 80, 4, "Python")</span><br><span class="line">test.speak() </span><br><span class="line"># 我叫 Tim,我是一个演说家,我演讲的主题是 Python</span><br><span class="line"></span><br><span class="line">class Sample02(Student, Speaker):</span><br><span class="line"> a = ''</span><br><span class="line"></span><br><span class="line"> def __init__(self, n, a, w, g, t):</span><br><span class="line"> Student.__init__(self, n, a, w, g)</span><br><span class="line"> Speaker.__init__(self, n, t)</span><br><span class="line"></span><br><span class="line"># 方法名同,默认调用的是在括号中排前地父类的方法</span><br><span class="line">test = Sample02("Tim", 25, 80, 4, "Python")</span><br><span class="line">test.speak() </span><br><span class="line"># Tim 说: 我 25 岁了,我在读 4 年级</span><br><span class="line">我叫 Tim,我是一个演说家,我演讲的主题是 Python</span><br><span class="line">Tim 说: 我 25 岁了,我在读 4 年级</span><br></pre></td></tr></table></figure><h2 id="组合"><a href="#组合" class="headerlink" title="组合"></a>组合</h2><p>【例子】</p><p>[48]:</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><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">class Turtle:</span><br><span class="line"> def __init__(self, x):</span><br><span class="line"> self.num = x</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Fish:</span><br><span class="line"> def __init__(self, x):</span><br><span class="line"> self.num = x</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Pool:</span><br><span class="line"> def __init__(self, x, y):</span><br><span class="line"> self.turtle = Turtle(x)</span><br><span class="line"> self.fish = Fish(y)</span><br><span class="line"></span><br><span class="line"> def print_num(self):</span><br><span class="line"> print("水池里面有乌龟%s只,小鱼%s条" % (self.turtle.num, self.fish.num))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">p = Pool(2, 3)</span><br><span class="line">p.print_num()</span><br><span class="line"># 水池里面有乌龟2只,小鱼3条</span><br><span class="line">水池里面有乌龟2只,小鱼3条</span><br></pre></td></tr></table></figure><h2 id="类、类对象和实例对象"><a href="#类、类对象和实例对象" class="headerlink" title="类、类对象和实例对象"></a>类、类对象和实例对象</h2><p><img src="https://img-blog.csdnimg.cn/20191007090316462.png" alt="类对象和实例对象"></p><p>类对象:创建一个类,其实也是一个对象也在内存开辟了一块空间,称为类对象,类对象只有一个。</p><blockquote><p>class A(object):<br> pass</p></blockquote><p>实例对象:就是通过实例化类创建的对象,称为实例对象,实例对象可以有多个。</p><p>【例子】</p><p>[49]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">class A(object):</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"># 实例化对象 a、b、c都属于实例对象。</span><br><span class="line">a = A()</span><br><span class="line">b = A()</span><br><span class="line">c = A()</span><br></pre></td></tr></table></figure><p>类属性:类里面方法外面定义的变量称为类属性。类属性所属于类对象并且多个实例对象之间共享同一个类属性,说白了就是类属性所有的通过该类实例化的对象都能共享。</p><p>【例子】</p><p>[3]:</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">class A():</span><br><span class="line"> a = 0 #类属性</span><br><span class="line"> def __init__(self, xx):</span><br><span class="line"> A.a = xx #使用类属性可以通过 (类名.类属性)调用。</span><br></pre></td></tr></table></figure><p>实例属性:实例属性和具体的某个实例对象有关系,并且一个实例对象和另外一个实例对象是不共享属性的,说白了实例属性只能在自己的对象里面使用,其他的对象不能直接使用,因为<code>self</code>是谁调用,它的值就属于该对象。</p><p>【例子】</p><p>[56]:</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><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><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"># 创建类对象</span><br><span class="line">class Test(object):</span><br><span class="line"> class_attr = 100 # 类属性</span><br><span class="line"></span><br><span class="line"> def __init__(self):</span><br><span class="line"> self.sl_attr = 100 # 实例属性</span><br><span class="line"></span><br><span class="line"> def func(self):</span><br><span class="line"> print('类对象.类属性的值:', Test.class_attr) # 调用类属性</span><br><span class="line"> print('self.类属性的值', self.class_attr) # 相当于把类属性 变成实例属性</span><br><span class="line"> print('self.实例属性的值', self.sl_attr) # 调用实例属性</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">a = Test()</span><br><span class="line">a.func()</span><br><span class="line"></span><br><span class="line"># 类对象.类属性的值: 100</span><br><span class="line"># self.类属性的值 100</span><br><span class="line"># self.实例属性的值 100</span><br><span class="line"></span><br><span class="line">b = Test()</span><br><span class="line">b.func()</span><br><span class="line"></span><br><span class="line"># 类对象.类属性的值: 100</span><br><span class="line"># self.类属性的值 100</span><br><span class="line"># self.实例属性的值 100</span><br><span class="line"></span><br><span class="line">a.class_attr = 200</span><br><span class="line">a.sl_attr = 200</span><br><span class="line">a.func()</span><br><span class="line"></span><br><span class="line"># 类对象.类属性的值: 100</span><br><span class="line"># self.类属性的值 200</span><br><span class="line"># self.实例属性的值 200</span><br><span class="line"></span><br><span class="line">b.func()</span><br><span class="line"></span><br><span class="line"># 类对象.类属性的值: 100</span><br><span class="line"># self.类属性的值 100</span><br><span class="line"># self.实例属性的值 100</span><br><span class="line"></span><br><span class="line">Test.class_attr = 300</span><br><span class="line">a.func()</span><br><span class="line"></span><br><span class="line"># 类对象.类属性的值: 300</span><br><span class="line"># self.类属性的值 200</span><br><span class="line"># self.实例属性的值 200</span><br><span class="line"></span><br><span class="line">b.func()</span><br><span class="line"># 类对象.类属性的值: 300</span><br><span class="line"># self.类属性的值 300</span><br><span class="line"># self.实例属性的值 100</span><br><span class="line">类对象.类属性的值: 100</span><br><span class="line">self.类属性的值 100</span><br><span class="line">self.实例属性的值 100</span><br><span class="line">类对象.类属性的值: 100</span><br><span class="line">self.类属性的值 100</span><br><span class="line">self.实例属性的值 100</span><br><span class="line">类对象.类属性的值: 100</span><br><span class="line">self.类属性的值 200</span><br><span class="line">self.实例属性的值 200</span><br><span class="line">类对象.类属性的值: 100</span><br><span class="line">self.类属性的值 100</span><br><span class="line">self.实例属性的值 100</span><br><span class="line">类对象.类属性的值: 300</span><br><span class="line">self.类属性的值 200</span><br><span class="line">self.实例属性的值 200</span><br><span class="line">类对象.类属性的值: 300</span><br><span class="line">self.类属性的值 300</span><br><span class="line">self.实例属性的值 100</span><br></pre></td></tr></table></figure><p>注意:属性与方法名相同,属性会覆盖方法。</p><p>【例子】</p><p>[57]:</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><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">class A:</span><br><span class="line"> def x(self):</span><br><span class="line"> print('x_man')</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">aa = A()</span><br><span class="line">aa.x() # x_man</span><br><span class="line">aa.x = 1</span><br><span class="line">print(aa.x) # 1</span><br><span class="line">aa.x()</span><br><span class="line"># TypeError: 'int' object is not callable</span><br><span class="line">x_man</span><br><span class="line">1</span><br></pre></td></tr></table></figure><h2 id="什么是绑定?"><a href="#什么是绑定?" class="headerlink" title="什么是绑定?"></a>什么是绑定?</h2><p>Python 严格要求方法需要有实例才能被调用,这种限制其实就是 Python 所谓的绑定概念。</p><p>Python 对象的数据属性通常存储在名为<code>.__ dict__</code>的字典中,我们可以直接访问<code>__dict__</code>,或利用 Python 的内置函数<code>vars()</code>获取<code>.__ dict__</code>。</p><p>【例子】</p><p>[58]:</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><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></pre></td><td class="code"><pre><span class="line">class CC:</span><br><span class="line"> def setXY(self, x, y):</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"> def printXY(self):</span><br><span class="line"> print(self.x, self.y)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">dd = CC()</span><br><span class="line">print(dd.__dict__)</span><br><span class="line"># {}</span><br><span class="line"></span><br><span class="line">print(vars(dd))</span><br><span class="line"># {}</span><br><span class="line"></span><br><span class="line">print(CC.__dict__)</span><br><span class="line"># {'__module__': '__main__', 'setXY': <function CC.setXY at 0x000000C3473DA048>, 'printXY': <function CC.printXY at 0x000000C3473C4F28>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}</span><br><span class="line"></span><br><span class="line">dd.setXY(4, 5)</span><br><span class="line">print(dd.__dict__)</span><br><span class="line"># {'x': 4, 'y': 5}</span><br><span class="line"></span><br><span class="line">print(vars(CC))</span><br><span class="line"># {'__module__': '__main__', 'setXY': <function CC.setXY at 0x000000632CA9B048>, 'printXY': <function CC.printXY at 0x000000632CA83048>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}</span><br><span class="line"></span><br><span class="line">print(CC.__dict__)</span><br><span class="line"># {'__module__': '__main__', 'setXY': <function CC.setXY at 0x000000632CA9B048>, 'printXY': <function CC.printXY at 0x000000632CA83048>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}</span><br><span class="line">{}</span><br><span class="line">{}</span><br><span class="line">{'__module__': '__main__', 'setXY': <function CC.setXY at 0x000002200822BD08>, 'printXY': <function CC.printXY at 0x000002200822BF28>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}</span><br><span class="line">{'x': 4, 'y': 5}</span><br><span class="line">{'__module__': '__main__', 'setXY': <function CC.setXY at 0x000002200822BD08>, 'printXY': <function CC.printXY at 0x000002200822BF28>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}</span><br><span class="line">{'__module__': '__main__', 'setXY': <function CC.setXY at 0x000002200822BD08>, 'printXY': <function CC.printXY at 0x000002200822BF28>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}</span><br></pre></td></tr></table></figure><h2 id="一些相关的内置函数(BIF)"><a href="#一些相关的内置函数(BIF)" class="headerlink" title="一些相关的内置函数(BIF)"></a>一些相关的内置函数(BIF)</h2><ul><li><code>issubclass(class, classinfo)</code> 方法用于判断参数 class 是否是类型参数 classinfo 的子类。</li><li>一个类被认为是其自身的子类。</li><li><code>classinfo</code>可以是类对象的元组,只要class是其中任何一个候选类的子类,则返回<code>True</code>。</li></ul><p>【例子】</p><p>[59]:</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><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">class A:</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class B(A):</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(issubclass(B, A)) # True</span><br><span class="line">print(issubclass(B, B)) # True</span><br><span class="line">print(issubclass(A, B)) # False</span><br><span class="line">print(issubclass(B, object)) # True</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">False</span><br><span class="line">True</span><br></pre></td></tr></table></figure><ul><li><code>isinstance(object, classinfo)</code> 方法用于判断一个对象是否是一个已知的类型,类似<code>type()</code>。</li><li><code>type()</code>不会认为子类是一种父类类型,不考虑继承关系。</li><li><code>isinstance()</code>会认为子类是一种父类类型,考虑继承关系。</li><li>如果第一个参数不是对象,则永远返回<code>False</code>。</li><li>如果第二个参数不是类或者由类对象组成的元组,会抛出一个<code>TypeError</code>异常。</li></ul><p>【例子】</p><p>[60]:</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><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></pre></td><td class="code"><pre><span class="line">a = 2</span><br><span class="line">print(isinstance(a, int)) # True</span><br><span class="line">print(isinstance(a, str)) # False</span><br><span class="line">print(isinstance(a, (str, int, list))) # True</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class A:</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class B(A):</span><br><span class="line"> pass</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(isinstance(A(), A)) # True</span><br><span class="line">print(type(A()) == A) # True</span><br><span class="line">print(isinstance(B(), A)) # True</span><br><span class="line">print(type(B()) == A) # False</span><br><span class="line">True</span><br><span class="line">False</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">False</span><br></pre></td></tr></table></figure><ul><li><code>hasattr(object, name)</code>用于判断对象是否包含对应的属性。</li></ul><p>【例子】</p><p>[61]:</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><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">class Coordinate:</span><br><span class="line"> x = 10</span><br><span class="line"> y = -5</span><br><span class="line"> z = 0</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point1 = Coordinate()</span><br><span class="line">print(hasattr(point1, 'x')) # True</span><br><span class="line">print(hasattr(point1, 'y')) # True</span><br><span class="line">print(hasattr(point1, 'z')) # True</span><br><span class="line">print(hasattr(point1, 'no')) # False</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">False</span><br></pre></td></tr></table></figure><ul><li><code>getattr(object, name[, default])</code>用于返回一个对象属性值。</li></ul><p>【例子】</p><p>[63]:</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><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">class A(object):</span><br><span class="line"> bar = 1</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">a = A()</span><br><span class="line">print(getattr(a, 'bar')) # 1</span><br><span class="line">print(getattr(a, 'bar2', 3)) # 3</span><br><span class="line">print(getattr(a, 'bar2'))</span><br><span class="line"># AttributeError: 'A' object has no attribute 'bar2'</span><br><span class="line">1</span><br><span class="line">3</span><br></pre></td></tr></table></figure><p>【例子】这个例子很酷!</p><p>[64]:</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><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">class A(object):</span><br><span class="line"> def set(self, a, b):</span><br><span class="line"> x = a</span><br><span class="line"> a = b</span><br><span class="line"> b = x</span><br><span class="line"> print(a, b)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">a = A()</span><br><span class="line">c = getattr(a, 'set')</span><br><span class="line">c(a='1', b='2') # 2 1</span><br><span class="line"></span><br><span class="line">2 1</span><br></pre></td></tr></table></figure><ul><li><code>setattr(object, name, value)</code>对应函数 <code>getattr()</code>,用于设置属性值,该属性不一定是存在的。</li></ul><p>【例子】</p><p>[65]:</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><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">class A(object):</span><br><span class="line"> bar = 1</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">a = A()</span><br><span class="line">print(getattr(a, 'bar')) # 1</span><br><span class="line">setattr(a, 'bar', 5)</span><br><span class="line">print(a.bar) # 5</span><br><span class="line">setattr(a, "age", 28)</span><br><span class="line">print(a.age) # 28</span><br><span class="line">1</span><br><span class="line">5</span><br><span class="line">28</span><br></pre></td></tr></table></figure><ul><li><code>delattr(object, name)</code>用于删除属性。</li></ul><p>【例子】</p><p>[66]:</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><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">class Coordinate:</span><br><span class="line"> x = 10</span><br><span class="line"> y = -5</span><br><span class="line"> z = 0</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">point1 = Coordinate()</span><br><span class="line"></span><br><span class="line">print('x = ', point1.x) # x = 10</span><br><span class="line">print('y = ', point1.y) # y = -5</span><br><span class="line">print('z = ', point1.z) # z = 0</span><br><span class="line"></span><br><span class="line">delattr(Coordinate, 'z')</span><br><span class="line"></span><br><span class="line">print('--删除 z 属性后--') # --删除 z 属性后--</span><br><span class="line">print('x = ', point1.x) # x = 10</span><br><span class="line">print('y = ', point1.y) # y = -5</span><br><span class="line"></span><br><span class="line"># 触发错误</span><br><span class="line">print('z = ', point1.z)</span><br><span class="line"># AttributeError: 'Coordinate' object has no attribute 'z'</span><br><span class="line">x = 10</span><br><span class="line">y = -5</span><br><span class="line">z = 0</span><br><span class="line">--删除 z 属性后--</span><br><span class="line">x = 10</span><br><span class="line">y = -5</span><br></pre></td></tr></table></figure><ul><li><pre><code>class property([fget[, fset[, fdel[, doc]]]])<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><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><br><span class="line"> 用于在新式类中返回属性值。</span><br><span class="line"></span><br><span class="line"> - `fget` -- 获取属性值的函数</span><br><span class="line"> - `fset` -- 设置属性值的函数</span><br><span class="line"> - `fdel` -- 删除属性值函数</span><br><span class="line"> - `doc` -- 属性描述信息</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[67]:</span><br></pre></td></tr></table></figure>class C(object): def __init__(self): self.__x = None def getx(self): return self.__x def setx(self, value): self.__x = value def delx(self): del self.__x x = property(getx, setx, delx, "I'm the 'x' property.")</code></pre></li></ul><p>cc = C()<br>cc.x = 2<br>print(cc.x) # 2</p><p>del cc.x<br>print(cc.x)</p><h1 id="AttributeError-‘C’-object-has-no-attribute-‘-C-x’"><a href="#AttributeError-‘C’-object-has-no-attribute-‘-C-x’" class="headerlink" title="AttributeError: ‘C’ object has no attribute ‘_C__x’"></a>AttributeError: ‘C’ object has no attribute ‘_C__x’</h1><p>2</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><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><br><span class="line"># 魔法方法</span><br><span class="line"></span><br><span class="line">魔法方法总是被双下划线包围,例如`__init__`。</span><br><span class="line"></span><br><span class="line">魔法方法是面向对象的 Python 的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的 Python 的强大。</span><br><span class="line"></span><br><span class="line">魔法方法的“魔力”体现在它们总能够在适当的时候被自动调用。</span><br><span class="line"></span><br><span class="line">魔法方法的第一个参数应为`cls`(类方法) 或者`self`(实例方法)。</span><br><span class="line"></span><br><span class="line">- `cls`:代表一个类的名称</span><br><span class="line">- `self`:代表一个实例对象的名称</span><br><span class="line"></span><br><span class="line">## 基本的魔法方法</span><br><span class="line"></span><br><span class="line">- `__init__(self[, ...])` 构造器,当一个实例被创建的时候调用的初始化方法</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[68]:</span><br></pre></td></tr></table></figure><p>class Rectangle:<br> def <strong>init</strong>(self, x, y):<br> self.x = x<br> self.y = y</p><pre><code>def getPeri(self): return (self.x + self.y) * 2def getArea(self): return self.x * self.y</code></pre><p>rect = Rectangle(4, 5)<br>print(rect.getPeri()) # 18<br>print(rect.getArea()) # 20<br>18<br>20</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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure><p> <strong>new</strong>(cls[, …])<br> <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"></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line">在一个对象实例化的时候所调用的第一个方法,在调用</span><br></pre></td></tr></table></figure><br> <strong>init</strong><br> <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"></span><br><span class="line">初始化前,先调用</span><br></pre></td></tr></table></figure><br> <strong>new</strong><br> <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><span class="line">9</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"> - `__new__`至少要有一个参数`cls`,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供,后面的参数直接传递给`__init__`。</span><br><span class="line"> - `__new__`对当前类进行了实例化,并将实例返回,传给`__init__`的`self`。但是,执行了`__new__`,并不一定会进入`__init__`,只有`__new__`返回了,当前类`cls`的实例,当前类的`__init__`才会进入。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[69]:</span><br></pre></td></tr></table></figure><br>class A(object):<br> def <strong>init</strong>(self, value):<br> print(“into A <strong>init</strong>“)<br> self.value = value</p><pre><code>def __new__(cls, *args, **kwargs): print("into A __new__") print(cls) return object.__new__(cls)</code></pre><p>class B(A):<br> def <strong>init</strong>(self, value):<br> print(“into B <strong>init</strong>“)<br> self.value = value</p><pre><code>def __new__(cls, *args, **kwargs): print("into B __new__") print(cls) return super().__new__(cls, *args, **kwargs)</code></pre><p>b = B(10)</p><h1 id="结果:"><a href="#结果:" class="headerlink" title="结果:"></a>结果:</h1><h1 id="into-B-new"><a href="#into-B-new" class="headerlink" title="into B new"></a>into B <strong>new</strong></h1><h1 id="lt-class-‘main-B’-gt"><a href="#lt-class-‘main-B’-gt" class="headerlink" title="<class ‘main.B’>"></a><class ‘<strong>main</strong>.B’></h1><h1 id="into-A-new"><a href="#into-A-new" class="headerlink" title="into A new"></a>into A <strong>new</strong></h1><h1 id="lt-class-‘main-B’-gt-1"><a href="#lt-class-‘main-B’-gt-1" class="headerlink" title="<class ‘main.B’>"></a><class ‘<strong>main</strong>.B’></h1><h1 id="into-B-init"><a href="#into-B-init" class="headerlink" title="into B init"></a>into B <strong>init</strong></h1><p>class A(object):<br> def <strong>init</strong>(self, value):<br> print(“into A <strong>init</strong>“)<br> self.value = value</p><pre><code>def __new__(cls, *args, **kwargs): print("into A __new__") print(cls) return object.__new__(cls)</code></pre><p>class B(A):<br> def <strong>init</strong>(self, value):<br> print(“into B <strong>init</strong>“)<br> self.value = value</p><pre><code>def __new__(cls, *args, **kwargs): print("into B __new__") print(cls) return super().__new__(A, *args, **kwargs) # 改动了cls变为A</code></pre><p>b = B(10)</p><h1 id="结果:-1"><a href="#结果:-1" class="headerlink" title="结果:"></a>结果:</h1><h1 id="into-B-new-1"><a href="#into-B-new-1" class="headerlink" title="into B new"></a>into B <strong>new</strong></h1><h1 id="lt-class-‘main-B’-gt-2"><a href="#lt-class-‘main-B’-gt-2" class="headerlink" title="<class ‘main.B’>"></a><class ‘<strong>main</strong>.B’></h1><h1 id="into-A-new-1"><a href="#into-A-new-1" class="headerlink" title="into A new"></a>into A <strong>new</strong></h1><h1 id="lt-class-‘main-A’-gt"><a href="#lt-class-‘main-A’-gt" class="headerlink" title="<class ‘main.A’>"></a><class ‘<strong>main</strong>.A’></h1><p>into B <strong>new</strong><br><class ‘<strong>main</strong>.B’><br>into A <strong>new</strong><br><class ‘<strong>main</strong>.B’><br>into B <strong>init</strong><br>into B <strong>new</strong><br><class ‘<strong>main</strong>.B’><br>into A <strong>new</strong><br><class ‘<strong>main</strong>.A’></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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- 若`__new__`没有正确返回当前类`cls`的实例,那`__init__`是不会被调用的,即使是父类的实例也不行,将没有`__init__`被调用。</span><br><span class="line"></span><br><span class="line">【例子】利用`__new__`实现单例模式。</span><br><span class="line"></span><br><span class="line">[70]:</span><br></pre></td></tr></table></figure><p>class Earth:<br> pass</p><p>a = Earth()<br>print(id(a)) # 260728291456<br>b = Earth()<br>print(id(b)) # 260728291624</p><p>class Earth:<br> __instance = None # 定义一个类属性做判断</p><pre><code>def __new__(cls): if cls.__instance is None: cls.__instance = object.__new__(cls) return cls.__instance else: return cls.__instance</code></pre><p>a = Earth()<br>print(id(a)) # 512320401648<br>b = Earth()<br>print(id(b)) # 512320401648<br>2336598724336<br>2336598528464<br>2336598467752<br>2336598467752</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- `__new__`方法主要是当你继承一些不可变的 class 时(比如`int, str, tuple`), 提供给你一个自定义这些类的实例化过程的途径。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[71]:</span><br></pre></td></tr></table></figure><p>class CapStr(str):<br> def <strong>new</strong>(cls, string):<br> string = string.upper()<br> return str.<strong>new</strong>(cls, string)</p><p>a = CapStr(“i love lsgogroup”)<br>print(a) # I LOVE LSGOGROUP<br>I LOVE LSGOGROUP</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><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><br><span class="line">- `__del__(self)` 析构器,当一个对象将要被系统回收之时调用的方法。</span><br><span class="line"></span><br><span class="line">> Python 采用自动引用计数(ARC)方式来回收对象所占用的空间,当程序中有一个变量引用该 Python 对象时,Python 会自动保证该对象引用计数为 1;当程序中有两个变量引用该 Python 对象时,Python 会自动保证该对象引用计数为 2,依此类推,如果一个对象的引用计数变成了 0,则说明程序中不再有变量引用该对象,表明程序不再需要该对象,因此 Python 就会回收该对象。</span><br><span class="line">></span><br><span class="line">> 大部分时候,Python 的 ARC 都能准确、高效地回收系统中的每个对象。但如果系统中出现循环引用的情况,比如对象 a 持有一个实例变量引用对象 b,而对象 b 又持有一个实例变量引用对象 a,此时两个对象的引用计数都是 1,而实际上程序已经不再有变量引用它们,系统应该回收它们,此时 Python 的垃圾回收器就可能没那么快,要等专门的循环垃圾回收器(Cyclic Garbage Collector)来检测并回收这种引用循环。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[72]:</span><br></pre></td></tr></table></figure><p>class C(object):<br> def <strong>init</strong>(self):<br> print(‘into C <strong>init</strong>‘)</p><pre><code>def __del__(self): print('into C __del__')</code></pre><p>c1 = C()</p><h1 id="into-C-init"><a href="#into-C-init" class="headerlink" title="into C init"></a>into C <strong>init</strong></h1><p>c2 = c1<br>c3 = c2<br>del c3<br>del c2<br>del c1</p><h1 id="into-C-del"><a href="#into-C-del" class="headerlink" title="into C del"></a>into C <strong>del</strong></h1><p>into C <strong>init</strong><br>into C <strong>del</strong></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><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><br><span class="line">- `__str__(self)`:</span><br><span class="line"> - 当你打印一个对象的时候,触发`__str__`</span><br><span class="line"> - 当你使用`%s`格式化的时候,触发`__str__`</span><br><span class="line"> - `str`强转数据类型的时候,触发`__str__`</span><br><span class="line">- `__repr__(self)`:</span><br><span class="line"> - `repr`是`str`的备胎</span><br><span class="line"> - 有`__str__`的时候执行`__str__`,没有实现`__str__`的时候,执行`__repr__`</span><br><span class="line"> - `repr(obj)`内置函数对应的结果是`__repr__`的返回值</span><br><span class="line"> - 当你使用`%r`格式化的时候 触发`__repr__`</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[73]:</span><br></pre></td></tr></table></figure><p>class Cat:<br> “””定义一个猫类”””</p><pre><code>def __init__(self, new_name, new_age): """在创建完对象之后 会自动调用, 它完成对象的初始化的功能""" self.name = new_name self.age = new_agedef __str__(self): """返回一个对象的描述信息""" return "名字是:%s , 年龄是:%d" % (self.name, self.age)def __repr__(self): """返回一个对象的描述信息""" return "Cat:(%s,%d)" % (self.name, self.age)def eat(self): print("%s在吃鱼...." % self.name)def drink(self): print("%s在喝可乐..." % self.name)def introduce(self): print("名字是:%s, 年龄是:%d" % (self.name, self.age))</code></pre><h1 id="创建了一个对象"><a href="#创建了一个对象" class="headerlink" title="创建了一个对象"></a>创建了一个对象</h1><p>tom = Cat(“汤姆”, 30)<br>print(tom) # 名字是:汤姆 , 年龄是:30<br>print(str(tom)) # 名字是:汤姆 , 年龄是:30<br>print(repr(tom)) # Cat:(汤姆,30)<br>tom.eat() # 汤姆在吃鱼….<br>tom.introduce() # 名字是:汤姆, 年龄是:30<br>名字是:汤姆 , 年龄是:30<br>名字是:汤姆 , 年龄是:30<br>Cat:(汤姆,30)<br>汤姆在吃鱼….<br>名字是:汤姆, 年龄是:30</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><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><br><span class="line">`__str__(self)` 的返回结果可读性强。也就是说,`__str__` 的意义是得到便于人们阅读的信息,就像下面的 '2019-10-11' 一样。</span><br><span class="line"></span><br><span class="line">`__repr__(self)` 的返回结果应更准确。怎么说,`__repr__` 存在的目的在于调试,便于开发者使用。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[74]:</span><br></pre></td></tr></table></figure><p>import datetime</p><p>today = datetime.date.today()<br>print(str(today)) # 2019-10-11<br>print(repr(today)) # datetime.date(2019, 10, 11)<br>print(‘%s’ %today) # 2019-10-11<br>print(‘%r’ %today) # datetime.date(2019, 10, 11)<br>2020-08-01<br>datetime.date(2020, 8, 1)<br>2020-08-01<br>datetime.date(2020, 8, 1)</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><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><br><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"></span><br><span class="line">[75]:</span><br></pre></td></tr></table></figure><p>class C:<br> pass</p><p>print(type(len)) # <class ‘builtin_function_or_method’><br>print(type(dir)) # <class ‘builtin_function_or_method’><br>print(type(int)) # <class ‘type’><br>print(type(list)) # <class ‘type’><br>print(type(tuple)) # <class ‘type’><br>print(type(C)) # <class ‘type’><br>print(int(‘123’)) # 123</p><h1 id="这个例子中list工厂函数把一个元祖对象加工成了一个列表对象。"><a href="#这个例子中list工厂函数把一个元祖对象加工成了一个列表对象。" class="headerlink" title="这个例子中list工厂函数把一个元祖对象加工成了一个列表对象。"></a>这个例子中list工厂函数把一个元祖对象加工成了一个列表对象。</h1><p>print(list((1, 2, 3))) # [1, 2, 3]<br><class ‘builtin_function_or_method’><br><class ‘builtin_function_or_method’><br><class ‘type’><br><class ‘type’><br><class ‘type’><br><class ‘type’><br>123<br>[1, 2, 3]</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- `__add__(self, other)`定义加法的行为:`+`</span><br><span class="line">- `__sub__(self, other)`定义减法的行为:`-`</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[76]:</span><br></pre></td></tr></table></figure><p>class MyClass:</p><pre><code>def __init__(self, height, weight): self.height = height self.weight = weight# 两个对象的长相加,宽不变.返回一个新的类def __add__(self, others): return MyClass(self.height + others.height, self.weight + others.weight)# 两个对象的宽相减,长不变.返回一个新的类def __sub__(self, others): return MyClass(self.height - others.height, self.weight - others.weight)# 说一下自己的参数def intro(self): print("高为", self.height, " 重为", self.weight)</code></pre><p>def main():<br> a = MyClass(height=10, weight=5)<br> a.intro()</p><pre><code>b = MyClass(height=20, weight=10)b.intro()c = b - ac.intro()d = a + bd.intro()</code></pre><p>if <strong>name</strong> == ‘<strong>main</strong>‘:<br> main()</p><h1 id="高为-10-重为-5"><a href="#高为-10-重为-5" class="headerlink" title="高为 10 重为 5"></a>高为 10 重为 5</h1><h1 id="高为-20-重为-10"><a href="#高为-20-重为-10" class="headerlink" title="高为 20 重为 10"></a>高为 20 重为 10</h1><h1 id="高为-10-重为-5-1"><a href="#高为-10-重为-5-1" class="headerlink" title="高为 10 重为 5"></a>高为 10 重为 5</h1><h1 id="高为-30-重为-15"><a href="#高为-30-重为-15" class="headerlink" title="高为 30 重为 15"></a>高为 30 重为 15</h1><p>高为 10 重为 5<br>高为 20 重为 10<br>高为 10 重为 5<br>高为 30 重为 15</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><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><br><span class="line">- `__mul__(self, other)`定义乘法的行为:`*`</span><br><span class="line">- `__truediv__(self, other)`定义真除法的行为:`/`</span><br><span class="line">- `__floordiv__(self, other)`定义整数除法的行为:`//`</span><br><span class="line">- `__mod__(self, other)` 定义取模算法的行为:`%`</span><br><span class="line">- `__divmod__(self, other)`定义当被 `divmod()` 调用时的行为</span><br><span class="line">- `divmod(a, b)`把除数和余数运算结果结合起来,返回一个包含商和余数的元组`(a // b, a % b)`。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[77]:</span><br></pre></td></tr></table></figure><p>print(divmod(7, 2)) # (3, 1)<br>print(divmod(8, 2)) # (4, 0)<br>(3, 1)<br>(4, 0)</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><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- `__pow__(self, other[, module])`定义当被 `power()` 调用或 `**` 运算时的行为</span><br><span class="line">- `__lshift__(self, other)`定义按位左移位的行为:`<<`</span><br><span class="line">- `__rshift__(self, other)`定义按位右移位的行为:`>>`</span><br><span class="line">- `__and__(self, other)`定义按位与操作的行为:`&`</span><br><span class="line">- `__xor__(self, other)`定义按位异或操作的行为:`^`</span><br><span class="line">- `__or__(self, other)`定义按位或操作的行为:`|`</span><br><span class="line"></span><br><span class="line">## 反算术运算符</span><br><span class="line"></span><br><span class="line">反运算魔方方法,与算术运算符保持一一对应,不同之处就是反运算的魔法方法多了一个“r”。当文件左操作不支持相应的操作时被调用。</span><br><span class="line"></span><br><span class="line">- `__radd__(self, other)`定义加法的行为:`+`</span><br><span class="line">- `__rsub__(self, other)`定义减法的行为:`-`</span><br><span class="line">- `__rmul__(self, other)`定义乘法的行为:`*`</span><br><span class="line">- `__rtruediv__(self, other)`定义真除法的行为:`/`</span><br><span class="line">- `__rfloordiv__(self, other)`定义整数除法的行为:`//`</span><br><span class="line">- `__rmod__(self, other)` 定义取模算法的行为:`%`</span><br><span class="line">- `__rdivmod__(self, other)`定义当被 divmod() 调用时的行为</span><br><span class="line">- `__rpow__(self, other[, module])`定义当被 power() 调用或 `**` 运算时的行为</span><br><span class="line">- `__rlshift__(self, other)`定义按位左移位的行为:`<<`</span><br><span class="line">- `__rrshift__(self, other)`定义按位右移位的行为:`>>`</span><br><span class="line">- `__rand__(self, other)`定义按位与操作的行为:`&`</span><br><span class="line">- `__rxor__(self, other)`定义按位异或操作的行为:`^`</span><br><span class="line">- `__ror__(self, other)`定义按位或操作的行为:`|`</span><br></pre></td></tr></table></figure><p>a + b</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">这里加数是`a`,被加数是`b`,因此是`a`主动,反运算就是如果`a`对象的`__add__()`方法没有实现或者不支持相应的操作,那么 Python 就会调用`b`的`__radd__()`方法。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[78]:</span><br></pre></td></tr></table></figure><p>class Nint(int):<br> def <strong>radd</strong>(self, other):<br> return int.<strong>sub</strong>(other, self) # 注意 self 在后面</p><p>a = Nint(5)<br>b = Nint(3)<br>print(a + b) # 8<br>print(1 + b) # -2<br>8<br>-2</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><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">## 增量赋值运算符</span><br><span class="line"></span><br><span class="line">- `__iadd__(self, other)`定义赋值加法的行为:`+=`</span><br><span class="line">- `__isub__(self, other)`定义赋值减法的行为:`-=`</span><br><span class="line">- `__imul__(self, other)`定义赋值乘法的行为:`*=`</span><br><span class="line">- `__itruediv__(self, other)`定义赋值真除法的行为:`/=`</span><br><span class="line">- `__ifloordiv__(self, other)`定义赋值整数除法的行为:`//=`</span><br><span class="line">- `__imod__(self, other)`定义赋值取模算法的行为:`%=`</span><br><span class="line">- `__ipow__(self, other[, modulo])`定义赋值幂运算的行为:`**=`</span><br><span class="line">- `__ilshift__(self, other)`定义赋值按位左移位的行为:`<<=`</span><br><span class="line">- `__irshift__(self, other)`定义赋值按位右移位的行为:`>>=`</span><br><span class="line">- `__iand__(self, other)`定义赋值按位与操作的行为:`&=`</span><br><span class="line">- `__ixor__(self, other)`定义赋值按位异或操作的行为:`^=`</span><br><span class="line">- `__ior__(self, other)`定义赋值按位或操作的行为:`|=`</span><br><span class="line"></span><br><span class="line">## 一元运算符</span><br><span class="line"></span><br><span class="line">- `__neg__(self)`定义正号的行为:`+x`</span><br><span class="line">- `__pos__(self)`定义负号的行为:`-x`</span><br><span class="line">- `__abs__(self)`定义当被`abs()`调用时的行为</span><br><span class="line">- `__invert__(self)`定义按位求反的行为:`~x`</span><br><span class="line"></span><br><span class="line">## 属性访问</span><br><span class="line"></span><br><span class="line">- `__getattr__(self, name)`: 定义当用户试图获取一个不存在的属性时的行为。</span><br><span class="line">- `__getattribute__(self, name)`:定义当该类的属性被访问时的行为(先调用该方法,查看是否存在该属性,若不存在,接着去调用`__getattr__`)。</span><br><span class="line">- `__setattr__(self, name, value)`:定义当一个属性被设置时的行为。</span><br><span class="line">- `__delattr__(self, name)`:定义当一个属性被删除时的行为。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[79]:</span><br></pre></td></tr></table></figure><p>class C:<br> def <strong>getattribute</strong>(self, item):<br> print(‘<strong>getattribute</strong>‘)<br> return super().<strong>getattribute</strong>(item)</p><pre><code>def __getattr__(self, item): print('__getattr__')def __setattr__(self, key, value): print('__setattr__') super().__setattr__(key, value)def __delattr__(self, item): print('__delattr__') super().__delattr__(item)</code></pre><p>c = C()<br>c.x</p><h1 id="getattribute"><a href="#getattribute" class="headerlink" title="getattribute"></a><strong>getattribute</strong></h1><h1 id="getattr"><a href="#getattr" class="headerlink" title="getattr"></a><strong>getattr</strong></h1><p>c.x = 1</p><h1 id="setattr"><a href="#setattr" class="headerlink" title="setattr"></a><strong>setattr</strong></h1><p>del c.x</p><h1 id="delattr"><a href="#delattr" class="headerlink" title="delattr"></a><strong>delattr</strong></h1><p><strong>getattribute</strong><br><strong>getattr</strong><br><strong>setattr</strong><br><strong>delattr</strong></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><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><br><span class="line">## 描述符</span><br><span class="line"></span><br><span class="line">描述符就是将某种特殊类型的类的实例指派给另一个类的属性。</span><br><span class="line"></span><br><span class="line">- `__get__(self, instance, owner)`用于访问属性,它返回属性的值。</span><br><span class="line">- `__set__(self, instance, value)`将在属性分配操作中调用,不返回任何内容。</span><br><span class="line">- `__del__(self, instance)`控制删除操作,不返回任何内容。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[80]:</span><br></pre></td></tr></table></figure><p>class MyDecriptor:<br> def <strong>get</strong>(self, instance, owner):<br> print(‘<strong>get</strong>‘, self, instance, owner)</p><pre><code>def __set__(self, instance, value): print('__set__', self, instance, value)def __delete__(self, instance): print('__delete__', self, instance)</code></pre><p>class Test:<br> x = MyDecriptor()</p><p>t = Test()<br>t.x</p><h1 id="get-lt-main-MyDecriptor-object-at-0x000000CEAAEB6B00-gt-lt-main-Test-object-at-0x000000CEABDC0898-gt-lt-class-‘main-Test’-gt"><a href="#get-lt-main-MyDecriptor-object-at-0x000000CEAAEB6B00-gt-lt-main-Test-object-at-0x000000CEABDC0898-gt-lt-class-‘main-Test’-gt" class="headerlink" title="get <main.MyDecriptor object at 0x000000CEAAEB6B00> <main.Test object at 0x000000CEABDC0898> <class ‘main.Test’>"></a><strong>get</strong> <<strong>main</strong>.MyDecriptor object at 0x000000CEAAEB6B00> <<strong>main</strong>.Test object at 0x000000CEABDC0898> <class ‘<strong>main</strong>.Test’></h1><p>t.x = ‘x-man’</p><h1 id="set-lt-main-MyDecriptor-object-at-0x00000023687C6B00-gt-lt-main-Test-object-at-0x00000023696B0940-gt-x-man"><a href="#set-lt-main-MyDecriptor-object-at-0x00000023687C6B00-gt-lt-main-Test-object-at-0x00000023696B0940-gt-x-man" class="headerlink" title="set <main.MyDecriptor object at 0x00000023687C6B00> <main.Test object at 0x00000023696B0940> x-man"></a><strong>set</strong> <<strong>main</strong>.MyDecriptor object at 0x00000023687C6B00> <<strong>main</strong>.Test object at 0x00000023696B0940> x-man</h1><p>del t.x</p><h1 id="delete-lt-main-MyDecriptor-object-at-0x000000EC9B160A90-gt-lt-main-Test-object-at-0x000000EC9B160B38-gt"><a href="#delete-lt-main-MyDecriptor-object-at-0x000000EC9B160A90-gt-lt-main-Test-object-at-0x000000EC9B160B38-gt" class="headerlink" title="delete <main.MyDecriptor object at 0x000000EC9B160A90> <main.Test object at 0x000000EC9B160B38>"></a><strong>delete</strong> <<strong>main</strong>.MyDecriptor object at 0x000000EC9B160A90> <<strong>main</strong>.Test object at 0x000000EC9B160B38></h1><p><strong>get</strong> <<strong>main</strong>.MyDecriptor object at 0x0000022008242668> <<strong>main</strong>.Test object at 0x00000220082427B8> <class ‘<strong>main</strong>.Test’><br><strong>set</strong> <<strong>main</strong>.MyDecriptor object at 0x0000022008242668> <<strong>main</strong>.Test object at 0x00000220082427B8> x-man<br><strong>delete</strong> <<strong>main</strong>.MyDecriptor object at 0x0000022008242668> <<strong>main</strong>.Test object at 0x00000220082427B8></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><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><br><span class="line">## 定制序列</span><br><span class="line"></span><br><span class="line">协议(Protocols)与其它编程语言中的接口很相似,它规定你哪些方法必须要定义。然而,在 Python 中的协议就显得不那么正式。事实上,在 Python 中,协议更像是一种指南。</span><br><span class="line"></span><br><span class="line">**容器类型的协议**</span><br><span class="line"></span><br><span class="line">- 如果说你希望定制的容器是不可变的话,你只需要定义`__len__()`和`__getitem__()`方法。</span><br><span class="line">- 如果你希望定制的容器是可变的话,除了`__len__()`和`__getitem__()`方法,你还需要定义`__setitem__()`和`__delitem__()`两个方法。</span><br><span class="line"></span><br><span class="line">【例子】编写一个不可改变的自定义列表,要求记录列表中每个元素被访问的次数。</span><br><span class="line"></span><br><span class="line">[81]:</span><br></pre></td></tr></table></figure><p>class CountList:<br> def <strong>init</strong>(self, *args):<br> self.values = [x for x in args]<br> self.count = {}.fromkeys(range(len(self.values)), 0)</p><pre><code>def __len__(self): return len(self.values)def __getitem__(self, item): self.count[item] += 1 return self.values[item]</code></pre><p>c1 = CountList(1, 3, 5, 7, 9)<br>c2 = CountList(2, 4, 6, 8, 10)<br>print(c1[1]) # 3<br>print(c2[2]) # 6<br>print(c1[1] + c2[1]) # 7</p><p>print(c1.count)</p><h1 id="0-0-1-2-2-0-3-0-4-0"><a href="#0-0-1-2-2-0-3-0-4-0" class="headerlink" title="{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}"></a>{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}</h1><p>print(c2.count)</p><h1 id="0-0-1-1-2-1-3-0-4-0"><a href="#0-0-1-1-2-1-3-0-4-0" class="headerlink" title="{0: 0, 1: 1, 2: 1, 3: 0, 4: 0}"></a>{0: 0, 1: 1, 2: 1, 3: 0, 4: 0}</h1><p>3<br>6<br>7<br>{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}<br>{0: 0, 1: 1, 2: 1, 3: 0, 4: 0}</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><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><br><span class="line">- `__len__(self)`定义当被`len()`调用时的行为(返回容器中元素的个数)。</span><br><span class="line">- `__getitem__(self, key)`定义获取容器中元素的行为,相当于`self[key]`。</span><br><span class="line">- `__setitem__(self, key, value)`定义设置容器中指定元素的行为,相当于`self[key] = value`。</span><br><span class="line">- `__delitem__(self, key)`定义删除容器中指定元素的行为,相当于`del self[key]`。</span><br><span class="line"></span><br><span class="line">【例子】编写一个可改变的自定义列表,要求记录列表中每个元素被访问的次数。</span><br><span class="line"></span><br><span class="line">[82]:</span><br></pre></td></tr></table></figure><p>class CountList:<br> def <strong>init</strong>(self, *args):<br> self.values = [x for x in args]<br> self.count = {}.fromkeys(range(len(self.values)), 0)</p><pre><code>def __len__(self): return len(self.values)def __getitem__(self, item): self.count[item] += 1 return self.values[item]def __setitem__(self, key, value): self.values[key] = valuedef __delitem__(self, key): del self.values[key] for i in range(0, len(self.values)): if i >= key: self.count[i] = self.count[i + 1] self.count.pop(len(self.values))</code></pre><p>c1 = CountList(1, 3, 5, 7, 9)<br>c2 = CountList(2, 4, 6, 8, 10)<br>print(c1[1]) # 3<br>print(c2[2]) # 6<br>c2[2] = 12<br>print(c1[1] + c2[2]) # 15<br>print(c1.count)</p><h1 id="0-0-1-2-2-0-3-0-4-0-1"><a href="#0-0-1-2-2-0-3-0-4-0-1" class="headerlink" title="{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}"></a>{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}</h1><p>print(c2.count)</p><h1 id="0-0-1-0-2-2-3-0-4-0"><a href="#0-0-1-0-2-2-3-0-4-0" class="headerlink" title="{0: 0, 1: 0, 2: 2, 3: 0, 4: 0}"></a>{0: 0, 1: 0, 2: 2, 3: 0, 4: 0}</h1><p>del c1[1]<br>print(c1.count)</p><h1 id="0-0-1-0-2-0-3-0"><a href="#0-0-1-0-2-0-3-0" class="headerlink" title="{0: 0, 1: 0, 2: 0, 3: 0}"></a>{0: 0, 1: 0, 2: 0, 3: 0}</h1><p>3<br>6<br>15<br>{0: 0, 1: 2, 2: 0, 3: 0, 4: 0}<br>{0: 0, 1: 0, 2: 2, 3: 0, 4: 0}<br>{0: 0, 1: 0, 2: 0, 3: 0}</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><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><br><span class="line">## 迭代器</span><br><span class="line"></span><br><span class="line">- 迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。</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"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[84]:</span><br></pre></td></tr></table></figure><p>string = ‘lsgogroup’<br>for c in string:<br> print(c)</p><p>‘’’<br>l<br>s<br>g<br>o<br>g<br>r<br>o<br>u<br>p<br>‘’’</p><p>for c in iter(string):<br> print(c)<br>l<br>s<br>g<br>o<br>g<br>r<br>o<br>u<br>p<br>l<br>s<br>g<br>o<br>g<br>r<br>o<br>u<br>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"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[85]:</span><br></pre></td></tr></table></figure><p>links = {‘B’: ‘百度’, ‘A’: ‘阿里’, ‘T’: ‘腾讯’}<br>for each in links:<br> print(‘%s -> %s’ % (each, links[each]))</p><p>‘’’<br>B -> 百度<br>A -> 阿里<br>T -> 腾讯<br>‘’’</p><p>for each in iter(links):<br> print(‘%s -> %s’ % (each, links[each]))<br>B -> 百度<br>A -> 阿里<br>T -> 腾讯<br>B -> 百度<br>A -> 阿里<br>T -> 腾讯</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><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><br><span class="line">- 迭代器有两个基本的方法:`iter()` 和 `next()`。</span><br><span class="line">- `iter(object)` 函数用来生成迭代器。</span><br><span class="line">- `next(iterator[, default])` 返回迭代器的下一个项目。</span><br><span class="line">- `iterator` -- 可迭代对象</span><br><span class="line">- `default` -- 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 `StopIteration` 异常。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[2]:</span><br></pre></td></tr></table></figure><p>links = {‘B’: ‘百度’, ‘A’: ‘阿里’, ‘T’: ‘腾讯’}</p><p>it = iter(links)<br>while True:<br> try:<br> each = next(it)<br> except StopIteration:<br> break<br> print(each)</p><h1 id="B"><a href="#B" class="headerlink" title="B"></a>B</h1><h1 id="A"><a href="#A" class="headerlink" title="A"></a>A</h1><h1 id="T"><a href="#T" class="headerlink" title="T"></a>T</h1><p>it = iter(links)<br>print(next(it)) # B<br>print(next(it)) # A<br>print(next(it)) # T<br>print(next(it)) # StopIteration<br>B<br>A<br>T<br>B<br>A<br>T</p><hr><p>StopIteration Traceback (most recent call last)<br><ipython-input-2-682f811edce7> in <module>()<br> 17 print(next(it)) # A<br> 18 print(next(it)) # T<br>—> 19 print(next(it)) # StopIteration</module></ipython-input-2-682f811edce7></p><p>StopIteration: </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><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><br><span class="line">把一个类作为一个迭代器使用需要在类中实现两个魔法方法 `__iter__()` 与 `__next__()` 。</span><br><span class="line"></span><br><span class="line">- `__iter__(self)`定义当迭代容器中的元素的行为,返回一个特殊的迭代器对象, 这个迭代器对象实现了 `__next__()` 方法并通过 `StopIteration` 异常标识迭代的完成。</span><br><span class="line">- `__next__()` 返回下一个迭代器对象。</span><br><span class="line">- `StopIteration` 异常用于标识迭代的完成,防止出现无限循环的情况,在 `__next__()` 方法中我们可以设置在完成指定循环次数后触发 `StopIteration` 异常来结束迭代。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[88]:</span><br></pre></td></tr></table></figure><p>class Fibs:<br> def <strong>init</strong>(self, n=10):<br> self.a = 0<br> self.b = 1<br> self.n = n</p><pre><code>def __iter__(self): return selfdef __next__(self): self.a, self.b = self.b, self.a + self.b if self.a > self.n: raise StopIteration return self.a</code></pre><p>fibs = Fibs(100)<br>for each in fibs:<br> print(each, end=’ ‘)</p><h1 id="1-1-2-3-5-8-13-21-34-55-89"><a href="#1-1-2-3-5-8-13-21-34-55-89" class="headerlink" title="1 1 2 3 5 8 13 21 34 55 89"></a>1 1 2 3 5 8 13 21 34 55 89</h1><p>1 1 2 3 5 8 13 21 34 55 89 </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><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><br><span class="line">**4.10 生成器**</span><br><span class="line"></span><br><span class="line">- 在 Python 中,使用了 `yield` 的函数被称为生成器(generator)。</span><br><span class="line">- 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。</span><br><span class="line">- 在调用生成器运行的过程中,每次遇到 `yield` 时函数会暂停并保存当前所有的运行信息,返回 `yield` 的值, 并在下一次执行 `next()` 方法时从当前位置继续运行。</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">[6]:</span><br></pre></td></tr></table></figure><p>def myGen():<br> print(‘生成器执行!’)<br> yield 1<br> yield 2</p><p>myG = myGen()<br>for each in myG:<br> print(each)</p><p>‘’’<br>生成器执行!<br>1<br>2<br>‘’’</p><p>myG = myGen()<br>print(next(myG)) </p><h1 id="生成器执行!"><a href="#生成器执行!" class="headerlink" title="生成器执行!"></a>生成器执行!</h1><h1 id="1"><a href="#1" class="headerlink" title="1"></a>1</h1><p>print(next(myG)) # 2<br>print(next(myG)) # StopIteration<br>生成器执行!<br>1<br>2<br>生成器执行!<br>1<br>2</p><hr><p>StopIteration Traceback (most recent call last)<br><ipython-input-6-56bfa60ce8de> in <module>()<br> 14<br> 15 print(next(myG)) # 2<br>—> 16 print(next(myG)) # StopIteration</module></ipython-input-6-56bfa60ce8de></p><p>StopIteration: </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"></span><br><span class="line">【例子】用生成器实现斐波那契数列。</span><br><span class="line"></span><br><span class="line">[93]:</span><br></pre></td></tr></table></figure><p>def libs(n):<br> a = 0<br> b = 1<br> while True:<br> a, b = b, a + b<br> if a > n:<br> return<br> yield a</p><p>for each in libs(100):<br> print(each, end=’ ‘)</p><h1 id="1-1-2-3-5-8-13-21-34-55-89-1"><a href="#1-1-2-3-5-8-13-21-34-55-89-1" class="headerlink" title="1 1 2 3 5 8 13 21 34 55 89"></a>1 1 2 3 5 8 13 21 34 55 89</h1><p>1 1 2 3 5 8 13 21 34 55 89<br>```</p>]]></content>
<summary type="html"><h1 id="Python入门-下"><a href="#Python入门-下" class="headerlink" title="Python入门(下)"></a>Python入门(下)</h1><ol>
<li><a href="https://dsw2-dsw-d202</summary>
<category term="python基础" scheme="https://wicherqaq.github.io/categories/python%E5%9F%BA%E7%A1%80/"/>
</entry>
<entry>
<title>conda源和pip源的转换</title>
<link href="https://wicherqaq.github.io/2020/09/15/conda%E6%BA%90%E5%92%8Cpip%E6%BA%90%E7%9A%84%E8%BD%AC%E6%8D%A2/"/>
<id>https://wicherqaq.github.io/2020/09/15/conda%E6%BA%90%E5%92%8Cpip%E6%BA%90%E7%9A%84%E8%BD%AC%E6%8D%A2/</id>
<published>2020-09-15T00:58:19.000Z</published>
<updated>2020-09-15T00:59:12.582Z</updated>
<content type="html"><![CDATA[<h4 id="conda配置源"><a href="#conda配置源" class="headerlink" title="conda配置源"></a>conda配置源</h4><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><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">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/</span><br><span class="line">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/</span><br><span class="line">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/</span><br><span class="line">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/</span><br><span class="line">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/</span><br><span class="line">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/</span><br><span class="line">conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/</span><br><span class="line">conda config --set show_channel_urls yes</span><br></pre></td></tr></table></figure><h4 id="pip配置源(Linux-OSX)"><a href="#pip配置源(Linux-OSX)" class="headerlink" title="pip配置源(Linux/OSX)"></a>pip配置源(Linux/OSX)</h4><ol><li><p>在指定路径下创建配置文件</p><p><code>mkdir ~/.pip</code></p><p><code>vim ~/.pip/pip.conf</code></p></li><li><p>写入配置信息</p></li></ol><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><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">[global]</span><br><span class="line">index-url=http://mirrors.aliyun.com/pypi/simple/ #源地址</span><br><span class="line"></span><br><span class="line">#豆瓣 http://pypi.douban.com/ </span><br><span class="line">#中国科学技术大学http://pypi.mirrors.ustc.edu.cn/simple/ </span><br><span class="line">#清华:https://pypi.tuna.tsinghua.edu.cn/simple</span><br><span class="line">#阿里云:http://mirrors.aliyun.com/pypi/simple/</span><br><span class="line">#华中理工大学:http://pypi.hustunique.com/</span><br><span class="line">#山东理工大学:http://pypi.sdutlinux.org/</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h4 id="conda配置源"><a href="#conda配置源" class="headerlink" title="conda配置源"></a>conda配置源</h4><p>添加清华源</p>
<figure class="highlight plain"><tab</summary>
<category term="机器学习" scheme="https://wicherqaq.github.io/categories/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"/>
<category term="环境搭建" scheme="https://wicherqaq.github.io/tags/%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA/"/>
</entry>
<entry>
<title>ubuntu双网卡网络设置</title>
<link href="https://wicherqaq.github.io/2020/09/10/ubuntu%E5%8F%8C%E7%BD%91%E5%8D%A1%E7%BD%91%E7%BB%9C%E8%AE%BE%E7%BD%AE/"/>
<id>https://wicherqaq.github.io/2020/09/10/ubuntu%E5%8F%8C%E7%BD%91%E5%8D%A1%E7%BD%91%E7%BB%9C%E8%AE%BE%E7%BD%AE/</id>
<published>2020-09-10T03:17:13.000Z</published>
<updated>2020-09-10T03:20:01.514Z</updated>
<content type="html"><![CDATA[<h4 id="当前操作"><a href="#当前操作" class="headerlink" title="当前操作"></a>当前操作</h4><p>在<code>/etc/rc.local</code>启动文件中添加<code>route add</code>命令指定网段,网卡和网关信息</p><p>sudo route add -net 192.168.8.0/24 【内网网卡名】</p><p>sudo route add -net 192.168.8.0/24 gw 192.168.8.1 # 路由网关地址</p><p>sudo route add -net 192.168.10.0/24 【外网网卡名】</p><p>sudo route add -net 192.168.10.0/24 gw 192.168.10.1 # 路由网关地址</p><h5 id="route-n"><a href="#route-n" class="headerlink" title="route -n"></a>route -n</h5><p>查看路由表</p><h5 id="route-add"><a href="#route-add" class="headerlink" title="route add"></a>route add</h5><p><em>命令解释</em>:<code>route add</code>命令的主要作用是添加静态路由</p><h5 id="route-del"><a href="#route-del" class="headerlink" title="route del"></a>route del</h5><p><em>命令解释</em>:<code>route del</code>命令的主要作用是删除<code>route -n</code>列出的静态路由。(网段相同,掩码相同则从上到下一条条删除)</p><p><em>注意</em>:直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加route命令来设置路由永久有效。</p><h4 id="目前遇到的问题"><a href="#目前遇到的问题" class="headerlink" title="目前遇到的问题"></a>目前遇到的问题</h4><ol><li><p>ping <a href="http://www.baidu.com" target="_blank" rel="noopener">www.baidu.com</a> 可以ping通</p><p>但是ping局域网内的其他机器会没有反应(怀疑是不是huawei路由器的问题-待验证)</p></li><li><p>指定相关<code>IP</code>到指定的网卡,使得访问只能走指定的网关(目前思路:可能需要修改<code>host</code>文件?通过<code>route add</code>命令设置到指定网关)</p></li></ol>]]></content>
<summary type="html"><h4 id="当前操作"><a href="#当前操作" class="headerlink" title="当前操作"></a>当前操作</h4><p>在<code>/etc/rc.local</code>启动文件中添加<code>route add</code>命令指定网段</summary>
<category term="Linux" scheme="https://wicherqaq.github.io/categories/Linux/"/>
<category term="ubuntu" scheme="https://wicherqaq.github.io/tags/ubuntu/"/>
</entry>
<entry>
<title>位运算</title>
<link href="https://wicherqaq.github.io/2020/09/10/%E4%BD%8D%E8%BF%90%E7%AE%97/"/>
<id>https://wicherqaq.github.io/2020/09/10/%E4%BD%8D%E8%BF%90%E7%AE%97/</id>
<published>2020-09-10T02:51:47.000Z</published>
<updated>2020-09-10T02:54:33.772Z</updated>
<content type="html"><![CDATA[<h1 id="位运算"><a href="#位运算" class="headerlink" title="位运算"></a>位运算</h1><p>[TOC]</p><h2 id="1-原码、反码和补码"><a href="#1-原码、反码和补码" class="headerlink" title="1. 原码、反码和补码"></a>1. 原码、反码和补码</h2><p>二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。</p><p><strong>原码</strong>:就是其二进制表示(注意,有一位符号位)。</p><figure class="highlight"><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">00 00 00 11 -> 3</span><br><span class="line">10 00 00 11 -> -3</span><br></pre></td></tr></table></figure><p><strong>反码</strong>:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。</p><figure class="highlight"><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">00 00 00 11 -> 3</span><br><span class="line">11 11 11 00 -> -3</span><br></pre></td></tr></table></figure><p><strong>补码</strong>:正数的补码就是原码,负数的补码是反码+1。</p><figure class="highlight"><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">00 00 00 11 -> 3</span><br><span class="line">11 11 11 01 -> -3</span><br></pre></td></tr></table></figure><p><strong>符号位</strong>:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。</p><h2 id="2-按位运算"><a href="#2-按位运算" class="headerlink" title="2. 按位运算"></a>2. 按位运算</h2><ul><li>按位非操作 ~</li></ul><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">0</span></span><br><span class="line">~ <span class="number">0</span> = <span class="number">1</span></span><br></pre></td></tr></table></figure><p><code>~</code> 把<code>num</code>的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在 <code>~</code> 运算中同样会取反。</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><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">00 00 01 01 -> 5</span><br><span class="line">~</span><br><span class="line">---</span><br><span class="line">11 11 10 10 -> -6</span><br><span class="line"></span><br><span class="line">11 11 10 11 -> -5</span><br><span class="line">~</span><br><span class="line">---</span><br><span class="line">00 00 01 00 -> 4</span><br></pre></td></tr></table></figure><ul><li>按位与操作 &</li></ul><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="number">1</span> & <span class="number">1</span> = <span class="number">1</span></span><br><span class="line"><span class="number">1</span> & <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 class="number">0</span></span><br><span class="line"><span class="number">0</span> & <span class="number">0</span> = <span class="number">0</span></span><br></pre></td></tr></table></figure><p>只有两个对应位都为 1 时才为 1</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></pre></td><td class="code"><pre><span class="line">00 00 01 01 -> 5</span><br><span class="line">&</span><br><span class="line">00 00 01 10 -> 6</span><br><span class="line">---</span><br><span class="line">00 00 01 00 -> 4</span><br></pre></td></tr></table></figure><ul><li>按位或操作 |</li></ul><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="number">1</span> | <span class="number">1</span> = <span class="number">1</span></span><br><span class="line"><span class="number">1</span> | <span class="number">0</span> = <span class="number">1</span></span><br><span class="line"><span class="number">0</span> | <span class="number">1</span> = <span class="number">1</span></span><br><span class="line"><span class="number">0</span> | <span class="number">0</span> = <span class="number">0</span></span><br></pre></td></tr></table></figure><p>只要两个对应位中有一个 1 时就为 1</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></pre></td><td class="code"><pre><span class="line">00 00 01 01 -> 5</span><br><span class="line">|</span><br><span class="line">00 00 01 10 -> 6</span><br><span class="line">---</span><br><span class="line">00 00 01 11 -> 7</span><br></pre></td></tr></table></figure><ul><li>按位异或操作 ^</li></ul><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="number">1</span> ^ <span class="number">1</span> = <span class="number">0</span></span><br><span class="line"><span class="number">1</span> ^ <span class="number">0</span> = <span class="number">1</span></span><br><span class="line"><span class="number">0</span> ^ <span class="number">1</span> = <span class="number">1</span></span><br><span class="line"><span class="number">0</span> ^ <span class="number">0</span> = <span class="number">0</span></span><br></pre></td></tr></table></figure><p>只有两个对应位不同时才为 1</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></pre></td><td class="code"><pre><span class="line">00 00 01 01 -> 5</span><br><span class="line">^</span><br><span class="line">00 00 01 10 -> 6</span><br><span class="line">---</span><br><span class="line">00 00 00 11 -> 3</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">A: <span class="number">00</span> <span class="number">00</span> <span class="number">11</span> <span class="number">00</span></span><br><span class="line">B: <span class="number">00</span> <span class="number">00</span> <span class="number">01</span> <span class="number">11</span></span><br><span class="line"></span><br><span class="line">A^B: <span class="number">00</span> <span class="number">00</span> <span class="number">10</span> <span class="number">11</span></span><br><span class="line">B^A: <span class="number">00</span> <span class="number">00</span> <span class="number">10</span> <span class="number">11</span></span><br><span class="line"></span><br><span class="line">A^A: <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span></span><br><span class="line">A^<span class="number">0</span>: <span class="number">00</span> <span class="number">00</span> <span class="number">11</span> <span class="number">00</span></span><br><span class="line"></span><br><span class="line">A^B^A: = A^A^B = B = <span class="number">00</span> <span class="number">00</span> <span class="number">01</span> <span class="number">11</span></span><br></pre></td></tr></table></figure><ul><li>按位左移操作 <<</li></ul><p><code>num << i</code> 将<code>num</code>的二进制表示向左移动<code>i</code>位所得的值。</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">00 00 10 11 -> 11</span><br><span class="line"><span class="number">11</span> << <span class="number">3</span></span><br><span class="line">---</span><br><span class="line">01 01 10 00 -> 88</span><br></pre></td></tr></table></figure><ul><li>按位右移操作 >></li></ul><p><code>num >> i</code> 将<code>num</code>的二进制表示向右移动<code>i</code>位所得的值。</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">00 00 10 11 -> 11</span><br><span class="line"><span class="number">11</span> >> <span class="number">2</span></span><br><span class="line">---</span><br><span class="line">00 00 00 10 -> 2</span><br></pre></td></tr></table></figure><h2 id="3-利用位运算实现快速计算"><a href="#3-利用位运算实现快速计算" class="headerlink" title="3. 利用位运算实现快速计算"></a>3. 利用位运算实现快速计算</h2><p>通过 <code><<</code>,<code>>></code> 快速计算2的倍数问题。</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></pre></td><td class="code"><pre><span class="line">n << 1 -> 计算 n*2</span><br><span class="line">n >> 1 -> 计算 n/2,负奇数的运算不可用</span><br><span class="line">n << m -> 计算 n*(2^m),即乘以 2 的 m 次方</span><br><span class="line">n >> m -> 计算 n/(2^m),即除以 2 的 m 次方</span><br><span class="line">1 << n -> 2^n</span><br></pre></td></tr></table></figure><p>通过 <code>^</code> 快速交换两个整数。 通过 <code>^</code> 快速交换两个整数。</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">a ^= b</span><br><span class="line">b ^= a</span><br><span class="line">a ^= b</span><br></pre></td></tr></table></figure><p>通过 <code>a & (-a)</code> 快速获取<code>a</code>的最后为 1 位置的整数。</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><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">00 00 01 01 -> 5</span><br><span class="line">&</span><br><span class="line">11 11 10 11 -> -5</span><br><span class="line">---</span><br><span class="line">00 00 00 01 -> 1</span><br><span class="line"></span><br><span class="line">00 00 11 10 -> 14</span><br><span class="line">&</span><br><span class="line">11 11 00 10 -> -14</span><br><span class="line">---</span><br><span class="line">00 00 00 10 -> 2</span><br></pre></td></tr></table></figure><h2 id="4-利用位运算实现整数集合"><a href="#4-利用位运算实现整数集合" class="headerlink" title="4. 利用位运算实现整数集合"></a>4. 利用位运算实现整数集合</h2><p>一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。</p><p>比如集合 <code>{1, 3, 4, 8}</code>,可以表示成 <code>01 00 01 10 10</code> 而对应的位运算也就可以看作是对集合进行的操作。</p><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></pre></td><td class="code"><pre><span class="line">a | (1<<i) -> 把 i 插入到集合中</span><br><span class="line">a & ~(1<<i) -> 把 i 从集合中删除</span><br><span class="line">a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)</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></pre></td><td class="code"><pre><span class="line">a 补 -> ~a</span><br><span class="line">a 交 b -> a & b</span><br><span class="line">a 并 b -> a | b</span><br><span class="line">a 差 b -> a & (~b)</span><br></pre></td></tr></table></figure><p>注意:整数在内存中是以补码的形式存在的,输出自然也是按照补码输出。</p><p>【例子】C#语言输出负数。</p><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><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">class Program</span><br><span class="line">{</span><br><span class="line"> static void Main(string[] args)</span><br><span class="line"> {</span><br><span class="line"> string s1 = Convert.ToString(-3, 2);</span><br><span class="line"> Console.WriteLine(s1); </span><br><span class="line"> // 11111111111111111111111111111101</span><br><span class="line"> </span><br><span class="line"> string s2 = Convert.ToString(-3, 16);</span><br><span class="line"> Console.WriteLine(s2); </span><br><span class="line"> // fffffffd</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>【例子】 Python 的<code>bin()</code> 输出。</p><p>[37]:</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><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">print(bin(3)) # 0b11</span><br><span class="line">print(bin(-3)) # -0b11</span><br><span class="line"></span><br><span class="line">print(bin(-3 & 0xffffffff)) </span><br><span class="line"># 0b11111111111111111111111111111101</span><br><span class="line"></span><br><span class="line">print(bin(0xfffffffd)) </span><br><span class="line"># 0b11111111111111111111111111111101</span><br><span class="line"></span><br><span class="line">print(0xfffffffd) # 4294967293</span><br><span class="line">0b11</span><br><span class="line">-0b11</span><br><span class="line">0b11111111111111111111111111111101</span><br><span class="line">0b11111111111111111111111111111101</span><br><span class="line">4294967293</span><br></pre></td></tr></table></figure><p>是不是很颠覆认知,我们从结果可以看出:</p><ul><li>Python中<code>bin</code>一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,巨坑。</li><li>Python中的整型是补码形式存储的。</li><li>Python中整型是不限制长度的不会超范围溢出。</li></ul><p>所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数<code>0xffffffff</code>进行按位与操作,再交给<code>bin()</code>进行输出,得到的才是负数的补码表示。</p>]]></content>
<summary type="html"><h1 id="位运算"><a href="#位运算" class="headerlink" title="位运算"></a>位运算</h1><p>[TOC]</p>
<h2 id="1-原码、反码和补码"><a href="#1-原码、反码和补码" class="headerl</summary>
<category term="计算机基础" scheme="https://wicherqaq.github.io/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/"/>
</entry>
<entry>
<title>python入门(中)</title>
<link href="https://wicherqaq.github.io/2020/09/10/python%E5%85%A5%E9%97%A8%EF%BC%88%E4%B8%AD%EF%BC%89/"/>
<id>https://wicherqaq.github.io/2020/09/10/python%E5%85%A5%E9%97%A8%EF%BC%88%E4%B8%AD%EF%BC%89/</id>
<published>2020-09-10T02:51:26.000Z</published>
<updated>2020-09-10T02:56:57.752Z</updated>
<content type="html"><![CDATA[<h1 id="Python入门-中"><a href="#Python入门-中" class="headerlink" title="Python入门(中)"></a>Python入门(中)</h1><p>[TOC]</p><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。本 Python 入门系列体验就是为这样的初学者精心准备的。</p><p><strong>本实验包括以下内容</strong>:</p><ol><li>列表<ul><li>列表的定义</li><li>列表的创建</li><li>向列表中添加元素</li><li>删除列表中的元素</li><li>获取列表中的元素</li><li>列表的常用操作符</li><li>列表的其他方法</li></ul></li><li>元组<ul><li>创建和访问一个元组</li><li>更新和删除一个元组</li><li>元组相关的操作符</li><li>内置方法</li><li>解压元组</li></ul></li><li>字符串<ul><li>字符串的定义</li><li>字符串的切片与拼接</li><li>字符串的常用内置方法</li><li>字符串格式化</li></ul></li><li>字典<ul><li>可变类型与不可变类型</li><li>字典的定义</li><li>创建和访问字典</li><li>字典的内置方法</li></ul></li><li>集合<ul><li>集合的创建</li><li>访问集合中的值</li><li>集合的内置方法</li><li>集合的转换</li><li>不可变集合</li></ul></li><li>序列<ul><li>针对序列的内置函数</li></ul></li></ol><h1 id="列表"><a href="#列表" class="headerlink" title="列表"></a>列表</h1><p>简单数据类型</p><ul><li>整型<code><class 'int'></code></li><li>浮点型<code><class 'float'></code></li><li>布尔型<code><class 'bool'></code></li></ul><p>容器数据类型</p><ul><li>列表<code><class 'list'></code></li><li>元组<code><class 'tuple'></code></li><li>字典<code><class 'dict'></code></li><li>集合<code><class 'set'></code></li><li>字符串<code><class 'str'></code></li></ul><h2 id="1-列表的定义"><a href="#1-列表的定义" class="headerlink" title="1. 列表的定义"></a>1. 列表的定义</h2><p>列表是有序集合,没有固定大小,能够保存任意数量任意类型的 Python 对象,语法为 <code>[元素1, 元素2, ..., 元素n]</code>。</p><ul><li>关键点是「中括号 []」和「逗号 ,」</li><li>中括号 把所有元素绑在一起</li><li>逗号 将每个元素一一分开</li></ul><h2 id="2-列表的创建"><a href="#2-列表的创建" class="headerlink" title="2. 列表的创建"></a>2. 列表的创建</h2><ul><li>创建一个普通列表</li></ul><p>【例子】</p><p>[1]:</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><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">x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">print(x, type(x))</span><br><span class="line"># ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] <class 'list'></span><br><span class="line"></span><br><span class="line">x = [2, 3, 4, 5, 6, 7]</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [2, 3, 4, 5, 6, 7] <class 'list'></span><br><span class="line">['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'] <class 'list'></span><br><span class="line">hello</span><br><span class="line">[2, 3, 4, 5, 6, 7] <class 'list'></span><br></pre></td></tr></table></figure><ul><li>利用<code>range()</code>创建列表</li></ul><p>【例子】</p><p>[2]:</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><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">x = list(range(10))</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'></span><br><span class="line"></span><br><span class="line">x = list(range(1, 11, 2))</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [1, 3, 5, 7, 9] <class 'list'></span><br><span class="line"></span><br><span class="line">x = list(range(10, 1, -2))</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [10, 8, 6, 4, 2] <class 'list'></span><br><span class="line">[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'></span><br><span class="line">[1, 3, 5, 7, 9] <class 'list'></span><br><span class="line">[10, 8, 6, 4, 2] <class 'list'></span><br></pre></td></tr></table></figure><ul><li>利用推导式创建列表</li></ul><p>【例子】</p><p>[3]:</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><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">x = [0] * 5</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [0, 0, 0, 0, 0] <class 'list'></span><br><span class="line"></span><br><span class="line">x = [0 for i in range(5)]</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [0, 0, 0, 0, 0] <class 'list'></span><br><span class="line"></span><br><span class="line">x = [i for i in range(10)]</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'></span><br><span class="line"></span><br><span class="line">x = [i for i in range(1, 10, 2)]</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [1, 3, 5, 7, 9] <class 'list'></span><br><span class="line"></span><br><span class="line">x = [i for i in range(10, 1, -2)]</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [10, 8, 6, 4, 2] <class 'list'></span><br><span class="line"></span><br><span class="line">x = [i ** 2 for i in range(1, 10)]</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [1, 4, 9, 16, 25, 36, 49, 64, 81] <class 'list'></span><br><span class="line"></span><br><span class="line">x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]</span><br><span class="line">print(x, type(x))</span><br><span class="line"></span><br><span class="line"># [3, 9, 15, 21, 27, 33, 39,</span><br><span class="line">[0, 0, 0, 0, 0] <class 'list'></span><br><span class="line">[0, 0, 0, 0, 0] <class 'list'></span><br><span class="line">[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] <class 'list'></span><br><span class="line">[1, 3, 5, 7, 9] <class 'list'></span><br><span class="line">[10, 8, 6, 4, 2] <class 'list'></span><br><span class="line">[1, 4, 9, 16, 25, 36, 49, 64, 81] <class 'list'></span><br><span class="line">[3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99] <class 'list'></span><br></pre></td></tr></table></figure><p>注意:</p><p>由于list的元素可以是任何对象,因此列表中所保存的是对象的指针。即使保存一个简单的<code>[1,2,3]</code>,也有3个指针和3个整数对象。</p><p><code>x = [a] * 4</code>操作中,只是创建4个指向list的引用,所以一旦<code>a</code>改变,<code>x</code>中4个<code>a</code>也会随之改变。</p><p>【例子】</p><p>[4]:</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><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">x = [[0] * 3] * 4</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'></span><br><span class="line"></span><br><span class="line">x[0][0] = 1</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'></span><br><span class="line"></span><br><span class="line">a = [0] * 3</span><br><span class="line">x = [a] * 4</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'></span><br><span class="line"></span><br><span class="line">x[0][0] = 1</span><br><span class="line">print(x, type(x))</span><br><span class="line"># [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'></span><br><span class="line">[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'></span><br><span class="line">[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'></span><br><span class="line">[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]] <class 'list'></span><br><span class="line">[[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]] <class 'list'></span><br></pre></td></tr></table></figure><ul><li>创建一个混合列表</li></ul><p>【例子】</p><p>[5]:</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">mix = [1, 'lsgo', 3.14, [1, 2, 3]]</span><br><span class="line">print(mix, type(mix)) </span><br><span class="line"># [1, 'lsgo', 3.14, [1, 2, 3]] <class 'list'></span><br><span class="line">[1, 'lsgo', 3.14, [1, 2, 3]] <class 'list'></span><br></pre></td></tr></table></figure><ul><li>创建一个空列表</li></ul><p>【例子】</p><p>[6]:</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></pre></td><td class="code"><pre><span class="line">empty = []</span><br><span class="line">print(empty, type(empty)) # [] <class 'list'></span><br><span class="line">[] <class 'list'></span><br></pre></td></tr></table></figure><p>列表不像元组,列表内容可更改 (mutable),因此附加 (<code>append</code>, <code>extend</code>)、插入 (<code>insert</code>)、删除 (<code>remove</code>, <code>pop</code>) 这些操作都可以用在它身上。</p><h2 id="3-向列表中添加元素"><a href="#3-向列表中添加元素" class="headerlink" title="3. 向列表中添加元素"></a>3. 向列表中添加元素</h2><ul><li><code>list.append(obj)</code> 在列表末尾添加新的对象,只接受一个参数,参数可以是任何数据类型,被追加的元素在 list 中保持着原结构类型。</li></ul><p>【例子】</p><p>[7]:</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><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">x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">x.append('Thursday')</span><br><span class="line">print(x) </span><br><span class="line"># ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Thursday']</span><br><span class="line"></span><br><span class="line">print(len(x)) # 6</span><br><span class="line">['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Thursday']</span><br><span class="line">6</span><br></pre></td></tr></table></figure><p>此元素如果是一个 list,那么这个 list 将作为一个整体进行追加,注意<code>append()</code>和<code>extend()</code>的区别。</p><p>【例子】</p><p>[8]:</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><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">x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">x.append(['Thursday', 'Sunday'])</span><br><span class="line">print(x) </span><br><span class="line"># ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', ['Thursday', 'Sunday']]</span><br><span class="line"></span><br><span class="line">print(len(x)) # 6</span><br><span class="line">['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', ['Thursday', 'Sunday']]</span><br><span class="line">6</span><br></pre></td></tr></table></figure><ul><li><code>list.extend(seq)</code> 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)</li></ul><p>【例子】</p><p>[9]:</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><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">x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">x.extend(['Thursday', 'Sunday'])</span><br><span class="line">print(x) </span><br><span class="line"># ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Thursday', 'Sunday']</span><br><span class="line"></span><br><span class="line">print(len(x)) # 7</span><br><span class="line">['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Thursday', 'Sunday']</span><br><span class="line">7</span><br></pre></td></tr></table></figure><p>严格来说 <code>append</code> 是追加,把一个东西整体添加在列表后,而 <code>extend</code> 是扩展,把一个东西里的所有元素添加在列表后。</p><ul><li><code>list.insert(index, obj)</code> 在编号 <code>index</code> 位置插入 <code>obj</code>。</li></ul><p>【例子】</p><p>[10]:</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><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">x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">x.insert(2, 'Sunday')</span><br><span class="line">print(x)</span><br><span class="line"># ['Monday', 'Tuesday', 'Sunday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line"></span><br><span class="line">print(len(x)) # 6</span><br><span class="line">['Monday', 'Tuesday', 'Sunday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">6</span><br></pre></td></tr></table></figure><h2 id="4-删除列表中的元素"><a href="#4-删除列表中的元素" class="headerlink" title="4. 删除列表中的元素"></a>4. 删除列表中的元素</h2><ul><li><code>list.remove(obj)</code> 移除列表中某个值的第一个匹配项</li></ul><p>【例子】</p><p>[11]:</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">x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">x.remove('Monday')</span><br><span class="line">print(x) # ['Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">['Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br></pre></td></tr></table></figure><ul><li><code>list.pop([index=-1])</code> 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值</li></ul><p>【例子】</p><p>[12]:</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><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">x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">y = x.pop()</span><br><span class="line">print(y) # Friday</span><br><span class="line"></span><br><span class="line">y = x.pop(0)</span><br><span class="line">print(y) # Monday</span><br><span class="line"></span><br><span class="line">y = x.pop(-2)</span><br><span class="line">print(y) # Wednesday</span><br><span class="line">print(x) # ['Tuesday', 'Thursday']</span><br><span class="line">Friday</span><br><span class="line">Monday</span><br><span class="line">Wednesday</span><br><span class="line">['Tuesday', 'Thursday']</span><br></pre></td></tr></table></figure><p><code>remove</code> 和 <code>pop</code> 都可以删除元素,前者是指定具体要删除的元素,后者是指定一个索引。</p><ul><li><code>del var1[, var2 ……]</code> 删除单个或多个对象。</li></ul><p>【例子】</p><p>如果知道要删除的元素在列表中的位置,可使用<code>del</code>语句。</p><p>[13]:</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">x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">del x[0:2]</span><br><span class="line">print(x) # ['Wednesday', 'Thursday', 'Friday']</span><br><span class="line">['Wednesday', 'Thursday', 'Friday']</span><br></pre></td></tr></table></figure><p>如果你要从列表中删除一个元素,且不再以任何方式使用它,就使用<code>del</code>语句;如果你要在删除元素后还能继续使用它,就使用方法<code>pop()</code>。</p><h2 id="5-获取列表中的元素"><a href="#5-获取列表中的元素" class="headerlink" title="5. 获取列表中的元素"></a>5. 获取列表中的元素</h2><ul><li>通过元素的索引值,从列表获取单个元素,注意,列表索引值是从0开始的。</li><li>通过将索引指定为-1,可让Python返回最后一个列表元素,索引 -2 返回倒数第二个列表元素,以此类推。</li></ul><p>【例子】</p><p>[14]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">x = ['Monday', 'Tuesday', 'Wednesday', ['Thursday', 'Friday']]</span><br><span class="line">print(x[0], type(x[0])) # Monday <class 'str'></span><br><span class="line">print(x[-1], type(x[-1])) # ['Thursday', 'Friday'] <class 'list'></span><br><span class="line">print(x[-2], type(x[-2])) # Wednesday <class 'str'></span><br><span class="line">Monday <class 'str'></span><br><span class="line">['Thursday', 'Friday'] <class 'list'></span><br><span class="line">Wednesday <class 'str'></span><br></pre></td></tr></table></figure><p>切片的通用写法是 <code>start : stop : step</code></p><ul><li>情况 1 - “start :”</li><li>以 <code>step</code> 为 1 (默认) 从编号 <code>start</code> 往列表尾部切片。</li></ul><p>【例子】</p><p>[15]:</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">x = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">print(x[3:]) # ['Thursday', 'Friday']</span><br><span class="line">print(x[-3:]) # ['Wednesday', 'Thursday', 'Friday']</span><br><span class="line">['Thursday', 'Friday']</span><br><span class="line">['Wednesday', 'Thursday', 'Friday']</span><br></pre></td></tr></table></figure><ul><li>情况 2 - “: stop”</li><li>以 <code>step</code> 为 1 (默认) 从列表头部往编号 <code>stop</code> 切片。</li></ul><p>【例子】</p><p>[16]:</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">week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">print(week[:3]) # ['Monday', 'Tuesday', 'Wednesday']</span><br><span class="line">print(week[:-3]) # ['Monday', 'Tuesday']</span><br><span class="line">['Monday', 'Tuesday', 'Wednesday']</span><br><span class="line">['Monday', 'Tuesday']</span><br></pre></td></tr></table></figure><ul><li>情况 3 - “start : stop”</li><li>以 <code>step</code> 为 1 (默认) 从编号 <code>start</code> 往编号 <code>stop</code> 切片。</li></ul><p>【例子】</p><p>[17]:</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">week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">print(week[1:3]) # ['Tuesday', 'Wednesday']</span><br><span class="line">print(week[-3:-1]) # ['Wednesday', 'Thursday']</span><br><span class="line">['Tuesday', 'Wednesday']</span><br><span class="line">['Wednesday', 'Thursday']</span><br></pre></td></tr></table></figure><ul><li>情况 4 - “start : stop : step”</li><li>以具体的 <code>step</code> 从编号 <code>start</code> 往编号 <code>stop</code> 切片。注意最后把 <code>step</code> 设为 -1,相当于将列表反向排列。</li></ul><p>【例子】</p><p>[18]:</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><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">week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">print(week[1:4:2]) # ['Tuesday', 'Thursday']</span><br><span class="line">print(week[:4:2]) # ['Monday', 'Wednesday']</span><br><span class="line">print(week[1::2]) # ['Tuesday', 'Thursday']</span><br><span class="line">print(week[::-1]) </span><br><span class="line"># ['Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']</span><br><span class="line">['Tuesday', 'Thursday']</span><br><span class="line">['Monday', 'Wednesday']</span><br><span class="line">['Tuesday', 'Thursday']</span><br><span class="line">['Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday']</span><br></pre></td></tr></table></figure><ul><li>情况 5 - “ : “</li><li>复制列表中的所有元素(浅拷贝)。</li></ul><p>【例子】</p><p>[19]:</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">eek = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">print(week[:]) </span><br><span class="line"># ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br><span class="line">['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']</span><br></pre></td></tr></table></figure><p>【例子】浅拷贝与深拷贝</p><p>[20]:</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><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">list1 = [123, 456, 789, 213]</span><br><span class="line">list2 = list1</span><br><span class="line">list3 = list1[:]</span><br><span class="line"></span><br><span class="line">print(list2) # [123, 456, 789, 213]</span><br><span class="line">print(list3) # [123, 456, 789, 213]</span><br><span class="line">list1.sort()</span><br><span class="line">print(list2) # [123, 213, 456, 789] </span><br><span class="line">print(list3) # [123, 456, 789, 213]</span><br><span class="line"></span><br><span class="line">list1 = [[123, 456], [789, 213]]</span><br><span class="line">list2 = list1</span><br><span class="line">list3 = list1[:]</span><br><span class="line">print(list2) # [[123, 456], [789, 213]]</span><br><span class="line">print(list3) # [[123, 456], [789, 213]]</span><br><span class="line">list1[0][0] = 111</span><br><span class="line">print(list2) # [[111, 456], [789, 213]]</span><br><span class="line">print(list3) # [[111, 456], [789, 213]]</span><br><span class="line">[123, 456, 789, 213]</span><br><span class="line">[123, 456, 789, 213]</span><br><span class="line">[123, 213, 456, 789]</span><br><span class="line">[123, 456, 789, 213]</span><br><span class="line">[[123, 456], [789, 213]]</span><br><span class="line">[[123, 456], [789, 213]]</span><br><span class="line">[[111, 456], [789, 213]]</span><br><span class="line">[[111, 456], [789, 213]]</span><br></pre></td></tr></table></figure><h2 id="6-列表的常用操作符"><a href="#6-列表的常用操作符" class="headerlink" title="6. 列表的常用操作符"></a>6. 列表的常用操作符</h2><ul><li>等号操作符:<code>==</code></li><li>连接操作符 <code>+</code></li><li>重复操作符 <code>*</code></li><li>成员关系操作符 <code>in</code>、<code>not in</code></li></ul><p>「等号 ==」,只有成员、成员位置都相同时才返回True。</p><p>列表拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。</p><p>【例子】</p><p>[21]:</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><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></pre></td><td class="code"><pre><span class="line">list1 = [123, 456]</span><br><span class="line">list2 = [456, 123]</span><br><span class="line">list3 = [123, 456]</span><br><span class="line"></span><br><span class="line">print(list1 == list2) # False</span><br><span class="line">print(list1 == list3) # True</span><br><span class="line"></span><br><span class="line">list4 = list1 + list2 # extend()</span><br><span class="line">print(list4) # [123, 456, 456, 123]</span><br><span class="line"></span><br><span class="line">list5 = list3 * 3</span><br><span class="line">print(list5) # [123, 456, 123, 456, 123, 456]</span><br><span class="line"></span><br><span class="line">list3 *= 3</span><br><span class="line">print(list3) # [123, 456, 123, 456, 123, 456]</span><br><span class="line"></span><br><span class="line">print(123 in list3) # True</span><br><span class="line">print(456 not in list3) # False</span><br><span class="line">False</span><br><span class="line">True</span><br><span class="line">[123, 456, 456, 123]</span><br><span class="line">[123, 456, 123, 456, 123, 456]</span><br><span class="line">[123, 456, 123, 456, 123, 456]</span><br><span class="line">True</span><br><span class="line">False</span><br></pre></td></tr></table></figure><p>前面三种方法(<code>append</code>, <code>extend</code>, <code>insert</code>)可对列表增加元素,它们没有返回值,是直接修改了原数据对象。 而将两个list相加,需要创建新的 list 对象,从而需要消耗额外的内存,特别是当 list 较大时,尽量不要使用 “+” 来添加list。</p><h2 id="7-列表的其它方法"><a href="#7-列表的其它方法" class="headerlink" title="7. 列表的其它方法"></a>7. 列表的其它方法</h2><p><code>list.count(obj)</code> 统计某个元素在列表中出现的次数</p><p>【例子】</p><p>[22]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">list1 = [123, 456] * 3</span><br><span class="line">print(list1) # [123, 456, 123, 456, 123, 456]</span><br><span class="line">num = list1.count(123)</span><br><span class="line">print(num) # 3</span><br><span class="line">[123, 456, 123, 456, 123, 456]</span><br><span class="line">3</span><br></pre></td></tr></table></figure><p><code>list.index(x[, start[, end]])</code> 从列表中找出某个值第一个匹配项的索引位置</p><p>【例子】</p><p>[23]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">list1 = [123, 456] * 5</span><br><span class="line">print(list1.index(123)) # 0</span><br><span class="line">print(list1.index(123, 1)) # 2</span><br><span class="line">print(list1.index(123, 3, 7)) # 4</span><br><span class="line">0</span><br><span class="line">2</span><br><span class="line">4</span><br></pre></td></tr></table></figure><p><code>list.reverse()</code> 反向列表中元素</p><p>【例子】</p><p>[24]:</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">x = [123, 456, 789]</span><br><span class="line">x.reverse()</span><br><span class="line">print(x) # [789, 456, 123]</span><br><span class="line">[789, 456, 123]</span><br></pre></td></tr></table></figure><p><code>list.sort(key=None, reverse=False)</code> 对原列表进行排序。</p><ul><li><code>key</code> – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。</li><li><code>reverse</code> – 排序规则,<code>reverse = True</code> 降序, <code>reverse = False</code> 升序(默认)。</li><li>该方法没有返回值,但是会对列表的对象进行排序。</li></ul><p>【例子】</p><p>[25]:</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><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">x = [123, 456, 789, 213]</span><br><span class="line">x.sort()</span><br><span class="line">print(x)</span><br><span class="line"># [123, 213, 456, 789]</span><br><span class="line"></span><br><span class="line">x.sort(reverse=True)</span><br><span class="line">print(x)</span><br><span class="line"># [789, 456, 213, 123]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># 获取列表的第二个元素</span><br><span class="line">def takeSecond(elem):</span><br><span class="line"> return elem[1]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">x = [(2, 2), (3, 4), (4, 1), (1, 3)]</span><br><span class="line">x.sort(key=takeSecond)</span><br><span class="line">print(x)</span><br><span class="line"># [(4, 1), (2, 2), (1, 3), (3, 4)]</span><br><span class="line"></span><br><span class="line">x.sort(key=lambda a: a[0])</span><br><span class="line">print(x)</span><br><span class="line"># [(1, 3), (2, 2), (3, 4), (4, 1)]</span><br><span class="line">[123, 213, 456, 789]</span><br><span class="line">[789, 456, 213, 123]</span><br><span class="line">[(4, 1), (2, 2), (1, 3), (3, 4)]</span><br><span class="line">[(1, 3), (2, 2), (3, 4), (4, 1)]</span><br></pre></td></tr></table></figure><h1 id="元组"><a href="#元组" class="headerlink" title="元组"></a>元组</h1><p>「元组」定义语法为:<code>(元素1, 元素2, ..., 元素n)</code></p><ul><li>小括号把所有元素绑在一起</li><li>逗号将每个元素一一分开</li></ul><h2 id="1-创建和访问一个元组"><a href="#1-创建和访问一个元组" class="headerlink" title="1. 创建和访问一个元组"></a>1. 创建和访问一个元组</h2><ul><li>Python 的元组与列表类似,不同之处在于tuple被创建后就不能对其进行修改,类似字符串。</li><li>元组使用小括号,列表使用方括号。</li><li>元组与列表类似,也用整数来对它进行索引 (indexing) 和切片 (slicing)。</li></ul><p>【例子】</p><p>[26]:</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><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">t1 = (1, 10.31, 'python')</span><br><span class="line">t2 = 1, 10.31, 'python'</span><br><span class="line">print(t1, type(t1))</span><br><span class="line"># (1, 10.31, 'python') <class 'tuple'></span><br><span class="line"></span><br><span class="line">print(t2, type(t2))</span><br><span class="line"># (1, 10.31, 'python') <class 'tuple'></span><br><span class="line"></span><br><span class="line">tuple1 = (1, 2, 3, 4, 5, 6, 7, 8)</span><br><span class="line">print(tuple1[1]) # 2</span><br><span class="line">print(tuple1[5:]) # (6, 7, 8)</span><br><span class="line">print(tuple1[:5]) # (1, 2, 3, 4, 5)</span><br><span class="line">tuple2 = tuple1[:]</span><br><span class="line">print(tuple2) # (1, 2, 3, 4, 5, 6, 7, 8)</span><br><span class="line">(1, 10.31, 'python') <class 'tuple'></span><br><span class="line">(1, 10.31, 'python') <class 'tuple'></span><br><span class="line">2</span><br><span class="line">(6, 7, 8)</span><br><span class="line">(1, 2, 3, 4, 5)</span><br><span class="line">(1, 2, 3, 4, 5, 6, 7, 8)</span><br></pre></td></tr></table></figure><ul><li>创建元组可以用小括号 (),也可以什么都不用,为了可读性,建议还是用 ()。</li><li>元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用。</li></ul><p>【例子】</p><p>[27]:</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><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">x = (1)</span><br><span class="line">print(type(x)) # <class 'int'></span><br><span class="line">x = 2, 3, 4, 5</span><br><span class="line">print(type(x)) # <class 'tuple'></span><br><span class="line">x = []</span><br><span class="line">print(type(x)) # <class 'list'></span><br><span class="line">x = ()</span><br><span class="line">print(type(x)) # <class 'tuple'></span><br><span class="line">x = (1,)</span><br><span class="line">print(type(x)) # <class 'tuple'></span><br><span class="line"><class 'int'></span><br><span class="line"><class 'tuple'></span><br><span class="line"><class 'list'></span><br><span class="line"><class 'tuple'></span><br><span class="line"><class 'tuple'></span><br></pre></td></tr></table></figure><p>【例子】</p><p>[28]:</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">print(8 * (8)) # 64</span><br><span class="line">print(8 * (8,)) # (8, 8, 8, 8, 8, 8, 8, 8)</span><br><span class="line">64</span><br><span class="line">(8, 8, 8, 8, 8, 8, 8, 8)</span><br></pre></td></tr></table></figure><p>【例子】创建二维元组。</p><p>[29]:</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><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">x = (1, 10.31, 'python'), ('data', 11)</span><br><span class="line">print(x)</span><br><span class="line"># ((1, 10.31, 'python'), ('data', 11))</span><br><span class="line"></span><br><span class="line">print(x[0])</span><br><span class="line"># (1, 10.31, 'python')</span><br><span class="line">print(x[0][0], x[0][1], x[0][2])</span><br><span class="line"># 1 10.31 python</span><br><span class="line"></span><br><span class="line">print(x[0][0:2])</span><br><span class="line"># (1, 10.31)</span><br><span class="line">((1, 10.31, 'python'), ('data', 11))</span><br><span class="line">(1, 10.31, 'python')</span><br><span class="line">1 10.31 python</span><br><span class="line">(1, 10.31)</span><br></pre></td></tr></table></figure><h2 id="2-更新和删除一个元组"><a href="#2-更新和删除一个元组" class="headerlink" title="2. 更新和删除一个元组"></a>2. 更新和删除一个元组</h2><p>【例子】</p><p>[30]:</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">week = ('Monday', 'Tuesday', 'Thursday', 'Friday')</span><br><span class="line">week = week[:2] + ('Wednesday',) + week[2:]</span><br><span class="line">print(week) # ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')</span><br><span class="line">('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')</span><br></pre></td></tr></table></figure><p>【例子】元组有不可更改 (immutable) 的性质,因此不能直接给元组的元素赋值,但是只要元组中的元素可更改 (mutable),那么我们可以直接更改其元素,注意这跟赋值其元素不同。</p><p>[31]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">t1 = (1, 2, 3, [4, 5, 6])</span><br><span class="line">print(t1) # (1, 2, 3, [4, 5, 6])</span><br><span class="line"></span><br><span class="line">t1[3][0] = 9</span><br><span class="line">print(t1) # (1, 2, 3, [9, 5, 6])</span><br><span class="line">(1, 2, 3, [4, 5, 6])</span><br><span class="line">(1, 2, 3, [9, 5, 6])</span><br></pre></td></tr></table></figure><h2 id="3-元组相关的操作符"><a href="#3-元组相关的操作符" class="headerlink" title="3. 元组相关的操作符"></a>3. 元组相关的操作符</h2><ul><li>等号操作符:<code>==</code></li><li>连接操作符 <code>+</code></li><li>重复操作符 <code>*</code></li><li>成员关系操作符 <code>in</code>、<code>not in</code></li></ul><p>「等号 ==」,只有成员、成员位置都相同时才返回True。</p><p>元组拼接有两种方式,用「加号 +」和「乘号 *」,前者首尾拼接,后者复制拼接。</p><p>【例子】</p><p>[32]:</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><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></pre></td><td class="code"><pre><span class="line">t1 = (123, 456)</span><br><span class="line">t2 = (456, 123)</span><br><span class="line">t3 = (123, 456)</span><br><span class="line"></span><br><span class="line">print(t1 == t2) # False</span><br><span class="line">print(t1 == t3) # True</span><br><span class="line"></span><br><span class="line">t4 = t1 + t2</span><br><span class="line">print(t4) # (123, 456, 456, 123)</span><br><span class="line"></span><br><span class="line">t5 = t3 * 3</span><br><span class="line">print(t5) # (123, 456, 123, 456, 123, 456)</span><br><span class="line"></span><br><span class="line">t3 *= 3</span><br><span class="line">print(t3) # (123, 456, 123, 456, 123, 456)</span><br><span class="line"></span><br><span class="line">print(123 in t3) # True</span><br><span class="line">print(456 not in t3) # False</span><br><span class="line">False</span><br><span class="line">True</span><br><span class="line">(123, 456, 456, 123)</span><br><span class="line">(123, 456, 123, 456, 123, 456)</span><br><span class="line">(123, 456, 123, 456, 123, 456)</span><br><span class="line">True</span><br><span class="line">False</span><br></pre></td></tr></table></figure><h2 id="4-内置方法"><a href="#4-内置方法" class="headerlink" title="4. 内置方法"></a>4. 内置方法</h2><p>元组大小和内容都不可更改,因此只有 <code>count</code> 和 <code>index</code> 两种方法。</p><p>【例子】</p><p>[33]:</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">t = (1, 10.31, 'python')</span><br><span class="line">print(t.count('python')) # 1</span><br><span class="line">print(t.index(10.31)) # 1</span><br><span class="line">1</span><br><span class="line">1</span><br></pre></td></tr></table></figure><ul><li><code>count('python')</code> 是记录在元组 <code>t</code> 中该元素出现几次,显然是 1 次</li><li><code>index(10.31)</code> 是找到该元素在元组 <code>t</code> 的索引,显然是 1</li></ul><h2 id="5-解压元组"><a href="#5-解压元组" class="headerlink" title="5. 解压元组"></a>5. 解压元组</h2><p>【例子】解压(unpack)一维元组(有几个元素左边括号定义几个变量)</p><p>[34]:</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">t = (1, 10.31, 'python')</span><br><span class="line">(a, b, c) = t</span><br><span class="line">print(a, b, c)</span><br><span class="line"># 1 10.31 python</span><br><span class="line">1 10.31 python</span><br></pre></td></tr></table></figure><p>【例子】解压二维元组(按照元组里的元组结构来定义变量)</p><p>[35]:</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">t = (1, 10.31, ('OK', 'python'))</span><br><span class="line">(a, b, (c, d)) = t</span><br><span class="line">print(a, b, c, d)</span><br><span class="line"># 1 10.31 OK python</span><br><span class="line">1 10.31 OK python</span><br></pre></td></tr></table></figure><p>【例子】如果你只想要元组其中几个元素,用通配符「*」,英文叫 wildcard,在计算机语言中代表一个或多个元素。下例就是把多个元素丢给了 <code>rest</code> 变量。</p><p>[36]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">t = 1, 2, 3, 4, 5</span><br><span class="line">a, b, *rest, c = t</span><br><span class="line">print(a, b, c) # 1 2 5</span><br><span class="line">print(rest) # [3, 4]</span><br><span class="line">1 2 5</span><br><span class="line">[3, 4]</span><br></pre></td></tr></table></figure><p>【例子】如果你根本不在乎 rest 变量,那么就用通配符「*」加上下划线「_」。</p><p>[37]:</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">t = 1, 2, 3, 4, 5</span><br><span class="line">a, b, *_ = t</span><br><span class="line">print(a, b) # 1 2</span><br><span class="line">1 2</span><br></pre></td></tr></table></figure><h1 id="字符串"><a href="#字符串" class="headerlink" title="字符串"></a>字符串</h1><h2 id="1-字符串的定义"><a href="#1-字符串的定义" class="headerlink" title="1. 字符串的定义"></a>1. 字符串的定义</h2><ul><li>Python 中字符串被定义为引号之间的字符集合。</li><li>Python 支持使用成对的 单引号 或 双引号。</li></ul><p>【例子】</p><p>[38]:</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><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">t1 = 'i love Python!'</span><br><span class="line">print(t1, type(t1))</span><br><span class="line"># i love Python! <class 'str'></span><br><span class="line"></span><br><span class="line">t2 = "I love Python!"</span><br><span class="line">print(t2, type(t2))</span><br><span class="line"># I love Python! <class 'str'></span><br><span class="line"></span><br><span class="line">print(5 + 8) # 13</span><br><span class="line">print('5' + '8') # 58</span><br><span class="line">i love Python! <class 'str'></span><br><span class="line">I love Python! <class 'str'></span><br><span class="line">13</span><br><span class="line">58</span><br></pre></td></tr></table></figure><ul><li>Python 的常用转义字符</li></ul><table><thead><tr><th>转义字符</th><th>描述</th></tr></thead><tbody><tr><td><code>\\</code></td><td>反斜杠符号</td></tr><tr><td><code>\'</code></td><td>单引号</td></tr><tr><td><code>\"</code></td><td>双引号</td></tr><tr><td><code>\n</code></td><td>换行</td></tr><tr><td><code>\t</code></td><td>横向制表符(TAB)</td></tr><tr><td><code>\r</code></td><td>回车</td></tr></tbody></table><p>【例子】如果字符串中需要出现单引号或双引号,可以使用转义符号<code>\</code>对字符串中的符号进行转义。</p><p>[39]:</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><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">print('let\'s go') # let's go</span><br><span class="line">print("let's go") # let's go</span><br><span class="line">print('C:\\now') # C:\now</span><br><span class="line">print("C:\\Program Files\\Intel\\Wifi\\Help")</span><br><span class="line"># C:\Program Files\Intel\Wifi\Help</span><br><span class="line">let's go</span><br><span class="line">let's go</span><br><span class="line">C:\now</span><br><span class="line">C:\Program Files\Intel\Wifi\Help</span><br></pre></td></tr></table></figure><p>【例子】原始字符串只需要在字符串前边加一个英文字母 r 即可。</p><p>[40]:</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></pre></td><td class="code"><pre><span class="line">print(r'C:\Program Files\Intel\Wifi\Help') </span><br><span class="line"># C:\Program Files\Intel\Wifi\Help</span><br><span class="line">C:\Program Files\Intel\Wifi\Help</span><br></pre></td></tr></table></figure><p>【例子】三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。</p><p>[41]:</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><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></pre></td><td class="code"><pre><span class="line">para_str = """这是一个多行字符串的实例</span><br><span class="line">多行字符串可以使用制表符</span><br><span class="line">TAB ( \t )。</span><br><span class="line">也可以使用换行符 [ \n ]。</span><br><span class="line">"""</span><br><span class="line">print(para_str)</span><br><span class="line"># 这是一个多行字符串的实例</span><br><span class="line"># 多行字符串可以使用制表符</span><br><span class="line"># TAB ( )。</span><br><span class="line"># 也可以使用换行符 [</span><br><span class="line"># ]。</span><br><span class="line"></span><br><span class="line">para_str = '''这是一个多行字符串的实例</span><br><span class="line">多行字符串可以使用制表符</span><br><span class="line">TAB ( \t )。</span><br><span class="line">也可以使用换行符 [ \n ]。</span><br><span class="line">'''</span><br><span class="line">print(para_str)</span><br><span class="line"># 这是一个多行字符串的实例</span><br><span class="line"># 多行字符串可以使用制表符</span><br><span class="line"># TAB ( )。</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">TAB ( )。</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">多行字符串可以使用制表符</span><br><span class="line">TAB ( )。</span><br><span class="line">也可以使用换行符 [ </span><br><span class="line"> ]。</span><br></pre></td></tr></table></figure><h2 id="2-字符串的切片与拼接"><a href="#2-字符串的切片与拼接" class="headerlink" title="2. 字符串的切片与拼接"></a>2. 字符串的切片与拼接</h2><ul><li>类似于元组具有不可修改性</li><li>从 0 开始 (和 Java 一样)</li><li>切片通常写成 <code>start:end</code> 这种形式,包括「<code>start</code> 索引」对应的元素,不包括「<code>end</code>索引」对应的元素。</li><li>索引值可正可负,正索引从 0 开始,从左往右;负索引从 -1 开始,从右往左。使用负数索引时,会从最后一个元素开始计数。最后一个元素的位置编号是 -1。</li></ul><p>【例子】</p><p>[42]:</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><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">str1 = 'I Love LsgoGroup'</span><br><span class="line">print(str1[:6]) # I Love</span><br><span class="line">print(str1[5]) # e</span><br><span class="line">print(str1[:6] + " 插入的字符串 " + str1[6:]) </span><br><span class="line"># I Love 插入的字符串 LsgoGroup</span><br><span class="line"></span><br><span class="line">s = 'Python'</span><br><span class="line">print(s) # Python</span><br><span class="line">print(s[2:4]) # th</span><br><span class="line">print(s[-5:-2]) # yth</span><br><span class="line">print(s[2]) # t</span><br><span class="line">print(s[-1]) # n</span><br><span class="line">I Love</span><br><span class="line">e</span><br><span class="line">I Love 插入的字符串 LsgoGroup</span><br><span class="line">Python</span><br><span class="line">th</span><br><span class="line">yth</span><br><span class="line">t</span><br><span class="line">n</span><br></pre></td></tr></table></figure><h2 id="3-字符串的常用内置方法"><a href="#3-字符串的常用内置方法" class="headerlink" title="3. 字符串的常用内置方法"></a>3. 字符串的常用内置方法</h2><ul><li><code>capitalize()</code> 将字符串的第一个字符转换为大写。</li></ul><p>【例子】</p><p>[43]:</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></pre></td><td class="code"><pre><span class="line">str2 = 'xiaoxie'</span><br><span class="line">print(str2.capitalize()) # Xiaoxie</span><br><span class="line">Xiaoxie</span><br></pre></td></tr></table></figure><ul><li><code>lower()</code> 转换字符串中所有大写字符为小写。</li><li><code>upper()</code> 转换字符串中的小写字母为大写。</li><li><code>swapcase()</code> 将字符串中大写转换为小写,小写转换为大写。</li></ul><p>【例子】</p><p>[44]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">str2 = "DAXIExiaoxie"</span><br><span class="line">print(str2.lower()) # daxiexiaoxie</span><br><span class="line">print(str2.upper()) # DAXIEXIAOXIE</span><br><span class="line">print(str2.swapcase()) # daxieXIAOXIE</span><br><span class="line">daxiexiaoxie</span><br><span class="line">DAXIEXIAOXIE</span><br><span class="line">daxieXIAOXIE</span><br></pre></td></tr></table></figure><ul><li><code>count(str, beg= 0,end=len(string))</code> 返回<code>str</code>在 string 里面出现的次数,如果<code>beg</code>或者<code>end</code>指定则返回指定范围内<code>str</code>出现的次数。</li></ul><p>【例子】</p><p>[45]:</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></pre></td><td class="code"><pre><span class="line">str2 = "DAXIExiaoxie"</span><br><span class="line">print(str2.count('xi')) # 2</span><br><span class="line">2</span><br></pre></td></tr></table></figure><ul><li><code>endswith(suffix, beg=0, end=len(string))</code> 检查字符串是否以指定子字符串 <code>suffix</code> 结束,如果是,返回 True,否则返回 False。如果 <code>beg</code> 和 <code>end</code> 指定值,则在指定范围内检查。</li><li><code>startswith(substr, beg=0,end=len(string))</code> 检查字符串是否以指定子字符串 <code>substr</code> 开头,如果是,返回 True,否则返回 False。如果 <code>beg</code> 和 <code>end</code> 指定值,则在指定范围内检查。</li></ul><p>【例子】</p><p>[46]:</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><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">str2 = "DAXIExiaoxie"</span><br><span class="line">print(str2.endswith('ie')) # True</span><br><span class="line">print(str2.endswith('xi')) # False</span><br><span class="line">print(str2.startswith('Da')) # False</span><br><span class="line">print(str2.startswith('DA')) # True</span><br><span class="line">True</span><br><span class="line">False</span><br><span class="line">False</span><br><span class="line">True</span><br></pre></td></tr></table></figure><ul><li><code>find(str, beg=0, end=len(string))</code> 检测 <code>str</code> 是否包含在字符串中,如果指定范围 <code>beg</code> 和 <code>end</code>,则检查是否包含在指定范围内,如果包含,返回开始的索引值,否则返回 -1。</li><li><code>rfind(str, beg=0,end=len(string))</code> 类似于 <code>find()</code> 函数,不过是从右边开始查找。</li></ul><p>【例子】</p><p>[47]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">str2 = "DAXIExiaoxie"</span><br><span class="line">print(str2.find('xi')) # 5</span><br><span class="line">print(str2.find('ix')) # -1</span><br><span class="line">print(str2.rfind('xi')) # 9</span><br><span class="line">5</span><br><span class="line">-1</span><br><span class="line">9</span><br></pre></td></tr></table></figure><ul><li><code>isnumeric()</code> 如果字符串中只包含数字字符,则返回 True,否则返回 False。</li></ul><p>【例子】</p><p>[48]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">str3 = '12345'</span><br><span class="line">print(str3.isnumeric()) # True</span><br><span class="line">str3 += 'a'</span><br><span class="line">print(str3.isnumeric()) # False</span><br><span class="line">True</span><br><span class="line">False</span><br></pre></td></tr></table></figure><ul><li><code>ljust(width[, fillchar])</code>返回一个原字符串左对齐,并使用<code>fillchar</code>(默认空格)填充至长度<code>width</code>的新字符串。</li><li><code>rjust(width[, fillchar])</code>返回一个原字符串右对齐,并使用<code>fillchar</code>(默认空格)填充至长度<code>width</code>的新字符串。</li></ul><p>【例子】</p><p>[49]:</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">str4 = '1101'</span><br><span class="line">print(str4.ljust(8, '0')) # 11010000</span><br><span class="line">print(str4.rjust(8, '0')) # 00001101</span><br><span class="line">11010000</span><br><span class="line">00001101</span><br></pre></td></tr></table></figure><ul><li><code>lstrip([chars])</code> 截掉字符串左边的空格或指定字符。</li><li><code>rstrip([chars])</code> 删除字符串末尾的空格或指定字符。</li><li><code>strip([chars])</code> 在字符串上执行<code>lstrip()</code>和<code>rstrip()</code>。</li></ul><p>【例子】</p><p>[50]:</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><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">str5 = ' I Love LsgoGroup '</span><br><span class="line">print(str5.lstrip()) # 'I Love LsgoGroup '</span><br><span class="line">print(str5.lstrip().strip('I')) # ' Love LsgoGroup '</span><br><span class="line">print(str5.rstrip()) # ' I Love LsgoGroup'</span><br><span class="line">print(str5.strip()) # 'I Love LsgoGroup'</span><br><span class="line">print(str5.strip().strip('p')) # 'I Love LsgoGrou'</span><br><span class="line">I Love LsgoGroup </span><br><span class="line"> Love LsgoGroup </span><br><span class="line"> I Love LsgoGroup</span><br><span class="line">I Love LsgoGroup</span><br><span class="line">I Love LsgoGrou</span><br></pre></td></tr></table></figure><ul><li><code>partition(sub)</code> 找到子字符串sub,把字符串分为一个三元组<code>(pre_sub,sub,fol_sub)</code>,如果字符串中不包含sub则返回<code>('原字符串','','')</code>。</li><li><code>rpartition(sub)</code>类似于<code>partition()</code>方法,不过是从右边开始查找。</li></ul><p>【例子】</p><p>[51]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">str5 = ' I Love LsgoGroup '</span><br><span class="line">print(str5.strip().partition('o')) # ('I L', 'o', 've LsgoGroup')</span><br><span class="line">print(str5.strip().partition('m')) # ('I Love LsgoGroup', '', '')</span><br><span class="line">print(str5.strip().rpartition('o')) # ('I Love LsgoGr', 'o', 'up')</span><br><span class="line">('I L', 'o', 've LsgoGroup')</span><br><span class="line">('I Love LsgoGroup', '', '')</span><br><span class="line">('I Love LsgoGr', 'o', 'up')</span><br></pre></td></tr></table></figure><ul><li><code>replace(old, new [, max])</code> 把 将字符串中的<code>old</code>替换成<code>new</code>,如果<code>max</code>指定,则替换不超过<code>max</code>次。</li></ul><p>【例子】</p><p>[52]:</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></pre></td><td class="code"><pre><span class="line">str5 = ' I Love LsgoGroup '</span><br><span class="line">print(str5.strip().replace('I', 'We')) # We Love LsgoGroup</span><br><span class="line">We Love LsgoGroup</span><br></pre></td></tr></table></figure><ul><li><code>split(str="", num)</code> 不带参数默认是以空格为分隔符切片字符串,如果<code>num</code>参数有设置,则仅分隔<code>num</code>个子字符串,返回切片后的子字符串拼接的列表。</li></ul><p>【例子】</p><p>[53]:</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">str5 = ' I Love LsgoGroup '</span><br><span class="line">print(str5.strip().split()) # ['I', 'Love', 'LsgoGroup']</span><br><span class="line">print(str5.strip().split('o')) # ['I L', 've Lsg', 'Gr', 'up']</span><br><span class="line">['I', 'Love', 'LsgoGroup']</span><br><span class="line">['I L', 've Lsg', 'Gr', 'up']</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[54]:</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><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></pre></td><td class="code"><pre><span class="line">u = "www.baidu.com.cn"</span><br><span class="line"># 使用默认分隔符</span><br><span class="line">print(u.split()) # ['www.baidu.com.cn']</span><br><span class="line"></span><br><span class="line"># 以"."为分隔符</span><br><span class="line">print((u.split('.'))) # ['www', 'baidu', 'com', 'cn']</span><br><span class="line"></span><br><span class="line"># 分割0次</span><br><span class="line">print((u.split(".", 0))) # ['www.baidu.com.cn']</span><br><span class="line"></span><br><span class="line"># 分割一次</span><br><span class="line">print((u.split(".", 1))) # ['www', 'baidu.com.cn']</span><br><span class="line"></span><br><span class="line"># 分割两次</span><br><span class="line">print(u.split(".", 2)) # ['www', 'baidu', 'com.cn']</span><br><span class="line"></span><br><span class="line"># 分割两次,并取序列为1的项</span><br><span class="line">print((u.split(".", 2)[1])) # baidu</span><br><span class="line"></span><br><span class="line"># 分割两次,并把分割后的三个部分保存到三个变量</span><br><span class="line">u1, u2, u3 = u.split(".", 2)</span><br><span class="line">print(u1) # www</span><br><span class="line">print(u2) # baidu</span><br><span class="line">print(u3) # com.cn</span><br><span class="line">['www.baidu.com.cn']</span><br><span class="line">['www', 'baidu', 'com', 'cn']</span><br><span class="line">['www.baidu.com.cn']</span><br><span class="line">['www', 'baidu.com.cn']</span><br><span class="line">['www', 'baidu', 'com.cn']</span><br><span class="line">baidu</span><br><span class="line">www</span><br><span class="line">baidu</span><br><span class="line">com.cn</span><br></pre></td></tr></table></figure><p>【例子】去掉换行符</p><p>[55]:</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><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">c = '''say</span><br><span class="line">hello</span><br><span class="line">baby'''</span><br><span class="line"></span><br><span class="line">print(c)</span><br><span class="line"># say</span><br><span class="line"># hello</span><br><span class="line"># baby</span><br><span class="line"></span><br><span class="line">print(c.split('\n')) # ['say', 'hello', 'baby']</span><br><span class="line">say</span><br><span class="line">hello</span><br><span class="line">baby</span><br><span class="line">['say', 'hello', 'baby']</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[56]:</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">string = "hello boy<[www.baidu.com]>byebye"</span><br><span class="line">print(string.split('[')[1].split(']')[0]) # www.baidu.com</span><br><span class="line">print(string.split('[')[1].split(']')[0].split('.')) # ['www', 'baidu', 'com']</span><br><span class="line">www.baidu.com</span><br><span class="line">['www', 'baidu', 'com']</span><br></pre></td></tr></table></figure><ul><li><code>splitlines([keepends])</code> 按照行(‘\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数<code>keepends</code>为 False,不包含换行符,如果为 True,则保留换行符。</li></ul><p>【例子】</p><p>[57]:</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">str6 = 'I \n Love \n LsgoGroup'</span><br><span class="line">print(str6.splitlines()) # ['I ', ' Love ', ' LsgoGroup']</span><br><span class="line">print(str6.splitlines(True)) # ['I \n', ' Love \n', ' LsgoGroup']</span><br><span class="line">['I ', ' Love ', ' LsgoGroup']</span><br><span class="line">['I \n', ' Love \n', ' LsgoGroup']</span><br></pre></td></tr></table></figure><ul><li><code>maketrans(intab, outtab)</code> 创建字符映射的转换表,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。</li><li><code>translate(table, deletechars="")</code> 根据参数<code>table</code>给出的表,转换字符串的字符,要过滤掉的字符放到<code>deletechars</code>参数中。</li></ul><p>【例子】</p><p>[58]:</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><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">str7 = 'this is string example....wow!!!'</span><br><span class="line">intab = 'aeiou'</span><br><span class="line">outtab = '12345'</span><br><span class="line">trantab = str7.maketrans(intab, outtab)</span><br><span class="line">print(trantab) # {97: 49, 111: 52, 117: 53, 101: 50, 105: 51}</span><br><span class="line">print(str7.translate(trantab)) # th3s 3s str3ng 2x1mpl2....w4w!!!</span><br><span class="line">{97: 49, 101: 50, 105: 51, 111: 52, 117: 53}</span><br><span class="line">th3s 3s str3ng 2x1mpl2....w4w!!!</span><br></pre></td></tr></table></figure><h2 id="4-字符串格式化"><a href="#4-字符串格式化" class="headerlink" title="4. 字符串格式化"></a>4. 字符串格式化</h2><ul><li><code>format</code> 格式化函数</li></ul><p>【例子】</p><p>[59]:</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><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">str8 = "{0} Love {1}".format('I', 'Lsgogroup') # 位置参数</span><br><span class="line">print(str8) # I Love Lsgogroup</span><br><span class="line"></span><br><span class="line">str8 = "{a} Love {b}".format(a='I', b='Lsgogroup') # 关键字参数</span><br><span class="line">print(str8) # I Love Lsgogroup</span><br><span class="line"></span><br><span class="line">str8 = "{0} Love {b}".format('I', b='Lsgogroup') # 位置参数要在关键字参数之前</span><br><span class="line">print(str8) # I Love Lsgogroup</span><br><span class="line"></span><br><span class="line">str8 = '{0:.2f}{1}'.format(27.658, 'GB') # 保留小数点后两位</span><br><span class="line">print(str8) # 27.66GB</span><br><span class="line">I Love Lsgogroup</span><br><span class="line">I Love Lsgogroup</span><br><span class="line">I Love Lsgogroup</span><br><span class="line">27.66GB</span><br></pre></td></tr></table></figure><ul><li>Python 字符串格式化符号</li></ul><table><thead><tr><th>符 号</th><th>描述</th></tr></thead><tbody><tr><td>%c</td><td>格式化字符及其ASCII码</td></tr><tr><td>%s</td><td>格式化字符串,用str()方法处理对象</td></tr><tr><td>%r</td><td>格式化字符串,用rper()方法处理对象</td></tr><tr><td>%d</td><td>格式化整数</td></tr><tr><td>%o</td><td>格式化无符号八进制数</td></tr><tr><td>%x</td><td>格式化无符号十六进制数</td></tr><tr><td>%X</td><td>格式化无符号十六进制数(大写)</td></tr><tr><td>%f</td><td>格式化浮点数字,可指定小数点后的精度</td></tr><tr><td>%e</td><td>用科学计数法格式化浮点数</td></tr><tr><td>%E</td><td>作用同%e,用科学计数法格式化浮点数</td></tr><tr><td>%g</td><td>根据值的大小决定使用%f或%e</td></tr><tr><td>%G</td><td>作用同%g,根据值的大小决定使用%f或%E</td></tr></tbody></table><p>【例子】</p><p>[60]:</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><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">print('%c' % 97) # a</span><br><span class="line">print('%c %c %c' % (97, 98, 99)) # a b c</span><br><span class="line">print('%d + %d = %d' % (4, 5, 9)) # 4 + 5 = 9</span><br><span class="line">print("我叫 %s 今年 %d 岁!" % ('小明', 10)) # 我叫 小明 今年 10 岁!</span><br><span class="line">print('%o' % 10) # 12</span><br><span class="line">print('%x' % 10) # a</span><br><span class="line">print('%X' % 10) # A</span><br><span class="line">print('%f' % 27.658) # 27.658000</span><br><span class="line">print('%e' % 27.658) # 2.765800e+01</span><br><span class="line">print('%E' % 27.658) # 2.765800E+01</span><br><span class="line">print('%g' % 27.658) # 27.658</span><br><span class="line">text = "I am %d years old." % 22</span><br><span class="line">print("I said: %s." % text) # I said: I am 22 years old..</span><br><span class="line">print("I said: %r." % text) # I said: 'I am 22 years old.'</span><br><span class="line">a</span><br><span class="line">a b c</span><br><span class="line">4 + 5 = 9</span><br><span class="line">我叫 小明 今年 10 岁!</span><br><span class="line">12</span><br><span class="line">a</span><br><span class="line">A</span><br><span class="line">27.658000</span><br><span class="line">2.765800e+01</span><br><span class="line">2.765800E+01</span><br><span class="line">27.658</span><br><span class="line">I said: I am 22 years old..</span><br><span class="line">I said: 'I am 22 years old.'.</span><br></pre></td></tr></table></figure><ul><li>格式化操作符辅助指令</li></ul><table><thead><tr><th>符号</th><th>功能</th></tr></thead><tbody><tr><td><code>m.n</code></td><td>m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话)</td></tr><tr><td><code>-</code></td><td>用作左对齐</td></tr><tr><td><code>+</code></td><td>在正数前面显示加号( + )</td></tr><tr><td><code>#</code></td><td>在八进制数前面显示零(‘0’),在十六进制前面显示’0x’或者’0X’(取决于用的是’x’还是’X’)</td></tr><tr><td><code>0</code></td><td>显示的数字前面填充’0’而不是默认的空格</td></tr></tbody></table><p>【例子】</p><p>[61]:</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><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">print('%5.1f' % 27.658) # ' 27.7'</span><br><span class="line">print('%.2e' % 27.658) # 2.77e+01</span><br><span class="line">print('%10d' % 10) # ' 10'</span><br><span class="line">print('%-10d' % 10) # '10 '</span><br><span class="line">print('%+d' % 10) # +10</span><br><span class="line">print('%#o' % 10) # 0o12</span><br><span class="line">print('%#x' % 108) # 0x6c</span><br><span class="line">print('%010d' % 5) # 0000000005</span><br><span class="line"> 27.7</span><br><span class="line">2.77e+01</span><br><span class="line"> 10</span><br><span class="line">10 </span><br><span class="line">+10</span><br><span class="line">0o12</span><br><span class="line">0x6c</span><br><span class="line">0000000005</span><br></pre></td></tr></table></figure><h1 id="字典"><a href="#字典" class="headerlink" title="字典"></a>字典</h1><h2 id="1-可变类型与不可变类型"><a href="#1-可变类型与不可变类型" class="headerlink" title="1. 可变类型与不可变类型"></a>1. 可变类型与不可变类型</h2><ul><li>序列是以连续的整数为索引,与此不同的是,字典以”关键字”为索引,关键字可以是任意不可变类型,通常用字符串或数值。</li><li>字典是 Python 唯一的一个 映射类型,字符串、元组、列表属于序列类型。</li></ul><p>那么如何快速判断一个数据类型 <code>X</code> 是不是可变类型的呢?两种方法:</p><ul><li>麻烦方法:用 <code>id(X)</code> 函数,对 X 进行某种操作,比较操作前后的 <code>id</code>,如果不一样,则 <code>X</code> 不可变,如果一样,则 <code>X</code> 可变。</li><li>便捷方法:用 <code>hash(X)</code>,只要不报错,证明 <code>X</code> 可被哈希,即不可变,反过来不可被哈希,即可变。</li></ul><p>【例子】</p><p>[62]:</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><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">i = 1</span><br><span class="line">print(id(i)) # 140732167000896</span><br><span class="line">i = i + 2</span><br><span class="line">print(id(i)) # 140732167000960</span><br><span class="line"></span><br><span class="line">l = [1, 2]</span><br><span class="line">print(id(l)) # 4300825160</span><br><span class="line">l.append('Python')</span><br><span class="line">print(id(l)) # 4300825160</span><br><span class="line">140731832701760</span><br><span class="line">140731832701824</span><br><span class="line">2131670369800</span><br><span class="line">2131670369800</span><br></pre></td></tr></table></figure><ul><li>整数 <code>i</code> 在加 1 之后的 <code>id</code> 和之前不一样,因此加完之后的这个 <code>i</code> (虽然名字没变),但不是加之前的那个 <code>i</code> 了,因此整数是不可变类型。</li><li>列表 <code>l</code> 在附加 <code>'Python'</code> 之后的 <code>id</code> 和之前一样,因此列表是可变类型。</li></ul><p>【例子】</p><p>[1]:</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><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">print(hash('Name')) # 7047218704141848153</span><br><span class="line"></span><br><span class="line">print(hash((1, 2, 'Python'))) # 1704535747474881831</span><br><span class="line"></span><br><span class="line">print(hash([1, 2, 'Python']))</span><br><span class="line"># TypeError: unhashable type: 'list'</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">-6668157630988609386</span><br><span class="line">-1857436431894091236</span><br><span class="line">---------------------------------------------------------------------------</span><br><span class="line">TypeError Traceback (most recent call last)</span><br><span class="line"><ipython-input-1-6416367464f8> in <module>()</span><br><span class="line"> 3 print(hash((1, 2, 'Python'))) # 1704535747474881831</span><br><span class="line"> 4 </span><br><span class="line">----> 5 print(hash([1, 2, 'Python']))</span><br><span class="line"> 6 # TypeError: unhashable type: 'list'</span><br><span class="line"></span><br><span class="line">TypeError: unhashable type: 'list'</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">print(hash({1, 2, 3}))</span><br><span class="line"># TypeError: unhashable type: 'set'</span><br></pre></td></tr></table></figure><ul><li>数值、字符和元组 都能被哈希,因此它们是不可变类型。</li><li>列表、集合、字典不能被哈希,因此它是可变类型。</li></ul><h2 id="2-字典的定义"><a href="#2-字典的定义" class="headerlink" title="2. 字典的定义"></a>2. 字典的定义</h2><p>字典 是无序的 键:值(<code>key:value</code>)对集合,键必须是互不相同的(在同一个字典之内)。</p><ul><li><code>dict</code> 内部存放的顺序和 <code>key</code> 放入的顺序是没有关系的。</li><li><code>dict</code> 查找和插入的速度极快,不会随着 <code>key</code> 的增加而增加,但是需要占用大量的内存。</li></ul><p>字典 定义语法为 <code>{元素1, 元素2, ..., 元素n}</code></p><ul><li>其中每一个元素是一个「键值对」– 键:值 (<code>key:value</code>)</li><li>关键点是「大括号 {}」,「逗号 ,」和「冒号 :」</li><li>大括号 – 把所有元素绑在一起</li><li>逗号 – 将每个键值对分开</li><li>冒号 – 将键和值分开</li></ul><h2 id="3-创建和访问字典"><a href="#3-创建和访问字典" class="headerlink" title="3. 创建和访问字典"></a>3. 创建和访问字典</h2><p>【例子】</p><p>[88]:</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><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">brand = ['李宁', '耐克', '阿迪达斯']</span><br><span class="line">slogan = ['一切皆有可能', 'Just do it', 'Impossible is nothing']</span><br><span class="line">print('耐克的口号是:', slogan[brand.index('耐克')]) </span><br><span class="line"># 耐克的口号是: Just do it</span><br><span class="line"></span><br><span class="line">dic = {'李宁': '一切皆有可能', '耐克': 'Just do it', '阿迪达斯': 'Impossible is nothing'}</span><br><span class="line">print('耐克的口号是:', dic['耐克']) </span><br><span class="line"># 耐克的口号是: Just do it</span><br><span class="line">耐克的口号是: Just do it</span><br><span class="line">耐克的口号是: Just do it</span><br></pre></td></tr></table></figure><p>【例子】通过字符串或数值作为<code>key</code>来创建字典。</p><p>[2]:</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><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">dic1 = {1: 'one', 2: 'two', 3: 'three'}</span><br><span class="line">print(dic1) # {1: 'one', 2: 'two', 3: 'three'}</span><br><span class="line">print(dic1[1]) # one</span><br><span class="line">print(dic1[4]) # KeyError: 4</span><br><span class="line"></span><br><span class="line">{1: 'one', 2: 'two', 3: 'three'}</span><br><span class="line">one</span><br><span class="line">---------------------------------------------------------------------------</span><br><span class="line">KeyError Traceback (most recent call last)</span><br><span class="line"><ipython-input-2-bb8d02bd63a3> in <module>()</span><br><span class="line"> 2 print(dic1) # {1: 'one', 2: 'two', 3: 'three'}</span><br><span class="line"> 3 print(dic1[1]) # one</span><br><span class="line">----> 4 print(dic1[4]) # KeyError: 4</span><br><span class="line"></span><br><span class="line">KeyError: 4</span><br></pre></td></tr></table></figure><p>[3]:</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">dic2 = {'rice': 35, 'wheat': 101, 'corn': 67}</span><br><span class="line">print(dic2) # {'wheat': 101, 'corn': 67, 'rice': 35}</span><br><span class="line">print(dic2['rice']) # 35</span><br><span class="line">{'rice': 35, 'wheat': 101, 'corn': 67}</span><br><span class="line">35</span><br></pre></td></tr></table></figure><p>注意:如果我们取的键在字典中不存在,会直接报错<code>KeyError</code>。</p><p>【例子】通过元组作为<code>key</code>来创建字典,但一般不这样使用。</p><p>[91]:</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">dic = {(1, 2, 3): "Tom", "Age": 12, 3: [3, 5, 7]}</span><br><span class="line">print(dic) # {(1, 2, 3): 'Tom', 'Age': 12, 3: [3, 5, 7]}</span><br><span class="line">print(type(dic)) # <class 'dict'></span><br><span class="line">{(1, 2, 3): 'Tom', 'Age': 12, 3: [3, 5, 7]}</span><br><span class="line"><class 'dict'></span><br></pre></td></tr></table></figure><p>通过构造函数<code>dict</code>来创建字典。</p><ul><li><code>dict()</code> 创建一个空的字典。</li></ul><p>【例子】通过<code>key</code>直接把数据放入字典中,但一个<code>key</code>只能对应一个<code>value</code>,多次对一个<code>key</code>放入 <code>value</code>,后面的值会把前面的值冲掉。</p><p>[92]:</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><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">dic = dict()</span><br><span class="line">dic['a'] = 1</span><br><span class="line">dic['b'] = 2</span><br><span class="line">dic['c'] = 3</span><br><span class="line"></span><br><span class="line">print(dic)</span><br><span class="line"># {'a': 1, 'b': 2, 'c': 3}</span><br><span class="line"></span><br><span class="line">dic['a'] = 11</span><br><span class="line">print(dic)</span><br><span class="line"># {'a': 11, 'b': 2, 'c': 3}</span><br><span class="line"></span><br><span class="line">dic['d'] = 4</span><br><span class="line">print(dic)</span><br><span class="line"># {'a': 11, 'b': 2, 'c': 3, 'd': 4}</span><br><span class="line">{'a': 1, 'b': 2, 'c': 3}</span><br><span class="line">{'a': 11, 'b': 2, 'c': 3}</span><br><span class="line">{'a': 11, 'b': 2, 'c': 3, 'd': 4}</span><br></pre></td></tr></table></figure><ul><li><code>dict(mapping)</code> new dictionary initialized from a mapping object’s (key, value) pairs</li></ul><p>【例子】</p><p>[95]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">dic1 = dict([('apple', 4139), ('peach', 4127), ('cherry', 4098)])</span><br><span class="line">print(dic1) # {'cherry': 4098, 'apple': 4139, 'peach': 4127}</span><br><span class="line"></span><br><span class="line">dic2 = dict((('apple', 4139), ('peach', 4127), ('cherry', 4098)))</span><br><span class="line">print(dic2) # {'peach': 4127, 'cherry': 4098, 'apple': 4139}</span><br><span class="line">{'apple': 4139, 'peach': 4127, 'cherry': 4098}</span><br><span class="line">{'apple': 4139, 'peach': 4127, 'cherry': 4098}</span><br></pre></td></tr></table></figure><ul><li><code>dict(**kwargs)</code> -> new dictionary initialized with the name=value pairs in the keyword argument list. For example: dict(one=1, two=2)</li></ul><p>【例子】这种情况下,键只能为字符串类型,并且创建的时候字符串不能加引号,加上就会直接报语法错误。</p><p>[96]:</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">dic = dict(name='Tom', age=10)</span><br><span class="line">print(dic) # {'name': 'Tom', 'age': 10}</span><br><span class="line">print(type(dic)) # <class 'dict'></span><br><span class="line">{'name': 'Tom', 'age': 10}</span><br><span class="line"><class 'dict'></span><br></pre></td></tr></table></figure><h2 id="4-字典的内置方法"><a href="#4-字典的内置方法" class="headerlink" title="4. 字典的内置方法"></a>4. 字典的内置方法</h2><ul><li><code>dict.fromkeys(seq[, value])</code> 用于创建一个新字典,以序列 <code>seq</code> 中元素做字典的键,<code>value</code> 为字典所有键对应的初始值。</li></ul><p>【例子】</p><p>[97]:</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><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">seq = ('name', 'age', 'sex')</span><br><span class="line">dic1 = dict.fromkeys(seq)</span><br><span class="line">print(dic1)</span><br><span class="line"># {'name': None, 'age': None, 'sex': None}</span><br><span class="line"></span><br><span class="line">dic2 = dict.fromkeys(seq, 10)</span><br><span class="line">print(dic2)</span><br><span class="line"># {'name': 10, 'age': 10, 'sex': 10}</span><br><span class="line"></span><br><span class="line">dic3 = dict.fromkeys(seq, ('小马', '8', '男'))</span><br><span class="line">print(dic3)</span><br><span class="line"># {'name': ('小马', '8', '男'), 'age': ('小马', '8', '男'), 'sex': ('小马', '8', '男')}</span><br><span class="line">{'name': None, 'age': None, 'sex': None}</span><br><span class="line">{'name': 10, 'age': 10, 'sex': 10}</span><br><span class="line">{'name': ('小马', '8', '男'), 'age': ('小马', '8', '男'), 'sex': ('小马', '8', '男')}</span><br></pre></td></tr></table></figure><ul><li><code>dict.keys()</code>返回一个可迭代对象,可以使用 <code>list()</code> 来转换为列表,列表为字典中的所有键。</li></ul><p>【例子】</p><p>[98]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">dic = {'Name': 'lsgogroup', 'Age': 7}</span><br><span class="line">print(dic.keys()) # dict_keys(['Name', 'Age'])</span><br><span class="line">lst = list(dic.keys()) # 转换为列表</span><br><span class="line">print(lst) # ['Name', 'Age']</span><br><span class="line">dict_keys(['Name', 'Age'])</span><br><span class="line">['Name', 'Age']</span><br></pre></td></tr></table></figure><ul><li><code>dict.values()</code>返回一个迭代器,可以使用 <code>list()</code> 来转换为列表,列表为字典中的所有值。</li></ul><p>【例子】</p><p>[100]:</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><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">dic = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'}</span><br><span class="line">print(dic.values())</span><br><span class="line"># dict_values(['female', 7, 'Zara'])</span><br><span class="line"></span><br><span class="line">print(list(dic.values()))</span><br><span class="line"># [7, 'female', 'Zara']</span><br><span class="line">dict_values(['female', 7, 'Zara'])</span><br><span class="line">['female', 7, 'Zara']</span><br></pre></td></tr></table></figure><ul><li><code>dict.items()</code>以列表返回可遍历的 (键, 值) 元组数组。</li></ul><p>【例子】</p><p>[101]:</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><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">dic = {'Name': 'Lsgogroup', 'Age': 7}</span><br><span class="line">print(dic.items())</span><br><span class="line"># dict_items([('Name', 'Lsgogroup'), ('Age', 7)])</span><br><span class="line"></span><br><span class="line">print(tuple(dic.items()))</span><br><span class="line"># (('Name', 'Lsgogroup'), ('Age', 7))</span><br><span class="line"></span><br><span class="line">print(list(dic.items()))</span><br><span class="line"># [('Name', 'Lsgogroup'), ('Age', 7)]</span><br><span class="line">dict_items([('Name', 'Lsgogroup'), ('Age', 7)])</span><br><span class="line">(('Name', 'Lsgogroup'), ('Age', 7))</span><br><span class="line">[('Name', 'Lsgogroup'), ('Age', 7)]</span><br></pre></td></tr></table></figure><ul><li><code>dict.get(key, default=None)</code> 返回指定键的值,如果值不在字典中返回默认值。</li></ul><p>【例子】</p><p>[102]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">dic = {'Name': 'Lsgogroup', 'Age': 27}</span><br><span class="line">print("Age 值为 : %s" % dic.get('Age')) # Age 值为 : 27</span><br><span class="line">print("Sex 值为 : %s" % dic.get('Sex', "NA")) # Sex 值为 : NA</span><br><span class="line">print(dic) # {'Name': 'Lsgogroup', 'Age': 27}</span><br><span class="line">Age 值为 : 27</span><br><span class="line">Sex 值为 : NA</span><br><span class="line">{'Name': 'Lsgogroup', 'Age': 27}</span><br></pre></td></tr></table></figure><ul><li><code>dict.setdefault(key, default=None)</code>和<code>get()</code>方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。</li></ul><p>【例子】</p><p>[103]:</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><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">dic = {'Name': 'Lsgogroup', 'Age': 7}</span><br><span class="line">print("Age 键的值为 : %s" % dic.setdefault('Age', None)) # Age 键的值为 : 7</span><br><span class="line">print("Sex 键的值为 : %s" % dic.setdefault('Sex', None)) # Sex 键的值为 : None</span><br><span class="line">print(dic) </span><br><span class="line"># {'Age': 7, 'Name': 'Lsgogroup', 'Sex': None}</span><br><span class="line">Age 键的值为 : 7</span><br><span class="line">Sex 键的值为 : None</span><br><span class="line">{'Name': 'Lsgogroup', 'Age': 7, 'Sex': None}</span><br></pre></td></tr></table></figure><ul><li><code>key in dict</code> <code>in</code> 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回<code>true</code>,否则返回<code>false</code>。而<code>not in</code>操作符刚好相反,如果键在字典 dict 里返回<code>false</code>,否则返回<code>true</code>。</li></ul><p>【例子】</p><p>[104]:</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><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">dic = {'Name': 'Lsgogroup', 'Age': 7}</span><br><span class="line"></span><br><span class="line"># in 检测键 Age 是否存在</span><br><span class="line">if 'Age' in dic:</span><br><span class="line"> print("键 Age 存在")</span><br><span class="line">else:</span><br><span class="line"> print("键 Age 不存在")</span><br><span class="line"></span><br><span class="line"># 检测键 Sex 是否存在</span><br><span class="line">if 'Sex' in dic:</span><br><span class="line"> print("键 Sex 存在")</span><br><span class="line">else:</span><br><span class="line"> print("键 Sex 不存在")</span><br><span class="line"></span><br><span class="line"># not in 检测键 Age 是否存在</span><br><span class="line">if 'Age' not in dic:</span><br><span class="line"> print("键 Age 不存在")</span><br><span class="line">else:</span><br><span class="line"> print("键 Age 存在")</span><br><span class="line"></span><br><span class="line"># 键 Age 存在</span><br><span class="line"># 键 Sex 不存在</span><br><span class="line"># 键 Age 存在</span><br><span class="line">键 Age 存在</span><br><span class="line">键 Sex 不存在</span><br><span class="line">键 Age 存在</span><br></pre></td></tr></table></figure><ul><li><code>dict.pop(key[,default])</code>删除字典给定键 <code>key</code> 所对应的值,返回值为被删除的值。<code>key</code> 值必须给出。若<code>key</code>不存在,则返回 <code>default</code> 值。</li><li><code>del dict[key]</code> 删除字典给定键 <code>key</code> 所对应的值。</li></ul><p>【例子】</p><p>[105]:</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><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">dic1 = {1: "a", 2: [1, 2]}</span><br><span class="line">print(dic1.pop(1), dic1) # a {2: [1, 2]}</span><br><span class="line"></span><br><span class="line"># 设置默认值,必须添加,否则报错</span><br><span class="line">print(dic1.pop(3, "nokey"), dic1) # nokey {2: [1, 2]}</span><br><span class="line"></span><br><span class="line">del dic1[2]</span><br><span class="line">print(dic1) # {}</span><br><span class="line">a {2: [1, 2]}</span><br><span class="line">nokey {2: [1, 2]}</span><br><span class="line">{}</span><br></pre></td></tr></table></figure><ul><li><code>dict.popitem()</code>随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。</li></ul><p>【例子】</p><p>[107]:</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">dic1 = {1: "a", 2: [1, 2]}</span><br><span class="line">print(dic1.popitem()) # {2: [1, 2]}</span><br><span class="line">print(dic1) # (1, 'a')</span><br><span class="line">(2, [1, 2])</span><br><span class="line">{1: 'a'}</span><br></pre></td></tr></table></figure><ul><li><code>dict.clear()</code>用于删除字典内所有元素。</li></ul><p>【例子】</p><p>[108]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">dic = {'Name': 'Zara', 'Age': 7}</span><br><span class="line">print("字典长度 : %d" % len(dic)) # 字典长度 : 2</span><br><span class="line">dic.clear()</span><br><span class="line">print("字典删除后长度 : %d" % len(dic)) </span><br><span class="line"># 字典删除后长度 : 0</span><br><span class="line">字典长度 : 2</span><br><span class="line">字典删除后长度 : 0</span><br></pre></td></tr></table></figure><ul><li><code>dict.copy()</code>返回一个字典的浅复制。</li></ul><p>【例子】</p><p>[109]:</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">dic1 = {'Name': 'Lsgogroup', 'Age': 7, 'Class': 'First'}</span><br><span class="line">dic2 = dic1.copy()</span><br><span class="line">print("dic2") </span><br><span class="line"># {'Age': 7, 'Name': 'Lsgogroup', 'Class': 'First'}</span><br><span class="line">dic2</span><br></pre></td></tr></table></figure><p>【例子】直接赋值和 copy 的区别</p><p>[110]:</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><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></pre></td><td class="code"><pre><span class="line">dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}</span><br><span class="line"></span><br><span class="line"># 引用对象</span><br><span class="line">dic2 = dic1 </span><br><span class="line"># 浅拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用</span><br><span class="line">dic3 = dic1.copy() </span><br><span class="line"></span><br><span class="line">print(id(dic1)) # 148635574728</span><br><span class="line">print(id(dic2)) # 148635574728</span><br><span class="line">print(id(dic3)) # 148635574344</span><br><span class="line"></span><br><span class="line"># 修改 data 数据</span><br><span class="line">dic1['user'] = 'root'</span><br><span class="line">dic1['num'].remove(1)</span><br><span class="line"></span><br><span class="line"># 输出结果</span><br><span class="line">print(dic1) # {'user': 'root', 'num': [2, 3]}</span><br><span class="line">print(dic2) # {'user': 'root', 'num': [2, 3]}</span><br><span class="line">print(dic3) # {'user': 'runoob', 'num': [2, 3]}</span><br><span class="line">2131669221448</span><br><span class="line">2131669221448</span><br><span class="line">2131669225120</span><br><span class="line">{'user': 'root', 'num': [2, 3]}</span><br><span class="line">{'user': 'root', 'num': [2, 3]}</span><br><span class="line">{'user': 'lsgogroup', 'num': [2, 3]}</span><br></pre></td></tr></table></figure><ul><li><code>dict.update(dict2)</code>把字典参数 <code>dict2</code> 的 <code>key:value</code>对 更新到字典 <code>dict</code> 里。</li></ul><p>【例子】</p><p>[111]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">dic = {'Name': 'Lsgogroup', 'Age': 7}</span><br><span class="line">dic2 = {'Sex': 'female', 'Age': 8}</span><br><span class="line">dic.update(dic2)</span><br><span class="line">print(dic) </span><br><span class="line"># {'Sex': 'female', 'Age': 8, 'Name': 'Lsgogroup'}</span><br><span class="line">{'Name': 'Lsgogroup', 'Age': 8, 'Sex': 'female'}</span><br></pre></td></tr></table></figure><h1 id="集合"><a href="#集合" class="headerlink" title="集合"></a>集合</h1><p>Python 中<code>set</code>与<code>dict</code>类似,也是一组<code>key</code>的集合,但不存储<code>value</code>。由于<code>key</code>不能重复,所以,在<code>set</code>中,没有重复的<code>key</code>。</p><p>注意,<code>key</code>为不可变类型,即可哈希的值。</p><p>【例子】</p><p>[112]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">num = {}</span><br><span class="line">print(type(num)) # <class 'dict'></span><br><span class="line">num = {1, 2, 3, 4}</span><br><span class="line">print(type(num)) # <class 'set'></span><br><span class="line"><class 'dict'></span><br><span class="line"><class 'set'></span><br></pre></td></tr></table></figure><h2 id="1-集合的创建"><a href="#1-集合的创建" class="headerlink" title="1. 集合的创建"></a>1. 集合的创建</h2><ul><li>先创建对象再加入元素。</li><li>在创建空集合的时候只能使用<code>s = set()</code>,因为<code>s = {}</code>创建的是空字典。</li></ul><p>【例子】</p><p>[113]:</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">basket = set()</span><br><span class="line">basket.add('apple')</span><br><span class="line">basket.add('banana')</span><br><span class="line">print(basket) # {'banana', 'apple'}</span><br><span class="line">{'banana', 'apple'}</span><br></pre></td></tr></table></figure><ul><li>直接把一堆元素用花括号括起来<code>{元素1, 元素2, ..., 元素n}</code>。</li><li>重复元素在<code>set</code>中会被自动被过滤。</li></ul><p>【例子】</p><p>[114]:</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></pre></td><td class="code"><pre><span class="line">basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}</span><br><span class="line">print(basket) # {'banana', 'apple', 'pear', 'orange'}</span><br><span class="line">{'pear', 'orange', 'banana', 'apple'}</span><br></pre></td></tr></table></figure><ul><li>使用<code>set(value)</code>工厂函数,把列表或元组转换成集合。</li></ul><p>【例子】</p><p>[115]:</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><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">a = set('abracadabra')</span><br><span class="line">print(a) </span><br><span class="line"># {'r', 'b', 'd', 'c', 'a'}</span><br><span class="line"></span><br><span class="line">b = set(("Google", "Lsgogroup", "Taobao", "Taobao"))</span><br><span class="line">print(b) </span><br><span class="line"># {'Taobao', 'Lsgogroup', 'Google'}</span><br><span class="line"></span><br><span class="line">c = set(["Google", "Lsgogroup", "Taobao", "Google"])</span><br><span class="line">print(c) </span><br><span class="line"># {'Taobao', 'Lsgogroup', 'Google'}</span><br><span class="line">{'b', 'r', 'a', 'c', 'd'}</span><br><span class="line">{'Taobao', 'Google', 'Lsgogroup'}</span><br><span class="line">{'Taobao', 'Google', 'Lsgogroup'}</span><br></pre></td></tr></table></figure><p>【例子】去掉列表中重复的元素</p><p>[116]:</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><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">lst = [0, 1, 2, 3, 4, 5, 5, 3, 1]</span><br><span class="line"></span><br><span class="line">temp = []</span><br><span class="line">for item in lst:</span><br><span class="line"> if item not in temp:</span><br><span class="line"> temp.append(item)</span><br><span class="line"></span><br><span class="line">print(temp) # [0, 1, 2, 3, 4, 5]</span><br><span class="line"></span><br><span class="line">a = set(lst)</span><br><span class="line">print(list(a)) # [0, 1, 2, 3, 4, 5]</span><br><span class="line">[0, 1, 2, 3, 4, 5]</span><br><span class="line">[0, 1, 2, 3, 4, 5]</span><br></pre></td></tr></table></figure><p>从结果发现集合的两个特点:无序 (unordered) 和唯一 (unique)。</p><p>由于 <code>set</code> 存储的是无序集合,所以我们不可以为集合创建索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值,但是可以判断一个元素是否在集合中。</p><h2 id="2-访问集合中的值"><a href="#2-访问集合中的值" class="headerlink" title="2. 访问集合中的值"></a>2. 访问集合中的值</h2><ul><li>可以使用<code>len()</code>內建函数得到集合的大小。</li></ul><p>【例子】</p><p>[117]:</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></pre></td><td class="code"><pre><span class="line">s = set(['Google', 'Baidu', 'Taobao'])</span><br><span class="line">print(len(s)) # 3</span><br><span class="line">3</span><br></pre></td></tr></table></figure><ul><li>可以使用<code>for</code>把集合中的数据一个个读取出来。</li></ul><p>【例子】</p><p>[7]:</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><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">s = set(['Google', 'Baidu', 'Taobao'])</span><br><span class="line">for item in s:</span><br><span class="line"> print(item)</span><br><span class="line"> </span><br><span class="line"># Baidu</span><br><span class="line"># Google</span><br><span class="line"># Taobao</span><br><span class="line">Baidu</span><br><span class="line">Taobao</span><br><span class="line">Google</span><br></pre></td></tr></table></figure><ul><li>可以通过<code>in</code>或<code>not in</code>判断一个元素是否在集合中已经存在</li></ul><p>【例子】</p><p>[119]:</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">s = set(['Google', 'Baidu', 'Taobao'])</span><br><span class="line">print('Taobao' in s) # True</span><br><span class="line">print('Facebook' not in s) # True</span><br><span class="line">True</span><br><span class="line">True</span><br></pre></td></tr></table></figure><h2 id="3-集合的内置方法"><a href="#3-集合的内置方法" class="headerlink" title="3. 集合的内置方法"></a>3. 集合的内置方法</h2><ul><li><code>set.add(elmnt)</code>用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作。</li></ul><p>【例子】</p><p>[120]:</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><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">fruits = {"apple", "banana", "cherry"}</span><br><span class="line">fruits.add("orange")</span><br><span class="line">print(fruits) </span><br><span class="line"># {'orange', 'cherry', 'banana', 'apple'}</span><br><span class="line"></span><br><span class="line">fruits.add("apple")</span><br><span class="line">print(fruits) </span><br><span class="line"># {'orange', 'cherry', 'banana', 'apple'}</span><br><span class="line">{'cherry', 'orange', 'banana', 'apple'}</span><br><span class="line">{'cherry', 'orange', 'banana', 'apple'}</span><br></pre></td></tr></table></figure><ul><li><code>set.update(set)</code>用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。</li></ul><p>【例子】</p><p>[121]:</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><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">x = {"apple", "banana", "cherry"}</span><br><span class="line">y = {"google", "baidu", "apple"}</span><br><span class="line">x.update(y)</span><br><span class="line">print(x)</span><br><span class="line"># {'cherry', 'banana', 'apple', 'google', 'baidu'}</span><br><span class="line"></span><br><span class="line">y.update(["lsgo", "dreamtech"])</span><br><span class="line">print(y)</span><br><span class="line"># {'lsgo', 'baidu', 'dreamtech', 'apple', 'google'}</span><br><span class="line">{'google', 'banana', 'cherry', 'apple', 'baidu'}</span><br><span class="line">{'apple', 'dreamtech', 'lsgo', 'google', 'baidu'}</span><br></pre></td></tr></table></figure><ul><li><code>set.remove(item)</code> 用于移除集合中的指定元素。如果元素不存在,则会发生错误。</li></ul><p>【例子】</p><p>[122]:</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">fruits = {"apple", "banana", "cherry"}</span><br><span class="line">fruits.remove("banana")</span><br><span class="line">print(fruits) # {'apple', 'cherry'}</span><br><span class="line">{'cherry', 'apple'}</span><br></pre></td></tr></table></figure><ul><li><code>set.discard(value)</code> 用于移除指定的集合元素。<code>remove()</code> 方法在移除一个不存在的元素时会发生错误,而 <code>discard()</code> 方法不会。</li></ul><p>【例子】</p><p>[123]:</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">fruits = {"apple", "banana", "cherry"}</span><br><span class="line">fruits.discard("banana")</span><br><span class="line">print(fruits) # {'apple', 'cherry'}</span><br><span class="line">{'cherry', 'apple'}</span><br></pre></td></tr></table></figure><ul><li><code>set.pop()</code> 用于随机移除一个元素。</li></ul><p>【例子】</p><p>[66]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">fruits = {"apple", "banana", "cherry"}</span><br><span class="line">x = fruits.pop()</span><br><span class="line">print(fruits) # {'cherry', 'apple'}</span><br><span class="line">print(x) # banana</span><br><span class="line">{'banana', 'apple'}</span><br><span class="line">cherry</span><br></pre></td></tr></table></figure><p>由于 set 是无序和无重复元素的集合,所以两个或多个 set 可以做数学意义上的集合操作。</p><ul><li><code>set.intersection(set1, set2)</code> 返回两个集合的交集。</li><li><code>set1 & set2</code> 返回两个集合的交集。</li><li><code>set.intersection_update(set1, set2)</code> 交集,在原始的集合上移除不重叠的元素。</li></ul><p>【例子】</p><p>[67]:</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><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">a = set('abracadabra')</span><br><span class="line">b = set('alacazam')</span><br><span class="line">print(a) # {'r', 'a', 'c', 'b', 'd'}</span><br><span class="line">print(b) # {'c', 'a', 'l', 'm', 'z'}</span><br><span class="line"></span><br><span class="line">c = a.intersection(b)</span><br><span class="line">print(c) # {'a', 'c'}</span><br><span class="line">print(a & b) # {'c', 'a'}</span><br><span class="line">print(a) # {'a', 'r', 'c', 'b', 'd'}</span><br><span class="line"></span><br><span class="line">a.intersection_update(b)</span><br><span class="line">print(a) # {'a', 'c'}</span><br><span class="line">{'b', 'r', 'a', 'c', 'd'}</span><br><span class="line">{'l', 'a', 'c', 'z', 'm'}</span><br><span class="line">{'a', 'c'}</span><br><span class="line">{'a', 'c'}</span><br><span class="line">{'b', 'r', 'a', 'c', 'd'}</span><br><span class="line">{'a', 'c'}</span><br></pre></td></tr></table></figure><ul><li><code>set.union(set1, set2)</code> 返回两个集合的并集。</li><li><code>set1 | set2</code> 返回两个集合的并集。</li></ul><p>【例子】</p><p>[68]:</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><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">a = set('abracadabra')</span><br><span class="line">b = set('alacazam')</span><br><span class="line">print(a) # {'r', 'a', 'c', 'b', 'd'}</span><br><span class="line">print(b) # {'c', 'a', 'l', 'm', 'z'}</span><br><span class="line"></span><br><span class="line">print(a | b) </span><br><span class="line"># {'l', 'd', 'm', 'b', 'a', 'r', 'z', 'c'}</span><br><span class="line"></span><br><span class="line">c = a.union(b)</span><br><span class="line">print(c) </span><br><span class="line"># {'c', 'a', 'd', 'm', 'r', 'b', 'z', 'l'}</span><br><span class="line">{'b', 'r', 'a', 'c', 'd'}</span><br><span class="line">{'l', 'a', 'c', 'z', 'm'}</span><br><span class="line">{'l', 'b', 'r', 'a', 'c', 'z', 'd', 'm'}</span><br><span class="line">{'l', 'b', 'r', 'a', 'c', 'z', 'd', 'm'}</span><br></pre></td></tr></table></figure><ul><li><code>set.difference(set)</code> 返回集合的差集。</li><li><code>set1 - set2</code> 返回集合的差集。</li><li><code>set.difference_update(set)</code> 集合的差集,直接在原来的集合中移除元素,没有返回值。</li></ul><p>【例子】</p><p>[69]:</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><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">a = set('abracadabra')</span><br><span class="line">b = set('alacazam')</span><br><span class="line">print(a) # {'r', 'a', 'c', 'b', 'd'}</span><br><span class="line">print(b) # {'c', 'a', 'l', 'm', 'z'}</span><br><span class="line"></span><br><span class="line">c = a.difference(b)</span><br><span class="line">print(c) # {'b', 'd', 'r'}</span><br><span class="line">print(a - b) # {'d', 'b', 'r'}</span><br><span class="line"></span><br><span class="line">print(a) # {'r', 'd', 'c', 'a', 'b'}</span><br><span class="line">a.difference_update(b)</span><br><span class="line">print(a) # {'d', 'r', 'b'}</span><br><span class="line">{'b', 'r', 'a', 'c', 'd'}</span><br><span class="line">{'l', 'a', 'c', 'z', 'm'}</span><br><span class="line">{'d', 'b', 'r'}</span><br><span class="line">{'d', 'b', 'r'}</span><br><span class="line">{'b', 'r', 'a', 'c', 'd'}</span><br><span class="line">{'b', 'r', 'd'}</span><br></pre></td></tr></table></figure><ul><li><code>set.symmetric_difference(set)</code>返回集合的异或。</li><li><code>set1 ^ set2</code> 返回集合的异或。</li><li><code>set.symmetric_difference_update(set)</code>移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。</li></ul><p>【例子】</p><p>[70]:</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><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">a = set('abracadabra')</span><br><span class="line">b = set('alacazam')</span><br><span class="line">print(a) # {'r', 'a', 'c', 'b', 'd'}</span><br><span class="line">print(b) # {'c', 'a', 'l', 'm', 'z'}</span><br><span class="line"></span><br><span class="line">c = a.symmetric_difference(b)</span><br><span class="line">print(c) # {'m', 'r', 'l', 'b', 'z', 'd'}</span><br><span class="line">print(a ^ b) # {'m', 'r', 'l', 'b', 'z', 'd'}</span><br><span class="line"></span><br><span class="line">print(a) # {'r', 'd', 'c', 'a', 'b'}</span><br><span class="line">a.symmetric_difference_update(b)</span><br><span class="line">print(a) # {'r', 'b', 'm', 'l', 'z', 'd'}</span><br><span class="line">{'b', 'r', 'a', 'c', 'd'}</span><br><span class="line">{'l', 'a', 'c', 'z', 'm'}</span><br><span class="line">{'l', 'b', 'z', 'r', 'd', 'm'}</span><br><span class="line">{'l', 'b', 'z', 'r', 'd', 'm'}</span><br><span class="line">{'b', 'r', 'a', 'c', 'd'}</span><br><span class="line">{'l', 'b', 'r', 'z', 'd', 'm'}</span><br></pre></td></tr></table></figure><ul><li><code>set.issubset(set)</code>判断集合是不是被其他集合包含,如果是则返回 True,否则返回 False。</li><li><code>set1 <= set2</code> 判断集合是不是被其他集合包含,如果是则返回 True,否则返回 False。</li></ul><p>【例子】</p><p>[71]:</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><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">x = {"a", "b", "c"}</span><br><span class="line">y = {"f", "e", "d", "c", "b", "a"}</span><br><span class="line">z = x.issubset(y)</span><br><span class="line">print(z) # True</span><br><span class="line">print(x <= y) # True</span><br><span class="line"></span><br><span class="line">x = {"a", "b", "c"}</span><br><span class="line">y = {"f", "e", "d", "c", "b"}</span><br><span class="line">z = x.issubset(y)</span><br><span class="line">print(z) # False</span><br><span class="line">print(x <= y) # False</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">False</span><br><span class="line">False</span><br></pre></td></tr></table></figure><ul><li><code>set.issuperset(set)</code>用于判断集合是不是包含其他集合,如果是则返回 True,否则返回 False。</li><li><code>set1 >= set2</code> 判断集合是不是包含其他集合,如果是则返回 True,否则返回 False。</li></ul><p>【例子】</p><p>[72]:</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><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">x = {"f", "e", "d", "c", "b", "a"}</span><br><span class="line">y = {"a", "b", "c"}</span><br><span class="line">z = x.issuperset(y)</span><br><span class="line">print(z) # True</span><br><span class="line">print(x >= y) # True</span><br><span class="line"></span><br><span class="line">x = {"f", "e", "d", "c", "b"}</span><br><span class="line">y = {"a", "b", "c"}</span><br><span class="line">z = x.issuperset(y)</span><br><span class="line">print(z) # False</span><br><span class="line">print(x >= y) # False</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">False</span><br><span class="line">False</span><br></pre></td></tr></table></figure><ul><li><code>set.isdisjoint(set)</code> 用于判断两个集合是不是不相交,如果是返回 True,否则返回 False。</li></ul><p>【例子】</p><p>[73]:</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><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">x = {"f", "e", "d", "c", "b"}</span><br><span class="line">y = {"a", "b", "c"}</span><br><span class="line">z = x.isdisjoint(y)</span><br><span class="line">print(z) # False</span><br><span class="line"></span><br><span class="line">x = {"f", "e", "d", "m", "g"}</span><br><span class="line">y = {"a", "b", "c"}</span><br><span class="line">z = x.isdisjoint(y)</span><br><span class="line">print(z) # True</span><br><span class="line">False</span><br><span class="line">True</span><br></pre></td></tr></table></figure><h2 id="4-集合的转换"><a href="#4-集合的转换" class="headerlink" title="4. 集合的转换"></a>4. 集合的转换</h2><p>【例子】</p><p>[74]:</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><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">se = set(range(4))</span><br><span class="line">li = list(se)</span><br><span class="line">tu = tuple(se)</span><br><span class="line"></span><br><span class="line">print(se, type(se)) # {0, 1, 2, 3} <class 'set'></span><br><span class="line">print(li, type(li)) # [0, 1, 2, 3] <class 'list'></span><br><span class="line">print(tu, type(tu)) # (0, 1, 2, 3) <class 'tuple'></span><br><span class="line">{0, 1, 2, 3} <class 'set'></span><br><span class="line">[0, 1, 2, 3] <class 'list'></span><br><span class="line">(0, 1, 2, 3) <class 'tuple'></span><br></pre></td></tr></table></figure><h2 id="5-不可变集合"><a href="#5-不可变集合" class="headerlink" title="5. 不可变集合"></a>5. 不可变集合</h2><p>Python 提供了不能改变元素的集合的实现版本,即不能增加或删除元素,类型名叫<code>frozenset</code>。需要注意的是<code>frozenset</code>仍然可以进行集合操作,只是不能用带有<code>update</code>的方法。</p><ul><li><code>frozenset([iterable])</code> 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。</li></ul><p>【例子】</p><p>[75]:</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><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">a = frozenset(range(10)) # 生成一个新的不可变集合</span><br><span class="line">print(a) </span><br><span class="line"># frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})</span><br><span class="line"></span><br><span class="line">b = frozenset('lsgogroup')</span><br><span class="line">print(b) </span><br><span class="line"># frozenset({'g', 's', 'p', 'r', 'u', 'o', 'l'})</span><br><span class="line">frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})</span><br><span class="line">frozenset({'l', 'g', 'r', 'u', 'o', 's', 'p'})</span><br></pre></td></tr></table></figure><h1 id="序列"><a href="#序列" class="headerlink" title="序列"></a>序列</h1><p>在 Python 中,序列类型包括字符串、列表、元组、集合和字典,这些序列支持一些通用的操作,但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作。</p><h2 id="1-针对序列的内置函数"><a href="#1-针对序列的内置函数" class="headerlink" title="1. 针对序列的内置函数"></a>1. 针对序列的内置函数</h2><ul><li><code>list(sub)</code> 把一个可迭代对象转换为列表。</li></ul><p>【例子】</p><p>[76]:</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><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">a = list()</span><br><span class="line">print(a) # []</span><br><span class="line"></span><br><span class="line">b = 'I Love LsgoGroup'</span><br><span class="line">b = list(b)</span><br><span class="line">print(b) </span><br><span class="line"># ['I', ' ', 'L', 'o', 'v', 'e', ' ', 'L', 's', 'g', 'o', 'G', 'r', 'o', 'u', 'p']</span><br><span class="line"></span><br><span class="line">c = (1, 1, 2, 3, 5, 8)</span><br><span class="line">c = list(c)</span><br><span class="line">print(c) # [1, 1, 2, 3, 5, 8]</span><br><span class="line">[]</span><br><span class="line">['I', ' ', 'L', 'o', 'v', 'e', ' ', 'L', 's', 'g', 'o', 'G', 'r', 'o', 'u', 'p']</span><br><span class="line">[1, 1, 2, 3, 5, 8]</span><br></pre></td></tr></table></figure><ul><li><code>tuple(sub)</code> 把一个可迭代对象转换为元组。</li></ul><p>【例子】</p><p>[77]:</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><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">a = tuple()</span><br><span class="line">print(a) # ()</span><br><span class="line"></span><br><span class="line">b = 'I Love LsgoGroup'</span><br><span class="line">b = tuple(b)</span><br><span class="line">print(b) </span><br><span class="line"># ('I', ' ', 'L', 'o', 'v', 'e', ' ', 'L', 's', 'g', 'o', 'G', 'r', 'o', 'u', 'p')</span><br><span class="line"></span><br><span class="line">c = [1, 1, 2, 3, 5, 8]</span><br><span class="line">c = tuple(c)</span><br><span class="line">print(c) # (1, 1, 2, 3, 5, 8)</span><br><span class="line">()</span><br><span class="line">('I', ' ', 'L', 'o', 'v', 'e', ' ', 'L', 's', 'g', 'o', 'G', 'r', 'o', 'u', 'p')</span><br><span class="line">(1, 1, 2, 3, 5, 8)</span><br></pre></td></tr></table></figure><ul><li><code>str(obj)</code> 把obj对象转换为字符串</li></ul><p>【例子】</p><p>[78]:</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">a = 123</span><br><span class="line">a = str(a)</span><br><span class="line">print(a) # 123</span><br><span class="line">123</span><br></pre></td></tr></table></figure><ul><li><pre><code>len(s)<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><span class="line">9</span><br><span class="line">10</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"> - `s` -- 对象。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[79]:</span><br></pre></td></tr></table></figure>a = list()print(len(a)) # 0</code></pre></li></ul><p>b = (‘I’, ‘ ‘, ‘L’, ‘o’, ‘v’, ‘e’, ‘ ‘, ‘L’, ‘s’, ‘g’, ‘o’, ‘G’, ‘r’, ‘o’, ‘u’, ‘p’)<br>print(len(b)) # 16</p><p>c = ‘I Love LsgoGroup’<br>print(len(c)) # 16<br>0<br>16<br>16</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- `max(sub)`返回序列或者参数集合中的最大值</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[80]:</span><br></pre></td></tr></table></figure><p>print(max(1, 2, 3, 4, 5)) # 5<br>print(max([-8, 99, 3, 7, 83])) # 99<br>print(max(‘IloveLsgoGroup’)) # v<br>5<br>99<br>v</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- `min(sub)`返回序列或参数集合中的最小值</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[81]:</span><br></pre></td></tr></table></figure><p>print(min(1, 2, 3, 4, 5)) # 1<br>print(min([-8, 99, 3, 7, 83])) # -8<br>print(min(‘IloveLsgoGroup’)) # G<br>1<br>-8<br>G</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- `sum(iterable[, start=0])` 返回序列`iterable`与可选参数`start`的总和。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[82]:</span><br></pre></td></tr></table></figure><p>print(sum([1, 3, 5, 7, 9])) # 25<br>print(sum([1, 3, 5, 7, 9], 10)) # 35<br>print(sum((1, 3, 5, 7, 9))) # 25<br>print(sum((1, 3, 5, 7, 9), 20)) # 45<br>25<br>35<br>25<br>45</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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure><p> sorted(iterable, key=None, reverse=False)<br> <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><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><br><span class="line"> </span><br><span class="line"></span><br><span class="line"> 对所有可迭代的对象进行排序操作。</span><br><span class="line"></span><br><span class="line"> - `iterable` -- 可迭代对象。</span><br><span class="line"> - `key` -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。</span><br><span class="line"> - `reverse` -- 排序规则,`reverse = True` 降序 , `reverse = False` 升序(默认)。</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">[83]:</span><br></pre></td></tr></table></figure><br>x = [-8, 99, 3, 7, 83]<br>print(sorted(x)) # [-8, 3, 7, 83, 99]<br>print(sorted(x, reverse=True)) # [99, 83, 7, 3, -8]</p><p>t = ({“age”: 20, “name”: “a”}, {“age”: 25, “name”: “b”}, {“age”: 10, “name”: “c”})<br>x = sorted(t, key=lambda a: a[“age”])<br>print(x)</p><h1 id="‘age’-10-‘name’-‘c’-‘age’-20-‘name’-‘a’-‘age’-25-‘name’-‘b’"><a href="#‘age’-10-‘name’-‘c’-‘age’-20-‘name’-‘a’-‘age’-25-‘name’-‘b’" class="headerlink" title="[{‘age’: 10, ‘name’: ‘c’}, {‘age’: 20, ‘name’: ‘a’}, {‘age’: 25, ‘name’: ‘b’}]"></a>[{‘age’: 10, ‘name’: ‘c’}, {‘age’: 20, ‘name’: ‘a’}, {‘age’: 25, ‘name’: ‘b’}]</h1><p>[-8, 3, 7, 83, 99]<br>[99, 83, 7, 3, -8]<br>[{‘age’: 10, ‘name’: ‘c’}, {‘age’: 20, ‘name’: ‘a’}, {‘age’: 25, ‘name’: ‘b’}]</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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure><p> reversed(seq)<br> <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><span class="line">9</span><br><span class="line">10</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"> - `seq` -- 要转换的序列,可以是 tuple, string, list 或 range。</span><br><span class="line"></span><br><span class="line">【例子】</span><br><span class="line"></span><br><span class="line">[84]:</span><br></pre></td></tr></table></figure><br>s = ‘lsgogroup’<br>x = reversed(s)<br>print(type(x)) # <class ‘reversed’><br>print(x) # <reversed object at 0x000002507E8EC2C8><br>print(list(x))</p><h1 id="‘p’-‘u’-‘o’-‘r’-‘g’-‘o’-‘g’-‘s’-‘l’"><a href="#‘p’-‘u’-‘o’-‘r’-‘g’-‘o’-‘g’-‘s’-‘l’" class="headerlink" title="[‘p’, ‘u’, ‘o’, ‘r’, ‘g’, ‘o’, ‘g’, ‘s’, ‘l’]"></a>[‘p’, ‘u’, ‘o’, ‘r’, ‘g’, ‘o’, ‘g’, ‘s’, ‘l’]</h1><p>t = (‘l’, ‘s’, ‘g’, ‘o’, ‘g’, ‘r’, ‘o’, ‘u’, ‘p’)<br>print(list(reversed(t)))</p><h1 id="‘p’-‘u’-‘o’-‘r’-‘g’-‘o’-‘g’-‘s’-‘l’-1"><a href="#‘p’-‘u’-‘o’-‘r’-‘g’-‘o’-‘g’-‘s’-‘l’-1" class="headerlink" title="[‘p’, ‘u’, ‘o’, ‘r’, ‘g’, ‘o’, ‘g’, ‘s’, ‘l’]"></a>[‘p’, ‘u’, ‘o’, ‘r’, ‘g’, ‘o’, ‘g’, ‘s’, ‘l’]</h1><p>r = range(5, 9)<br>print(list(reversed(r)))</p><h1 id="8-7-6-5"><a href="#8-7-6-5" class="headerlink" title="[8, 7, 6, 5]"></a>[8, 7, 6, 5]</h1><p>x = [-8, 99, 3, 7, 83]<br>print(list(reversed(x)))</p><h1 id="83-7-3-99-8"><a href="#83-7-3-99-8" class="headerlink" title="[83, 7, 3, 99, -8]"></a>[83, 7, 3, 99, -8]</h1><p><class ‘reversed’><br><reversed object at 0x000001F0517DFD68><br>[‘p’, ‘u’, ‘o’, ‘r’, ‘g’, ‘o’, ‘g’, ‘s’, ‘l’]<br>[‘p’, ‘u’, ‘o’, ‘r’, ‘g’, ‘o’, ‘g’, ‘s’, ‘l’]<br>[8, 7, 6, 5]<br>[83, 7, 3, 99, -8]</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">- `enumerate(sequence, [start=0])`</span><br><span class="line"></span><br><span class="line">【例子】用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。</span><br><span class="line"></span><br><span class="line">[85]:</span><br></pre></td></tr></table></figure><p>seasons = [‘Spring’, ‘Summer’, ‘Fall’, ‘Winter’]<br>a = list(enumerate(seasons))<br>print(a) </p><h1 id="0-‘Spring’-1-‘Summer’-2-‘Fall’-3-‘Winter’"><a href="#0-‘Spring’-1-‘Summer’-2-‘Fall’-3-‘Winter’" class="headerlink" title="[(0, ‘Spring’), (1, ‘Summer’), (2, ‘Fall’), (3, ‘Winter’)]"></a>[(0, ‘Spring’), (1, ‘Summer’), (2, ‘Fall’), (3, ‘Winter’)]</h1><p>b = list(enumerate(seasons, 1))<br>print(b) </p><h1 id="1-‘Spring’-2-‘Summer’-3-‘Fall’-4-‘Winter’"><a href="#1-‘Spring’-2-‘Summer’-3-‘Fall’-4-‘Winter’" class="headerlink" title="[(1, ‘Spring’), (2, ‘Summer’), (3, ‘Fall’), (4, ‘Winter’)]"></a>[(1, ‘Spring’), (2, ‘Summer’), (3, ‘Fall’), (4, ‘Winter’)]</h1><p>for i, element in a:<br> print(‘{0},{1}’.format(i, element))</p><h1 id="0-Spring"><a href="#0-Spring" class="headerlink" title="0,Spring"></a>0,Spring</h1><h1 id="1-Summer"><a href="#1-Summer" class="headerlink" title="1,Summer"></a>1,Summer</h1><h1 id="2-Fall"><a href="#2-Fall" class="headerlink" title="2,Fall"></a>2,Fall</h1><h1 id="3-Winter"><a href="#3-Winter" class="headerlink" title="3,Winter"></a>3,Winter</h1><p>[(0, ‘Spring’), (1, ‘Summer’), (2, ‘Fall’), (3, ‘Winter’)]<br>[(1, ‘Spring’), (2, ‘Summer’), (3, ‘Fall’), (4, ‘Winter’)]<br>0,Spring<br>1,Summer<br>2,Fall<br>3,Winter</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"></span><br><span class="line">-</span><br></pre></td></tr></table></figure><p> zip(iter1 [,iter2 […]])<br> <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"></span><br><span class="line"> - 用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。</span><br><span class="line"> - 我们可以使用 `list()` 转换来输出列表。</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">[86]:</span><br></pre></td></tr></table></figure><br>a = [1, 2, 3]<br>b = [4, 5, 6]<br>c = [4, 5, 6, 7, 8]</p><p>zipped = zip(a, b)<br>print(zipped) # <zip object at 0x000000C5D89EDD88><br>print(list(zipped)) # [(1, 4), (2, 5), (3, 6)]<br>zipped = zip(a, c)<br>print(list(zipped)) # [(1, 4), (2, 5), (3, 6)]</p><p>a1, a2 = zip(*zip(a, b))<br>print(list(a1)) # [1, 2, 3]<br>print(list(a2)) # [4, 5, 6]<br><zip object at 0x000001F0517E38C8><br>[(1, 4), (2, 5), (3, 6)]<br>[(1, 4), (2, 5), (3, 6)]<br>[1, 2, 3]<br>[4, 5, 6]<br>```</p>]]></content>
<summary type="html"><h1 id="Python入门-中"><a href="#Python入门-中" class="headerlink" title="Python入门(中)"></a>Python入门(中)</h1><p>[TOC]</p>
<h1 id="简介"><a href="#简介" </summary>
<category term="python基础" scheme="https://wicherqaq.github.io/categories/python%E5%9F%BA%E7%A1%80/"/>
</entry>
<entry>
<title>python入门(上)</title>
<link href="https://wicherqaq.github.io/2020/09/10/python%E5%85%A5%E9%97%A8%EF%BC%88%E4%B8%8A%EF%BC%89/"/>
<id>https://wicherqaq.github.io/2020/09/10/python%E5%85%A5%E9%97%A8%EF%BC%88%E4%B8%8A%EF%BC%89/</id>
<published>2020-09-10T02:51:11.000Z</published>
<updated>2020-09-10T02:57:24.512Z</updated>
<content type="html"><![CDATA[<h1 id="Python入门-上"><a href="#Python入门-上" class="headerlink" title="Python入门(上)"></a>Python入门(上)</h1><p>[TOC]</p><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。如果我们打算利用 Python 来执行机器学习,那么对 Python 有一些基本的了解就是至关重要的。本 Python 入门系列体验就是为这样的初学者精心准备的。</p><p>本实验包括以下内容:</p><ul><li>变量、运算符与数据类型<ul><li>注释</li><li>运算符</li><li>变量和赋值</li><li>数据类型与转换</li><li>print() 函数</li></ul></li><li>位运算<ul><li>原码、反码和补码</li><li>按位非操作 ~</li><li>按位与操作 &</li><li>按位或操作 |</li><li>按位异或操作 ^</li><li>按位左移操作 <<</li><li>按位右移操作 >></li><li>利用位运算实现快速计算</li><li>利用位运算实现整数集合</li></ul></li><li>条件语句<ul><li>if 语句</li><li>if - else 语句</li><li>if - elif - else 语句</li><li>assert 关键词</li></ul></li><li>循环语句<ul><li>while 循环</li><li>while - else 循环</li><li>for 循环</li><li>for - else 循环</li><li>range() 函数</li><li>enumerate()函数</li><li>break 语句</li><li>continue 语句</li><li>pass 语句</li><li>推导式</li></ul></li><li>异常处理<ul><li>Python 标准异常总结</li><li>Python 标准警告总结</li><li>try - except 语句</li><li>try - except - finally 语句</li><li>try - except - else 语句</li><li>raise语句</li></ul></li></ul><h1 id="变量、运算符与数据类型"><a href="#变量、运算符与数据类型" class="headerlink" title="变量、运算符与数据类型"></a>变量、运算符与数据类型</h1><h2 id="1-注释"><a href="#1-注释" class="headerlink" title="1. 注释"></a>1. 注释</h2><ul><li>在 Python 中,<code>#</code> 表示注释,作用于整行。</li></ul><p>【例子】单行注释</p><p>[1]:</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"># 这是一个注释</span><br><span class="line">print("Hello world")</span><br><span class="line"></span><br><span class="line"># Hello world</span><br><span class="line">Hello world</span><br></pre></td></tr></table></figure><ul><li><code>''' '''</code> 或者 <code>""" """</code> 表示区间注释,在三引号之间的所有内容被注释</li></ul><p>【例子】多行注释</p><p>[2]:</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><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><br><span class="line">这是多行注释,用三个单引号</span><br><span class="line">这是多行注释,用三个单引号</span><br><span class="line">这是多行注释,用三个单引号</span><br><span class="line">'''</span><br><span class="line">print("Hello china") </span><br><span class="line"># Hello china</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">这是多行注释,用三个双引号</span><br><span class="line">"""</span><br><span class="line">print("hello china") </span><br><span class="line"># hello china</span><br><span class="line">Hello china</span><br><span class="line">hello china</span><br></pre></td></tr></table></figure><h2 id="2-运算符"><a href="#2-运算符" class="headerlink" title="2. 运算符"></a>2. 运算符</h2><p><strong>算术运算符</strong></p><table><thead><tr><th>操作符</th><th>名称</th><th>示例</th></tr></thead><tbody><tr><td><code>+</code></td><td>加</td><td><code>1 + 1</code></td></tr><tr><td><code>-</code></td><td>减</td><td><code>2 - 1</code></td></tr><tr><td><code>*</code></td><td>乘</td><td><code>3 * 4</code></td></tr><tr><td><code>/</code></td><td>除</td><td><code>3 / 4</code></td></tr><tr><td><code>//</code></td><td>整除(地板除)</td><td><code>3 // 4</code></td></tr><tr><td><code>%</code></td><td>取余</td><td><code>3 % 4</code></td></tr><tr><td><code>**</code></td><td>幂</td><td><code>2 ** 3</code></td></tr></tbody></table><p>【例子】</p><p>[4]:</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><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">print(1 + 1) # 2</span><br><span class="line">print(2 - 1) # 1</span><br><span class="line">print(3 * 4) # 12</span><br><span class="line">print(3 / 4) # 0.75</span><br><span class="line">print(3 // 4) # 0</span><br><span class="line">print(3 % 4) # 3</span><br><span class="line">print(2 ** 4) # 8</span><br><span class="line">print(5//10)</span><br><span class="line">2</span><br><span class="line">1</span><br><span class="line">12</span><br><span class="line">0.75</span><br><span class="line">0</span><br><span class="line">3</span><br><span class="line">16</span><br><span class="line">0</span><br></pre></td></tr></table></figure><p><strong>比较运算符</strong></p><table><thead><tr><th>操作符</th><th>名称</th><th>示例</th></tr></thead><tbody><tr><td><code>></code></td><td>大于</td><td><code>2 > 1</code></td></tr><tr><td><code>>=</code></td><td>大于等于</td><td><code>2 >= 4</code></td></tr><tr><td><code><</code></td><td>小于</td><td><code>1 < 2</code></td></tr><tr><td><code><=</code></td><td>小于等于</td><td><code>5 <= 2</code></td></tr><tr><td><code>==</code></td><td>等于</td><td><code>3 == 4</code></td></tr><tr><td><code>!=</code></td><td>不等于</td><td><code>3 != 5</code></td></tr></tbody></table><p>【例子】</p><p>[4]:</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><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">print(2 > 1) # True</span><br><span class="line">print(2 >= 4) # False</span><br><span class="line">print(1 < 2) # True</span><br><span class="line">print(5 <= 2) # False</span><br><span class="line">print(3 == 4) # False</span><br><span class="line">print(3 != 5) # True</span><br><span class="line">True</span><br><span class="line">False</span><br><span class="line">True</span><br><span class="line">False</span><br><span class="line">False</span><br><span class="line">True</span><br></pre></td></tr></table></figure><p><strong>逻辑运算符</strong></p><table><thead><tr><th>操作符</th><th>名称</th><th>示例</th></tr></thead><tbody><tr><td><code>and</code></td><td>与</td><td><code>(3 > 2) and (3 < 5)</code></td></tr><tr><td><code>or</code></td><td>或</td><td><code>(1 > 3) or (9 < 2)</code></td></tr><tr><td><code>not</code></td><td>非</td><td><code>not (2 > 1)</code></td></tr></tbody></table><p>【例子】</p><p>[5]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">print((3 > 2) and (3 < 5)) # True</span><br><span class="line">print((1 > 3) or (9 < 2)) # False</span><br><span class="line">print(not (2 > 1)) # False</span><br><span class="line">True</span><br><span class="line">False</span><br><span class="line">False</span><br></pre></td></tr></table></figure><p><strong>位运算符</strong></p><table><thead><tr><th>操作符</th><th>名称</th><th>示例</th></tr></thead><tbody><tr><td><code>~</code></td><td>按位取反</td><td><code>~4</code></td></tr><tr><td><code>&</code></td><td>按位与</td><td><code>4 & 5</code></td></tr><tr><td>`</td><td>`</td><td>按位或</td></tr><tr><td><code>^</code></td><td>按位异或</td><td><code>4 ^ 5</code></td></tr><tr><td><code><<</code></td><td>左移</td><td><code>4 << 2</code></td></tr><tr><td><code>>></code></td><td>右移</td><td><code>4 >> 2</code></td></tr></tbody></table><p>【例子】有关二进制的运算,参见“位运算”部分的讲解。</p><p>[6]:</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><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">print(bin(4)) # 0b100</span><br><span class="line">print(bin(5)) # 0b101</span><br><span class="line">print(bin(~4), ~4) # -0b101 -5</span><br><span class="line">print(bin(4 & 5), 4 & 5) # 0b100 4</span><br><span class="line">print(bin(4 | 5), 4 | 5) # 0b101 5</span><br><span class="line">print(bin(4 ^ 5), 4 ^ 5) # 0b1 1</span><br><span class="line">print(bin(4 << 2), 4 << 2) # 0b10000 16</span><br><span class="line">print(bin(4 >> 2), 4 >> 2) # 0b1 1</span><br><span class="line">0b100</span><br><span class="line">0b101</span><br><span class="line">-0b101 -5</span><br><span class="line">0b100 4</span><br><span class="line">0b101 5</span><br><span class="line">0b1 1</span><br><span class="line">0b10000 16</span><br><span class="line">0b1 1</span><br></pre></td></tr></table></figure><p><strong>三元运算符</strong></p><p>【例子】</p><p>[7]:</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><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">x, y = 4, 5</span><br><span class="line">if x < y:</span><br><span class="line"> small = x</span><br><span class="line">else:</span><br><span class="line"> small = y</span><br><span class="line"></span><br><span class="line">print(small) # 4</span><br><span class="line">4</span><br></pre></td></tr></table></figure><p>有了这个三元操作符的条件表达式,你可以使用一条语句来完成以上的条件判断和赋值操作。</p><p>【例子】</p><p>[8]:</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">x, y = 4, 5</span><br><span class="line">small = x if x < y else y</span><br><span class="line">print(small) # 4</span><br><span class="line">4</span><br></pre></td></tr></table></figure><p><strong>其他运算符</strong></p><table><thead><tr><th>操作符</th><th>名称</th><th>示例</th></tr></thead><tbody><tr><td><code>in</code></td><td>存在</td><td><code>'A' in ['A', 'B', 'C']</code></td></tr><tr><td><code>not in</code></td><td>不存在</td><td><code>'h' not in ['A', 'B', 'C']</code></td></tr><tr><td><code>is</code></td><td>是</td><td><code>"hello" is "hello"</code></td></tr><tr><td><code>not is</code></td><td>不是</td><td><code>"hello" is not "hello"</code></td></tr></tbody></table><p>【例子】</p><p>[9]:</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><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">letters = ['A', 'B', 'C']</span><br><span class="line">if 'A' in letters:</span><br><span class="line"> print('A' + ' exists')</span><br><span class="line">if 'h' not in letters:</span><br><span class="line"> print('h' + ' not exists')</span><br><span class="line"></span><br><span class="line"># A exists</span><br><span class="line"># h not exists</span><br><span class="line">A exists</span><br><span class="line">h not exists</span><br></pre></td></tr></table></figure><p>【例子】比较的两个变量均指向不可变类型。</p><p>[10]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">a = "hello"</span><br><span class="line">b = "hello"</span><br><span class="line">print(a is b, a == b) # True True</span><br><span class="line">print(a is not b, a != b) # False False</span><br><span class="line">True True</span><br><span class="line">False False</span><br></pre></td></tr></table></figure><p>【例子】比较的两个变量均指向可变类型。</p><p>[11]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">a = ["hello"]</span><br><span class="line">b = ["hello"]</span><br><span class="line">print(a is b, a == b) # False True</span><br><span class="line">print(a is not b, a != b) # True False</span><br><span class="line">False True</span><br><span class="line">True False</span><br></pre></td></tr></table></figure><p>注意:</p><ul><li>is, is not 对比的是两个变量的内存地址</li><li>==, != 对比的是两个变量的值</li><li>比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。</li><li>对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的。</li></ul><p><strong>运算符的优先级</strong></p><ul><li>一元运算符优于二元运算符。例如<code>3 ** -2</code>等价于<code>3 ** (-2)</code>。</li><li>先算术运算,后移位运算,最后位运算。例如 <code>1 << 3 + 2 & 7</code>等价于 <code>1 << (3 + 2)) & 7</code>。</li><li>逻辑运算最后结合。例如<code>3 < 4 and 4 < 5</code>等价于<code>(3 < 4) and (4 < 5)</code>。</li></ul><p>【例子】</p><p>[12]:</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><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">print(-3 ** 2) # -9</span><br><span class="line">print(3 ** -2) # 0.1111111111111111</span><br><span class="line">print(1 << 3 + 2 & 7) # 0</span><br><span class="line">print(-3 * 2 + 5 / -2 - 4) # -12.5</span><br><span class="line">print(3 < 4 and 4 < 5) # True</span><br><span class="line">-9</span><br><span class="line">0.1111111111111111</span><br><span class="line">0</span><br><span class="line">-12.5</span><br><span class="line">True</span><br></pre></td></tr></table></figure><h2 id="3-变量和赋值"><a href="#3-变量和赋值" class="headerlink" title="3. 变量和赋值"></a>3. 变量和赋值</h2><ul><li>在使用变量之前,需要对其先赋值。</li><li>变量名可以包括字母、数字、下划线、但变量名不能以数字开头。</li><li>Python 变量名是大小写敏感的,foo != Foo。</li></ul><p>【例子】</p><p>[13]:</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></pre></td><td class="code"><pre><span class="line">teacher = "老马的程序人生"</span><br><span class="line">print(teacher) # 老马的程序人生</span><br><span class="line">老马的程序人生</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[14]:</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">first = 2</span><br><span class="line">second = 3</span><br><span class="line">third = first + second</span><br><span class="line">print(third) # 5</span><br><span class="line">5</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[15]:</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">myTeacher = "老马的程序人生"</span><br><span class="line">yourTeacher = "小马的程序人生"</span><br><span class="line">ourTeacher = myTeacher + ',' + yourTeacher</span><br><span class="line">print(ourTeacher) # 老马的程序人生,小马的程序人生</span><br><span class="line">老马的程序人生,小马的程序人生</span><br></pre></td></tr></table></figure><h2 id="4-数据类型与转换"><a href="#4-数据类型与转换" class="headerlink" title="4. 数据类型与转换"></a>4. 数据类型与转换</h2><table><thead><tr><th>类型</th><th>名称</th><th>示例</th></tr></thead><tbody><tr><td>int</td><td>整型 <code><class 'int'></code></td><td><code>-876, 10</code></td></tr><tr><td>float</td><td>浮点型<code><class 'float'></code></td><td><code>3.149, 11.11</code></td></tr><tr><td>bool</td><td>布尔型<code><class 'bool'></code></td><td><code>True, False</code></td></tr></tbody></table><p><strong>整型</strong></p><p>【例子】通过 <code>print()</code> 可看出 <code>a</code> 的值,以及类 (class) 是<code>int</code>。</p><p>[16]:</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">a = 1031</span><br><span class="line">print(a, type(a))</span><br><span class="line"># 1031 <class 'int'></span><br><span class="line">1031 <class 'int'></span><br></pre></td></tr></table></figure><p>Python 里面万物皆对象(object),整型也不例外,只要是对象,就有相应的属性 (attributes) 和方法(methods)。</p><p>【例子】</p><p>[17]:</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><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">b = dir(int)</span><br><span class="line">print(b)</span><br><span class="line"></span><br><span class="line"># ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__',</span><br><span class="line"># '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__',</span><br><span class="line"># '__float__', '__floor__', '__floordiv__', '__format__', '__ge__',</span><br><span class="line"># '__getattribute__', '__getnewargs__', '__gt__', '__hash__',</span><br><span class="line"># '__index__', '__init__', '__init_subclass__', '__int__', '__invert__',</span><br><span class="line"># '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__',</span><br><span class="line"># '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__',</span><br><span class="line"># '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__',</span><br><span class="line"># '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__',</span><br><span class="line"># '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__',</span><br><span class="line"># '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__',</span><br><span class="line"># '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__',</span><br><span class="line"># 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag',</span><br><span class="line"># 'numerator', 'real', 'to_bytes']</span><br><span class="line">['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']</span><br></pre></td></tr></table></figure><p>对它们有个大概印象就可以了,具体怎么用,需要哪些参数 (argument),还需要查文档。看个<code>bit_length()</code>的例子。</p><p>【例子】找到一个整数的二进制表示,再返回其长度。</p><p>[18]:</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 = 1031</span><br><span class="line">print(bin(a)) # 0b10000000111</span><br><span class="line">print(a.bit_length()) # 11</span><br><span class="line">0b10000000111</span><br><span class="line">11</span><br></pre></td></tr></table></figure><p><strong>浮点型</strong></p><p>【例子】</p><p>[19]:</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><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">print(1, type(1))</span><br><span class="line"># 1 <class 'int'></span><br><span class="line"></span><br><span class="line">print(1., type(1.))</span><br><span class="line"># 1.0 <class 'float'></span><br><span class="line"></span><br><span class="line">a = 0.00000023</span><br><span class="line">b = 2.3e-7</span><br><span class="line">print(a) # 2.3e-07</span><br><span class="line">print(b) # 2.3e-07</span><br><span class="line">1 <class 'int'></span><br><span class="line">1.0 <class 'float'></span><br><span class="line">2.3e-07</span><br><span class="line">2.3e-07</span><br></pre></td></tr></table></figure><p>有时候我们想保留浮点型的小数点后 <code>n</code> 位。可以用 <code>decimal</code> 包里的 <code>Decimal</code> 对象和 <code>getcontext()</code> 方法来实现。</p><p>[21]:</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">import decimal</span><br><span class="line">from decimal import Decimal</span><br></pre></td></tr></table></figure><p>Python 里面有很多用途广泛的包 (package),用什么你就引进 (import) 什么。包也是对象,也可以用上面提到的<code>dir(decimal)</code> 来看其属性和方法。</p><p>【例子】<code>getcontext()</code> 显示了 <code>Decimal</code> 对象的默认精度值是 28 位 (<code>prec=28</code>)。</p><p>[22]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">a = decimal.getcontext()</span><br><span class="line">print(a)</span><br><span class="line"></span><br><span class="line"># Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,</span><br><span class="line"># capitals=1, clamp=0, flags=[], </span><br><span class="line"># traps=[InvalidOperation, DivisionByZero, Overflow])</span><br><span class="line">Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])</span><br></pre></td></tr></table></figure><p>[23]:</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">b = Decimal(1) / Decimal(3)</span><br><span class="line">print(b)</span><br><span class="line"></span><br><span class="line"># 0.3333333333333333333333333333</span><br><span class="line">0.3333333333333333333333333333</span><br></pre></td></tr></table></figure><p>【例子】使 1/3 保留 4 位,用 <code>getcontext().prec</code> 来调整精度。</p><p>[24]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">decimal.getcontext().prec = 4</span><br><span class="line">c = Decimal(1) / Decimal(3)</span><br><span class="line">print(c)</span><br><span class="line"></span><br><span class="line"># 0.3333</span><br><span class="line">0.3333</span><br></pre></td></tr></table></figure><p><strong>布尔型</strong></p><p>布尔 (boolean) 型变量只能取两个值,<code>True</code> 和 <code>False</code>。当把布尔型变量用在数字运算中,用 <code>1</code> 和 <code>0</code> 代表 <code>True</code> 和 <code>False</code>。</p><p>【例子】</p><p>[25]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">print(True + True) # 2</span><br><span class="line">print(True + False) # 1</span><br><span class="line">print(True * False) # 0</span><br><span class="line">2</span><br><span class="line">1</span><br><span class="line">0</span><br></pre></td></tr></table></figure><p>除了直接给变量赋值 <code>True</code> 和 <code>False</code>,还可以用 <code>bool(X)</code> 来创建变量,其中 <code>X</code> 可以是</p><ul><li>基本类型:整型、浮点型、布尔型</li><li>容器类型:字符串、元组、列表、字典和集合</li></ul><p>【例子】<code>bool</code> 作用在基本类型变量:<code>X</code> 只要不是整型 <code>0</code>、浮点型 <code>0.0</code>,<code>bool(X)</code> 就是 <code>True</code>,其余就是 <code>False</code>。</p><p>[26]:</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><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">print(type(0), bool(0), bool(1))</span><br><span class="line"># <class 'int'> False True</span><br><span class="line"></span><br><span class="line">print(type(10.31), bool(0.00), bool(10.31))</span><br><span class="line"># <class 'float'> False True</span><br><span class="line"></span><br><span class="line">print(type(True), bool(False), bool(True))</span><br><span class="line"># <class 'bool'> False True</span><br><span class="line"><class 'int'> False True</span><br><span class="line"><class 'float'> False True</span><br><span class="line"><class 'bool'> False True</span><br></pre></td></tr></table></figure><p>【例子】<code>bool</code> 作用在容器类型变量:<code>X</code> 只要不是空的变量,<code>bool(X)</code> 就是 <code>True</code>,其余就是 <code>False</code>。</p><p>[27]:</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><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">print(type(''), bool(''), bool('python'))</span><br><span class="line"># <class 'str'> False True</span><br><span class="line"></span><br><span class="line">print(type(()), bool(()), bool((10,)))</span><br><span class="line"># <class 'tuple'> False True</span><br><span class="line"></span><br><span class="line">print(type([]), bool([]), bool([1, 2]))</span><br><span class="line"># <class 'list'> False True</span><br><span class="line"></span><br><span class="line">print(type({}), bool({}), bool({'a': 1, 'b': 2}))</span><br><span class="line"># <class 'dict'> False True</span><br><span class="line"></span><br><span class="line">print(type(set()), bool(set()), bool({1, 2}))</span><br><span class="line"># <class 'set'> False True</span><br><span class="line"><class 'str'> False True</span><br><span class="line"><class 'tuple'> False True</span><br><span class="line"><class 'list'> False True</span><br><span class="line"><class 'dict'> False True</span><br><span class="line"><class 'set'> False True</span><br></pre></td></tr></table></figure><p>确定<code>bool(X)</code> 的值是 <code>True</code> 还是 <code>False</code>,就看 <code>X</code> 是不是空,空的话就是 <code>False</code>,不空的话就是 <code>True</code>。</p><ul><li>对于数值变量,<code>0</code>, <code>0.0</code> 都可认为是空的。</li><li>对于容器变量,里面没元素就是空的。</li></ul><p><strong>获取类型信息</strong></p><ul><li>获取类型信息 <code>type(object)</code></li></ul><p>【例子】</p><p>[28]:</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><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">print(isinstance(1, int)) # True</span><br><span class="line">print(isinstance(5.2, float)) # True</span><br><span class="line">print(isinstance(True, bool)) # True</span><br><span class="line">print(isinstance('5.2', str)) # True</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">True</span><br><span class="line">True</span><br></pre></td></tr></table></figure><p>注:</p><ul><li><code>type()</code> 不会认为子类是一种父类类型,不考虑继承关系。</li><li><code>isinstance()</code> 会认为子类是一种父类类型,考虑继承关系。</li></ul><p>如果要判断两个类型是否相同推荐使用 <code>isinstance()</code>。</p><p><strong>类型转换</strong></p><ul><li>转换为整型 <code>int(x, base=10)</code></li><li>转换为字符串 <code>str(object='')</code></li><li>转换为浮点型 <code>float(x)</code></li></ul><p>【例子】</p><p>[29]:</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><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">print(int('520')) # 520</span><br><span class="line">print(int(520.52)) # 520</span><br><span class="line">print(float('520.52')) # 520.52</span><br><span class="line">print(float(520)) # 520.0</span><br><span class="line">print(str(10 + 10)) # 20</span><br><span class="line">print(str(10.1 + 5.2)) # 15.3</span><br><span class="line">520</span><br><span class="line">520</span><br><span class="line">520.52</span><br><span class="line">520.0</span><br><span class="line">20</span><br><span class="line">15.3</span><br></pre></td></tr></table></figure><h2 id="5-print-函数"><a href="#5-print-函数" class="headerlink" title="5. print() 函数"></a>5. print() 函数</h2><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">print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)</span><br></pre></td></tr></table></figure><ul><li>将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按<code>str()</code>方式进行转换为字符串输出;</li><li>关键字参数<code>sep</code>是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;</li><li>关键字参数<code>end</code>是输出结束时的字符,默认是换行符<code>\n</code>;</li><li>关键字参数<code>file</code>是定义流输出的文件,可以是标准的系统输出<code>sys.stdout</code>,也可以重定义为别的文件;</li><li>关键字参数<code>flush</code>是立即把内容输出到流文件,不作缓存。</li></ul><p>【例子】没有参数时,每次输出后都会换行。</p><p>[31]:</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><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">shoplist = ['apple', 'mango', 'carrot', 'banana']</span><br><span class="line">print("This is printed without 'end'and 'sep'.")</span><br><span class="line">for item in shoplist:</span><br><span class="line"> print(item)</span><br><span class="line"></span><br><span class="line"># This is printed without 'end'and 'sep'.</span><br><span class="line"># apple</span><br><span class="line"># mango</span><br><span class="line"># carrot</span><br><span class="line"># banana</span><br><span class="line">This is printed without 'end'and 'sep'.</span><br><span class="line">apple</span><br><span class="line">mango</span><br><span class="line">carrot</span><br><span class="line">banana</span><br></pre></td></tr></table></figure><p>【例子】每次输出结束都用<code>end</code>设置的参数<code>&</code>结尾,并没有默认换行。</p><p>[32]:</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><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">shoplist = ['apple', 'mango', 'carrot', 'banana']</span><br><span class="line">print("This is printed with 'end='&''.")</span><br><span class="line">for item in shoplist:</span><br><span class="line"> print(item, end='&')</span><br><span class="line">print('hello world')</span><br><span class="line"></span><br><span class="line"># This is printed with 'end='&''.</span><br><span class="line"># apple&mango&carrot&banana&hello world</span><br><span class="line">This is printed with 'end='&''.</span><br><span class="line">apple&mango&carrot&banana&hello world</span><br></pre></td></tr></table></figure><p>【例子】<code>item</code>值与<code>'another string'</code>两个值之间用<code>sep</code>设置的参数<code>&</code>分割。由于<code>end</code>参数没有设置,因此默认是输出解释后换行,即<code>end</code>参数的默认值为<code>\n</code>。</p><p>[33]:</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><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">shoplist = ['apple', 'mango', 'carrot', 'banana']</span><br><span class="line">print("This is printed with 'sep='&''.")</span><br><span class="line">for item in shoplist:</span><br><span class="line"> print(item, 'another string', sep='&')</span><br><span class="line"></span><br><span class="line"># This is printed with 'sep='&''.</span><br><span class="line"># apple&another string</span><br><span class="line"># mango&another string</span><br><span class="line"># carrot&another string</span><br><span class="line"># banana&another string</span><br><span class="line">This is printed with 'sep='&''.</span><br><span class="line">apple&another string</span><br><span class="line">mango&another string</span><br><span class="line">carrot&another string</span><br><span class="line">banana&another string</span><br></pre></td></tr></table></figure><h1 id="位运算"><a href="#位运算" class="headerlink" title="位运算"></a>位运算</h1><h2 id="1-原码、反码和补码"><a href="#1-原码、反码和补码" class="headerlink" title="1. 原码、反码和补码"></a>1. 原码、反码和补码</h2><p>二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。</p><p><strong>原码</strong>:就是其二进制表示(注意,有一位符号位)。</p><figure class="highlight"><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">00 00 00 11 -> 3</span><br><span class="line">10 00 00 11 -> -3</span><br></pre></td></tr></table></figure><p><strong>反码</strong>:正数的反码就是原码,负数的反码是符号位不变,其余位取反(对应正数按位取反)。</p><figure class="highlight"><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">00 00 00 11 -> 3</span><br><span class="line">11 11 11 00 -> -3</span><br></pre></td></tr></table></figure><p><strong>补码</strong>:正数的补码就是原码,负数的补码是反码+1。</p><figure class="highlight"><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">00 00 00 11 -> 3</span><br><span class="line">11 11 11 01 -> -3</span><br></pre></td></tr></table></figure><p><strong>符号位</strong>:最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。</p><h2 id="2-按位运算"><a href="#2-按位运算" class="headerlink" title="2. 按位运算"></a>2. 按位运算</h2><ul><li>按位非操作 ~</li></ul><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">0</span></span><br><span class="line">~ <span class="number">0</span> = <span class="number">1</span></span><br></pre></td></tr></table></figure><p><code>~</code> 把<code>num</code>的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在 <code>~</code> 运算中同样会取反。</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><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">00 00 01 01 -> 5</span><br><span class="line">~</span><br><span class="line">---</span><br><span class="line">11 11 10 10 -> -6</span><br><span class="line"></span><br><span class="line">11 11 10 11 -> -5</span><br><span class="line">~</span><br><span class="line">---</span><br><span class="line">00 00 01 00 -> 4</span><br></pre></td></tr></table></figure><ul><li>按位与操作 &</li></ul><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="number">1</span> & <span class="number">1</span> = <span class="number">1</span></span><br><span class="line"><span class="number">1</span> & <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 class="number">0</span></span><br><span class="line"><span class="number">0</span> & <span class="number">0</span> = <span class="number">0</span></span><br></pre></td></tr></table></figure><p>只有两个对应位都为 1 时才为 1</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></pre></td><td class="code"><pre><span class="line">00 00 01 01 -> 5</span><br><span class="line">&</span><br><span class="line">00 00 01 10 -> 6</span><br><span class="line">---</span><br><span class="line">00 00 01 00 -> 4</span><br></pre></td></tr></table></figure><ul><li>按位或操作 |</li></ul><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="number">1</span> | <span class="number">1</span> = <span class="number">1</span></span><br><span class="line"><span class="number">1</span> | <span class="number">0</span> = <span class="number">1</span></span><br><span class="line"><span class="number">0</span> | <span class="number">1</span> = <span class="number">1</span></span><br><span class="line"><span class="number">0</span> | <span class="number">0</span> = <span class="number">0</span></span><br></pre></td></tr></table></figure><p>只要两个对应位中有一个 1 时就为 1</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></pre></td><td class="code"><pre><span class="line">00 00 01 01 -> 5</span><br><span class="line">|</span><br><span class="line">00 00 01 10 -> 6</span><br><span class="line">---</span><br><span class="line">00 00 01 11 -> 7</span><br></pre></td></tr></table></figure><ul><li>按位异或操作 ^</li></ul><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="number">1</span> ^ <span class="number">1</span> = <span class="number">0</span></span><br><span class="line"><span class="number">1</span> ^ <span class="number">0</span> = <span class="number">1</span></span><br><span class="line"><span class="number">0</span> ^ <span class="number">1</span> = <span class="number">1</span></span><br><span class="line"><span class="number">0</span> ^ <span class="number">0</span> = <span class="number">0</span></span><br></pre></td></tr></table></figure><p>只有两个对应位不同时才为 1</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></pre></td><td class="code"><pre><span class="line">00 00 01 01 -> 5</span><br><span class="line">^</span><br><span class="line">00 00 01 10 -> 6</span><br><span class="line">---</span><br><span class="line">00 00 00 11 -> 3</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">A: <span class="number">00</span> <span class="number">00</span> <span class="number">11</span> <span class="number">00</span></span><br><span class="line">B: <span class="number">00</span> <span class="number">00</span> <span class="number">01</span> <span class="number">11</span></span><br><span class="line"></span><br><span class="line">A^B: <span class="number">00</span> <span class="number">00</span> <span class="number">10</span> <span class="number">11</span></span><br><span class="line">B^A: <span class="number">00</span> <span class="number">00</span> <span class="number">10</span> <span class="number">11</span></span><br><span class="line"></span><br><span class="line">A^A: <span class="number">00</span> <span class="number">00</span> <span class="number">00</span> <span class="number">00</span></span><br><span class="line">A^<span class="number">0</span>: <span class="number">00</span> <span class="number">00</span> <span class="number">11</span> <span class="number">00</span></span><br><span class="line"></span><br><span class="line">A^B^A: = A^A^B = B = <span class="number">00</span> <span class="number">00</span> <span class="number">01</span> <span class="number">11</span></span><br></pre></td></tr></table></figure><ul><li>按位左移操作 <<</li></ul><p><code>num << i</code> 将<code>num</code>的二进制表示向左移动<code>i</code>位所得的值。</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">00 00 10 11 -> 11</span><br><span class="line"><span class="number">11</span> << <span class="number">3</span></span><br><span class="line">---</span><br><span class="line">01 01 10 00 -> 88</span><br></pre></td></tr></table></figure><ul><li>按位右移操作 >></li></ul><p><code>num >> i</code> 将<code>num</code>的二进制表示向右移动<code>i</code>位所得的值。</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">00 00 10 11 -> 11</span><br><span class="line"><span class="number">11</span> >> <span class="number">2</span></span><br><span class="line">---</span><br><span class="line">00 00 00 10 -> 2</span><br></pre></td></tr></table></figure><h2 id="3-利用位运算实现快速计算"><a href="#3-利用位运算实现快速计算" class="headerlink" title="3. 利用位运算实现快速计算"></a>3. 利用位运算实现快速计算</h2><p>通过 <code><<</code>,<code>>></code> 快速计算2的倍数问题。</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></pre></td><td class="code"><pre><span class="line">n << 1 -> 计算 n*2</span><br><span class="line">n >> 1 -> 计算 n/2,负奇数的运算不可用</span><br><span class="line">n << m -> 计算 n*(2^m),即乘以 2 的 m 次方</span><br><span class="line">n >> m -> 计算 n/(2^m),即除以 2 的 m 次方</span><br><span class="line">1 << n -> 2^n</span><br></pre></td></tr></table></figure><p>通过 <code>^</code> 快速交换两个整数。 通过 <code>^</code> 快速交换两个整数。</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">a ^= b</span><br><span class="line">b ^= a</span><br><span class="line">a ^= b</span><br></pre></td></tr></table></figure><p>通过 <code>a & (-a)</code> 快速获取<code>a</code>的最后为 1 位置的整数。</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><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">00 00 01 01 -> 5</span><br><span class="line">&</span><br><span class="line">11 11 10 11 -> -5</span><br><span class="line">---</span><br><span class="line">00 00 00 01 -> 1</span><br><span class="line"></span><br><span class="line">00 00 11 10 -> 14</span><br><span class="line">&</span><br><span class="line">11 11 00 10 -> -14</span><br><span class="line">---</span><br><span class="line">00 00 00 10 -> 2</span><br></pre></td></tr></table></figure><h2 id="4-利用位运算实现整数集合"><a href="#4-利用位运算实现整数集合" class="headerlink" title="4. 利用位运算实现整数集合"></a>4. 利用位运算实现整数集合</h2><p>一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。</p><p>比如集合 <code>{1, 3, 4, 8}</code>,可以表示成 <code>01 00 01 10 10</code> 而对应的位运算也就可以看作是对集合进行的操作。</p><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></pre></td><td class="code"><pre><span class="line">a | (1<<i) -> 把 i 插入到集合中</span><br><span class="line">a & ~(1<<i) -> 把 i 从集合中删除</span><br><span class="line">a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)</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></pre></td><td class="code"><pre><span class="line">a 补 -> ~a</span><br><span class="line">a 交 b -> a & b</span><br><span class="line">a 并 b -> a | b</span><br><span class="line">a 差 b -> a & (~b)</span><br></pre></td></tr></table></figure><p>注意:整数在内存中是以补码的形式存在的,输出自然也是按照补码输出。</p><p>【例子】C#语言输出负数。</p><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><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">class Program</span><br><span class="line">{</span><br><span class="line"> static void Main(string[] args)</span><br><span class="line"> {</span><br><span class="line"> string s1 = Convert.ToString(-3, 2);</span><br><span class="line"> Console.WriteLine(s1); </span><br><span class="line"> // 11111111111111111111111111111101</span><br><span class="line"> </span><br><span class="line"> string s2 = Convert.ToString(-3, 16);</span><br><span class="line"> Console.WriteLine(s2); </span><br><span class="line"> // fffffffd</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>【例子】 Python 的<code>bin()</code> 输出。</p><p>[37]:</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><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">print(bin(3)) # 0b11</span><br><span class="line">print(bin(-3)) # -0b11</span><br><span class="line"></span><br><span class="line">print(bin(-3 & 0xffffffff)) </span><br><span class="line"># 0b11111111111111111111111111111101</span><br><span class="line"></span><br><span class="line">print(bin(0xfffffffd)) </span><br><span class="line"># 0b11111111111111111111111111111101</span><br><span class="line"></span><br><span class="line">print(0xfffffffd) # 4294967293</span><br><span class="line">0b11</span><br><span class="line">-0b11</span><br><span class="line">0b11111111111111111111111111111101</span><br><span class="line">0b11111111111111111111111111111101</span><br><span class="line">4294967293</span><br></pre></td></tr></table></figure><p>是不是很颠覆认知,我们从结果可以看出:</p><ul><li>Python中<code>bin</code>一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,巨坑。</li><li>Python中的整型是补码形式存储的。</li><li>Python中整型是不限制长度的不会超范围溢出。</li></ul><p>所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数<code>0xffffffff</code>进行按位与操作,再交给<code>bin()</code>进行输出,得到的才是负数的补码表示。</p><h1 id="条件语句"><a href="#条件语句" class="headerlink" title="条件语句"></a>条件语句</h1><h2 id="1-if-语句"><a href="#1-if-语句" class="headerlink" title="1. if 语句"></a>1. if 语句</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="keyword">if</span> expression:</span><br><span class="line"> expr_true_suite</span><br></pre></td></tr></table></figure><ul><li>if 语句的 <code>expr_true_suite</code> 代码块只有当条件表达式 <code>expression</code> 结果为真时才执行,否则将继续执行紧跟在该代码块后面的语句。</li><li>单个 if 语句中的 <code>expression</code> 条件表达式可以通过布尔操作符 <code>and</code>,<code>or</code>和<code>not</code> 实现多重条件判断。</li></ul><p>【例子】</p><p>[38]:</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">if 2 > 1 and not 2 > 3:</span><br><span class="line"> print('Correct Judgement!')</span><br><span class="line"></span><br><span class="line"># Correct Judgement!</span><br><span class="line">Correct Judgement!</span><br></pre></td></tr></table></figure><h2 id="2-if-else-语句"><a href="#2-if-else-语句" class="headerlink" title="2. if - else 语句"></a>2. if - 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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> expression:</span><br><span class="line"> expr_true_suite</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> expr_false_suite</span><br></pre></td></tr></table></figure><ul><li>Python 提供与 if 搭配使用的 else,如果 if 语句的条件表达式结果布尔值为假,那么程序将执行 else 语句后的代码。</li></ul><p>【例子】</p><p>[39]:</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><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">temp = input("猜一猜小姐姐想的是哪个数字?")</span><br><span class="line">guess = int(temp) # input 函数将接收的任何数据类型都默认为 str。</span><br><span class="line">if guess == 666:</span><br><span class="line"> print("你太了解小姐姐的心思了!")</span><br><span class="line"> print("哼,猜对也没有奖励!")</span><br><span class="line">else:</span><br><span class="line"> print("猜错了,小姐姐现在心里想的是666!")</span><br><span class="line">print("游戏结束,不玩儿啦!")</span><br><span class="line">猜一猜小姐姐想的是哪个数字?666</span><br><span class="line">你太了解小姐姐的心思了!</span><br><span class="line">哼,猜对也没有奖励!</span><br><span class="line">游戏结束,不玩儿啦!</span><br></pre></td></tr></table></figure><p><code>if</code>语句支持嵌套,即在一个<code>if</code>语句中嵌入另一个<code>if</code>语句,从而构成不同层次的选择结构。</p><p>【例子】Python 使用缩进而不是大括号来标记代码块边界,因此要特别注意<code>else</code>的悬挂问题。</p><p>[40]:</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><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">hi = 6</span><br><span class="line">if hi > 2:</span><br><span class="line"> if hi > 7:</span><br><span class="line"> print('好棒!好棒!')</span><br><span class="line">else:</span><br><span class="line"> print('切~')</span><br><span class="line"></span><br><span class="line"># 无输出</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[41]:</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><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">temp = input("猜一猜小姐姐想的是哪个数字?")</span><br><span class="line">guess = int(temp)</span><br><span class="line">if guess > 8:</span><br><span class="line"> print("大了,大了")</span><br><span class="line">else:</span><br><span class="line"> if guess == 8:</span><br><span class="line"> print("你太了解小姐姐的心思了!")</span><br><span class="line"> print("哼,猜对也没有奖励!")</span><br><span class="line"> else:</span><br><span class="line"> print("小了,小了")</span><br><span class="line">print("游戏结束,不玩儿啦!")</span><br><span class="line">猜一猜小姐姐想的是哪个数字?8</span><br><span class="line">你太了解小姐姐的心思了!</span><br><span class="line">哼,猜对也没有奖励!</span><br><span class="line">游戏结束,不玩儿啦!</span><br></pre></td></tr></table></figure><h2 id="3-if-elif-else-语句"><a href="#3-if-elif-else-语句" class="headerlink" title="3. if - elif - else 语句"></a>3. if - elif - 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><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> expression1:</span><br><span class="line"> expr1_true_suite</span><br><span class="line"><span class="keyword">elif</span> expression2:</span><br><span class="line"> expr2_true_suite</span><br><span class="line"> .</span><br><span class="line"> .</span><br><span class="line"><span class="keyword">elif</span> expressionN:</span><br><span class="line"> exprN_true_suite</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> expr_false_suite</span><br></pre></td></tr></table></figure><ul><li>elif 语句即为 else if,用来检查多个表达式是否为真,并在为真时执行特定代码块中的代码。</li></ul><p>【例子】</p><p>[42]:</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><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">temp = input('请输入成绩:')</span><br><span class="line">source = int(temp)</span><br><span class="line">if 100 >= source >= 90:</span><br><span class="line"> print('A')</span><br><span class="line">elif 90 > source >= 80:</span><br><span class="line"> print('B')</span><br><span class="line">elif 80 > source >= 60:</span><br><span class="line"> print('C')</span><br><span class="line">elif 60 > source >= 0:</span><br><span class="line"> print('D')</span><br><span class="line">else:</span><br><span class="line"> print('输入错误!')</span><br><span class="line">请输入成绩:99</span><br><span class="line">A</span><br></pre></td></tr></table></figure><h2 id="4-assert-关键词"><a href="#4-assert-关键词" class="headerlink" title="4. assert 关键词"></a>4. assert 关键词</h2><ul><li><code>assert</code>这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出<code>AssertionError</code>的异常。</li></ul><p>【例子】</p><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">my_list = ['lsgogroup']</span><br><span class="line">my_list.pop(0)</span><br><span class="line">assert len(my_list) > 0</span><br><span class="line"></span><br><span class="line"># AssertionError</span><br></pre></td></tr></table></figure><p>【例子】在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。</p><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></pre></td><td class="code"><pre><span class="line">assert 3 > 7</span><br><span class="line"></span><br><span class="line"># AssertionError</span><br></pre></td></tr></table></figure><h1 id="循环语句"><a href="#循环语句" class="headerlink" title="循环语句"></a>循环语句</h1><h2 id="1-while-循环"><a href="#1-while-循环" class="headerlink" title="1. while 循环"></a>1. while 循环</h2><p><code>while</code>语句最基本的形式包括一个位于顶部的布尔表达式,一个或多个属于<code>while</code>代码块的缩进语句。</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">while</span> 布尔表达式:</span><br><span class="line"> 代码块</span><br></pre></td></tr></table></figure><p><code>while</code>循环的代码块会一直循环执行,直到布尔表达式的值为布尔假。</p><p>如果布尔表达式不带有<code><、>、==、!=、in、not in</code>等运算符,仅仅给出数值之类的条件,也是可以的。当<code>while</code>后写入一个非零整数时,视为真值,执行循环体;写入<code>0</code>时,视为假值,不执行循环体。也可以写入<code>str、list</code>或任何序列,长度非零则视为真值,执行循环体;否则视为假值,不执行循环体。</p><p>【例子】</p><p>[44]:</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><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">count = 0</span><br><span class="line">while count < 3:</span><br><span class="line"> temp = input("猜一猜小姐姐想的是哪个数字?")</span><br><span class="line"> guess = int(temp)</span><br><span class="line"> if guess > 8:</span><br><span class="line"> print("大了,大了")</span><br><span class="line"> else:</span><br><span class="line"> if guess == 8:</span><br><span class="line"> print("你太了解小姐姐的心思了!")</span><br><span class="line"> print("哼,猜对也没有奖励!")</span><br><span class="line"> count = 3</span><br><span class="line"> else:</span><br><span class="line"> print("小了,小了")</span><br><span class="line"> count = count + 1</span><br><span class="line">print("游戏结束,不玩儿啦!")</span><br><span class="line">猜一猜小姐姐想的是哪个数字?8</span><br><span class="line">你太了解小姐姐的心思了!</span><br><span class="line">哼,猜对也没有奖励!</span><br><span class="line">游戏结束,不玩儿啦!</span><br></pre></td></tr></table></figure><p>【例子】布尔表达式返回0,循环终止。</p><p>[45]:</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><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">string = 'abcd'</span><br><span class="line">while string:</span><br><span class="line"> print(string)</span><br><span class="line"> string = string[1:]</span><br><span class="line"></span><br><span class="line"># abcd</span><br><span class="line"># bcd</span><br><span class="line"># cd</span><br><span class="line"># d</span><br><span class="line">abcd</span><br><span class="line">bcd</span><br><span class="line">cd</span><br><span class="line">d</span><br></pre></td></tr></table></figure><hr><h2 id="2-while-else-循环"><a href="#2-while-else-循环" class="headerlink" title="2. while - else 循环"></a>2. while - 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></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> 布尔表达式:</span><br><span class="line"> 代码块</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> 代码块</span><br></pre></td></tr></table></figure><p>当<code>while</code>循环正常执行完的情况下,执行<code>else</code>输出,如果<code>while</code>循环中执行了跳出循环的语句,比如 <code>break</code>,将不执行<code>else</code>代码块的内容。</p><p>【例子】</p><p>[46]:</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><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">count = 0</span><br><span class="line">while count < 5:</span><br><span class="line"> print("%d is less than 5" % count)</span><br><span class="line"> count = count + 1</span><br><span class="line">else:</span><br><span class="line"> print("%d is not less than 5" % count)</span><br><span class="line"> </span><br><span class="line"># 0 is less than 5</span><br><span class="line"># 1 is less than 5</span><br><span class="line"># 2 is less than 5</span><br><span class="line"># 3 is less than 5</span><br><span class="line"># 4 is less than 5</span><br><span class="line"># 5 is not less than 5</span><br><span class="line">0 is less than 5</span><br><span class="line">1 is less than 5</span><br><span class="line">2 is less than 5</span><br><span class="line">3 is less than 5</span><br><span class="line">4 is less than 5</span><br><span class="line">5 is not less than 5</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[47]:</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><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">count = 0</span><br><span class="line">while count < 5:</span><br><span class="line"> print("%d is less than 5" % count)</span><br><span class="line"> count = 6</span><br><span class="line"> break</span><br><span class="line">else:</span><br><span class="line"> print("%d is not less than 5" % count)</span><br><span class="line"></span><br><span class="line"># 0 is less than 5</span><br><span class="line">0 is less than 5</span><br></pre></td></tr></table></figure><hr><h2 id="3-for-循环"><a href="#3-for-循环" class="headerlink" title="3. for 循环"></a>3. for 循环</h2><p><code>for</code>循环是迭代循环,在Python中相当于一个通用的序列迭代器,可以遍历任何有序序列,如<code>str、list、tuple</code>等,也可以遍历任何可迭代对象,如<code>dict</code>。</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">for</span> 迭代变量 <span class="keyword">in</span> 可迭代对象:</span><br><span class="line"> 代码块</span><br></pre></td></tr></table></figure><p>每次循环,迭代变量被设置为可迭代对象的当前元素,提供给代码块使用。</p><p>【例子】</p><p>[48]:</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">for i in 'ILoveLSGO':</span><br><span class="line"> print(i, end=' ') # 不换行输出</span><br><span class="line"></span><br><span class="line"># I L o v e L S G O</span><br><span class="line">I L o v e L S G O</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[49]:</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><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">member = ['张三', '李四', '刘德华', '刘六', '周润发']</span><br><span class="line">for each in member:</span><br><span class="line"> print(each)</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"># 刘六</span><br><span class="line"># 周润发</span><br><span class="line"></span><br><span class="line">for i in range(len(member)):</span><br><span class="line"> print(member[i])</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"># 刘六</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">刘六</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">刘六</span><br><span class="line">周润发</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[50]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}</span><br><span class="line"></span><br><span class="line">for key, value in dic.items():</span><br><span class="line"> print(key, value, sep=':', end=' ')</span><br><span class="line"> </span><br><span class="line"># a:1 b:2 c:3 d:4 </span><br><span class="line">a:1 b:2 c:3 d:4</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[51]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}</span><br><span class="line"></span><br><span class="line">for key in dic.keys():</span><br><span class="line"> print(key, end=' ')</span><br><span class="line"> </span><br><span class="line"># a b c d </span><br><span class="line">a b c d</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[52]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}</span><br><span class="line"></span><br><span class="line">for value in dic.values():</span><br><span class="line"> print(value, end=' ')</span><br><span class="line"> </span><br><span class="line"># 1 2 3 4</span><br><span class="line">1 2 3 4</span><br></pre></td></tr></table></figure><hr><h2 id="4-for-else-循环"><a href="#4-for-else-循环" class="headerlink" title="4. for - else 循环"></a>4. 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></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> 迭代变量 <span class="keyword">in</span> 可迭代对象:</span><br><span class="line"> 代码块</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> 代码块</span><br></pre></td></tr></table></figure><p>当<code>for</code>循环正常执行完的情况下,执行<code>else</code>输出,如果<code>for</code>循环中执行了跳出循环的语句,比如 <code>break</code>,将不执行<code>else</code>代码块的内容,与<code>while - else</code>语句一样。</p><p>【例子】</p><p>[53]:</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><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">for num in range(10, 20): # 迭代 10 到 20 之间的数字</span><br><span class="line"> for i in range(2, num): # 根据因子迭代</span><br><span class="line"> if num % i == 0: # 确定第一个因子</span><br><span class="line"> j = num / i # 计算第二个因子</span><br><span class="line"> print('%d 等于 %d * %d' % (num, i, j))</span><br><span class="line"> break # 跳出当前循环</span><br><span class="line"> else: # 循环的 else 部分</span><br><span class="line"> print(num, '是一个质数')</span><br><span class="line"></span><br><span class="line"># 10 等于 2 * 5</span><br><span class="line"># 11 是一个质数</span><br><span class="line"># 12 等于 2 * 6</span><br><span class="line"># 13 是一个质数</span><br><span class="line"># 14 等于 2 * 7</span><br><span class="line"># 15 等于 3 * 5</span><br><span class="line"># 16 等于 2 * 8</span><br><span class="line"># 17 是一个质数</span><br><span class="line"># 18 等于 2 * 9</span><br><span class="line"># 19 是一个质数</span><br><span class="line">10 等于 2 * 5</span><br><span class="line">11 是一个质数</span><br><span class="line">12 等于 2 * 6</span><br><span class="line">13 是一个质数</span><br><span class="line">14 等于 2 * 7</span><br><span class="line">15 等于 3 * 5</span><br><span class="line">16 等于 2 * 8</span><br><span class="line">17 是一个质数</span><br><span class="line">18 等于 2 * 9</span><br><span class="line">19 是一个质数</span><br></pre></td></tr></table></figure><hr><h2 id="5-range-函数"><a href="#5-range-函数" class="headerlink" title="5. range() 函数"></a>5. range() 函数</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">range([start,] stop[, step=<span class="number">1</span>])</span><br></pre></td></tr></table></figure><ul><li>这个BIF(Built-in functions)有三个参数,其中用中括号括起来的两个表示这两个参数是可选的。</li><li><code>step=1</code> 表示第三个参数的默认值是1。</li><li><code>range</code> 这个BIF的作用是生成一个从<code>start</code>参数的值开始到<code>stop</code>参数的值结束的数字序列,该序列包含<code>start</code>的值但不包含<code>stop</code>的值。</li></ul><p>【例子】</p><p>[54]:</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><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">for i in range(2, 9): # 不包含9</span><br><span class="line"> print(i)</span><br><span class="line"></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">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></tr></table></figure><p>【例子】</p><p>[55]:</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><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">for i in range(1, 10, 2):</span><br><span class="line"> print(i)</span><br><span class="line"></span><br><span class="line"># 1</span><br><span class="line"># 3</span><br><span class="line"># 5</span><br><span class="line"># 7</span><br><span class="line"># 9</span><br><span class="line">1</span><br><span class="line">3</span><br><span class="line">5</span><br><span class="line">7</span><br><span class="line">9</span><br></pre></td></tr></table></figure><hr><h2 id="6-enumerate-函数"><a href="#6-enumerate-函数" class="headerlink" title="6. enumerate()函数"></a>6. enumerate()函数</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">enumerate(sequence, [start=<span class="number">0</span>])</span><br></pre></td></tr></table></figure><ul><li>sequence:一个序列、迭代器或其他支持迭代对象。</li><li>start:下标起始位置。</li><li>返回 enumerate(枚举) 对象</li></ul><p>【例子】</p><p>[56]:</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><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">seasons = ['Spring', 'Summer', 'Fall', 'Winter']</span><br><span class="line">lst = list(enumerate(seasons))</span><br><span class="line">print(lst)</span><br><span class="line"># [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]</span><br><span class="line">lst = list(enumerate(seasons, start=1)) # 下标从 1 开始</span><br><span class="line">print(lst)</span><br><span class="line"># [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]</span><br><span class="line">[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]</span><br><span class="line">[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]</span><br></pre></td></tr></table></figure><p><code>enumerate()</code>与 for 循环的结合使用。</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">for</span> i, a <span class="keyword">in</span> enumerate(A)</span><br><span class="line"> do something <span class="keyword">with</span> a</span><br></pre></td></tr></table></figure><p>用 <code>enumerate(A)</code> 不仅返回了 <code>A</code> 中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用 <code>enumerate(A, j)</code> 还可以确定索引起始值为 <code>j</code>。</p><p>【例子】</p><p>[57]:</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><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">languages = ['Python', 'R', 'Matlab', 'C++']</span><br><span class="line">for language in languages:</span><br><span class="line"> print('I love', language)</span><br><span class="line">print('Done!')</span><br><span class="line"># I love Python</span><br><span class="line"># I love R</span><br><span class="line"># I love Matlab</span><br><span class="line"># I love C++</span><br><span class="line"># Done!</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">for i, language in enumerate(languages, 2):</span><br><span class="line"> print(i, 'I love', language)</span><br><span class="line">print('Done!')</span><br><span class="line"># 2 I love Python</span><br><span class="line"># 3 I love R</span><br><span class="line"># 4 I love Matlab</span><br><span class="line"># 5 I love C++</span><br><span class="line"># Done!</span><br><span class="line">I love Python</span><br><span class="line">I love R</span><br><span class="line">I love Matlab</span><br><span class="line">I love C++</span><br><span class="line">Done!</span><br><span class="line">2 I love Python</span><br><span class="line">3 I love R</span><br><span class="line">4 I love Matlab</span><br><span class="line">5 I love C++</span><br><span class="line">Done!</span><br></pre></td></tr></table></figure><hr><h2 id="7-break-语句"><a href="#7-break-语句" class="headerlink" title="7. break 语句"></a>7. break 语句</h2><p><code>break</code>语句可以跳出当前所在层的循环。</p><p>【例子】</p><p>[59]:</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><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">import random</span><br><span class="line">secret = random.randint(1, 10) #[1,10]之间的随机数</span><br><span class="line"></span><br><span class="line">while True:</span><br><span class="line"> temp = input("猜一猜小姐姐想的是哪个数字?")</span><br><span class="line"> guess = int(temp)</span><br><span class="line"> if guess > secret:</span><br><span class="line"> print("大了,大了")</span><br><span class="line"> else:</span><br><span class="line"> if guess == secret:</span><br><span class="line"> print("你太了解小姐姐的心思了!")</span><br><span class="line"> print("哼,猜对也没有奖励!")</span><br><span class="line"> break</span><br><span class="line"> else:</span><br><span class="line"> print("小了,小了")</span><br><span class="line">print("游戏结束,不玩儿啦!")</span><br><span class="line">猜一猜小姐姐想的是哪个数字?8</span><br><span class="line">你太了解小姐姐的心思了!</span><br><span class="line">哼,猜对也没有奖励!</span><br><span class="line">游戏结束,不玩儿啦!</span><br></pre></td></tr></table></figure><hr><h2 id="8-continue-语句"><a href="#8-continue-语句" class="headerlink" title="8. continue 语句"></a>8. continue 语句</h2><p><code>continue</code>终止本轮循环并开始下一轮循环。</p><p>【例子】</p><p>[60]:</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><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">for i in range(10):</span><br><span class="line"> if i % 2 != 0:</span><br><span class="line"> print(i)</span><br><span class="line"> continue</span><br><span class="line"> i += 2</span><br><span class="line"> print(i)</span><br><span class="line"></span><br><span class="line"># 2</span><br><span class="line"># 1</span><br><span class="line"># 4</span><br><span class="line"># 3</span><br><span class="line"># 6</span><br><span class="line"># 5</span><br><span class="line"># 8</span><br><span class="line"># 7</span><br><span class="line"># 10</span><br><span class="line"># 9</span><br><span class="line">2</span><br><span class="line">1</span><br><span class="line">4</span><br><span class="line">3</span><br><span class="line">6</span><br><span class="line">5</span><br><span class="line">8</span><br><span class="line">7</span><br><span class="line">10</span><br><span class="line">9</span><br></pre></td></tr></table></figure><hr><h2 id="9-pass-语句"><a href="#9-pass-语句" class="headerlink" title="9. pass 语句"></a>9. pass 语句</h2><p><code>pass</code> 语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 <code>pass</code> 语句就是用来解决这些问题的。</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="function"><span class="keyword">def</span> <span class="title">a_func</span><span class="params">()</span>:</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># SyntaxError: unexpected EOF while parsing</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="function"><span class="keyword">def</span> <span class="title">a_func</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">pass</span></span><br></pre></td></tr></table></figure><p><code>pass</code>是空语句,不做任何操作,只起到占位的作用,其作用是为了保持程序结构的完整性。尽管<code>pass</code>语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个<code>pass</code>语句,让代码可以正常运行。</p><hr><h2 id="10-推导式"><a href="#10-推导式" class="headerlink" title="10. 推导式"></a>10. 推导式</h2><p><strong>列表推导式</strong></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">[ expr <span class="keyword">for</span> value <span class="keyword">in</span> collection [<span class="keyword">if</span> condition] ]</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[61]:</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">x = [-4, -2, 0, 2, 4]</span><br><span class="line">y = [a * 2 for a in x]</span><br><span class="line">print(y)</span><br><span class="line"># [-8, -4, 0, 4, 8]</span><br><span class="line">[-8, -4, 0, 4, 8]</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[63]:</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">x = [i ** 2 for i in range(1, 10)]</span><br><span class="line">print(x)</span><br><span class="line"># [1, 4, 9, 16, 25, 36, 49, 64, 81]</span><br><span class="line">[1, 4, 9, 16, 25, 36, 49, 64, 81]</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[64]:</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">x = [(i, i ** 2) for i in range(6)]</span><br><span class="line">print(x)</span><br><span class="line"></span><br><span class="line"># [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]</span><br><span class="line">[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[65]:</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">x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]</span><br><span class="line">print(x)</span><br><span class="line"></span><br><span class="line"># [3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99]</span><br><span class="line">[3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99]</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[66]:</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 = [(i, j) for i in range(0, 3) for j in range(0, 3)]</span><br><span class="line">print(a)</span><br><span class="line"></span><br><span class="line"># [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]</span><br><span class="line">[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[67]:</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><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">x = [[i, j] for i in range(0, 3) for j in range(0, 3)]</span><br><span class="line">print(x)</span><br><span class="line"># [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]</span><br><span class="line"></span><br><span class="line">x[0][0] = 10</span><br><span class="line">print(x)</span><br><span class="line"># [[10, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]</span><br><span class="line">[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]</span><br><span class="line">[[10, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[68]:</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 = [(i, j) for i in range(0, 3) if i < 1 for j in range(0, 3) if j > 1]</span><br><span class="line">print(a)</span><br><span class="line"></span><br><span class="line"># [(0, 2)]</span><br><span class="line">[(0, 2)]</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></pre></td><td class="code"><pre><span class="line">( expr <span class="keyword">for</span> value <span class="keyword">in</span> collection [<span class="keyword">if</span> condition] )</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[69]:</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><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">a = (x for x in range(10))</span><br><span class="line">print(a)</span><br><span class="line"></span><br><span class="line"># <generator object <genexpr> at 0x0000025BE511CC48></span><br><span class="line"></span><br><span class="line">print(tuple(a))</span><br><span class="line"></span><br><span class="line"># (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)</span><br><span class="line"><generator object <genexpr> at 0x0000014CEC2E28B8></span><br><span class="line">(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)</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></pre></td><td class="code"><pre><span class="line">{ key_expr: value_expr <span class="keyword">for</span> value <span class="keyword">in</span> collection [<span class="keyword">if</span> condition] }</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[70]:</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">b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}</span><br><span class="line">print(b)</span><br><span class="line"># {0: True, 3: False, 6: True, 9: False}</span><br><span class="line">{0: True, 3: False, 6: True, 9: False}</span><br></pre></td></tr></table></figure><p><strong>集合推导式</strong></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">{ expr for value in collection [if condition] }</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[71]:</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">c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}</span><br><span class="line">print(c)</span><br><span class="line"># {1, 2, 3, 4, 5, 6}</span><br><span class="line">{1, 2, 3, 4, 5, 6}</span><br></pre></td></tr></table></figure><p><strong>其它</strong></p><ul><li><code>next(iterator[, default])</code> Return the next item from the iterator. If default is given and the iterator is exhausted, it is returned instead of raising StopIteration.</li></ul><p>【例子】</p><p>[72]:</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><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">e = (i for i in range(10))</span><br><span class="line">print(e)</span><br><span class="line"># <generator object <genexpr> at 0x0000007A0B8D01B0></span><br><span class="line"></span><br><span class="line">print(next(e)) # 0</span><br><span class="line">print(next(e)) # 1</span><br><span class="line"></span><br><span class="line">for each in e:</span><br><span class="line"> print(each, end=' ')</span><br><span class="line"></span><br><span class="line"># 2 3 4 5 6 7 8 9</span><br><span class="line"><generator object <genexpr> at 0x0000014CEC389C78></span><br><span class="line">0</span><br><span class="line">1</span><br><span class="line">2 3 4 5 6 7 8 9</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[73]:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">s = sum([i for i in range(101)])</span><br><span class="line">print(s) # 5050</span><br><span class="line">s = sum((i for i in range(101)))</span><br><span class="line">print(s) # 5050</span><br><span class="line">5050</span><br><span class="line">5050</span><br></pre></td></tr></table></figure><h1 id="异常处理"><a href="#异常处理" class="headerlink" title="异常处理"></a>异常处理</h1><p>异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。</p><h2 id="1-Python-标准异常总结"><a href="#1-Python-标准异常总结" class="headerlink" title="1. Python 标准异常总结"></a>1. Python 标准异常总结</h2><ul><li>BaseException:所有异常的 <strong>基类</strong></li><li>Exception:常规异常的 <strong>基类</strong></li><li>StandardError:所有的内建标准异常的基类</li><li>ArithmeticError:所有数值计算异常的基类</li><li>FloatingPointError:浮点计算异常</li><li>OverflowError:数值运算超出最大限制</li><li>ZeroDivisionError:除数为零</li><li>AssertionError:断言语句(assert)失败</li><li>AttributeError:尝试访问未知的对象属性</li><li>EOFError:没有内建输入,到达EOF标记</li><li>EnvironmentError:操作系统异常的基类</li><li>IOError:输入/输出操作失败</li><li>OSError:操作系统产生的异常(例如打开一个不存在的文件)</li><li>WindowsError:系统调用失败</li><li>ImportError:导入模块失败的时候</li><li>KeyboardInterrupt:用户中断执行</li><li>LookupError:无效数据查询的基类</li><li>IndexError:索引超出序列的范围</li><li>KeyError:字典中查找一个不存在的关键字</li><li>MemoryError:内存溢出(可通过删除对象释放内存)</li><li>NameError:尝试访问一个不存在的变量</li><li>UnboundLocalError:访问未初始化的本地变量</li><li>ReferenceError:弱引用试图访问已经垃圾回收了的对象</li><li>RuntimeError:一般的运行时异常</li><li>NotImplementedError:尚未实现的方法</li><li>SyntaxError:语法错误导致的异常</li><li>IndentationError:缩进错误导致的异常</li><li>TabError:Tab和空格混用</li><li>SystemError:一般的解释器系统异常</li><li>TypeError:不同类型间的无效操作</li><li>ValueError:传入无效的参数</li><li>UnicodeError:Unicode相关的异常</li><li>UnicodeDecodeError:Unicode解码时的异常</li><li>UnicodeEncodeError:Unicode编码错误导致的异常</li><li>UnicodeTranslateError:Unicode转换错误导致的异常</li></ul><p>异常体系内部有层次关系,Python异常体系中的部分关系如下所示:</p><p><img src="https://img-blog.csdnimg.cn/20200710131404548.png" alt="Image"></p><hr><h2 id="2-Python标准警告总结"><a href="#2-Python标准警告总结" class="headerlink" title="2. Python标准警告总结"></a>2. Python标准警告总结</h2><ul><li>Warning:警告的基类</li><li>DeprecationWarning:关于被弃用的特征的警告</li><li>FutureWarning:关于构造将来语义会有改变的警告</li><li>UserWarning:用户代码生成的警告</li><li>PendingDeprecationWarning:关于特性将会被废弃的警告</li><li>RuntimeWarning:可疑的运行时行为(runtime behavior)的警告</li><li>SyntaxWarning:可疑语法的警告</li><li>ImportWarning:用于在导入模块过程中触发的警告</li><li>UnicodeWarning:与Unicode相关的警告</li><li>BytesWarning:与字节或字节码相关的警告</li><li>ResourceWarning:与资源使用相关的警告</li></ul><hr><h2 id="3-try-except-语句"><a href="#3-try-except-语句" class="headerlink" title="3. try - except 语句"></a>3. try - except 语句</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">try</span>:</span><br><span class="line"> 检测范围</span><br><span class="line"><span class="keyword">except</span> Exception[<span class="keyword">as</span> reason]:</span><br><span class="line"> 出现异常后的处理代码</span><br></pre></td></tr></table></figure><p>try 语句按照如下方式工作:</p><ul><li>首先,执行<code>try</code>子句(在关键字<code>try</code>和关键字<code>except</code>之间的语句)</li><li>如果没有异常发生,忽略<code>except</code>子句,<code>try</code>子句执行后结束。</li><li>如果在执行<code>try</code>子句的过程中发生了异常,那么<code>try</code>子句余下的部分将被忽略。如果异常的类型和<code>except</code>之后的名称相符,那么对应的<code>except</code>子句将被执行。最后执行<code>try - except</code>语句之后的代码。</li><li>如果一个异常没有与任何的<code>except</code>匹配,那么这个异常将会传递给上层的<code>try</code>中。</li></ul><p>【例子】</p><p>[2]:</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><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">try:</span><br><span class="line"> f = open('test.txt')</span><br><span class="line"> print(f.read())</span><br><span class="line"> f.close()</span><br><span class="line">except OSError:</span><br><span class="line"> print('打开文件出错')</span><br><span class="line"></span><br><span class="line"># 打开文件出错</span><br><span class="line">打开文件出错</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[3]:</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><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">try:</span><br><span class="line"> f = open('test.txt')</span><br><span class="line"> print(f.read())</span><br><span class="line"> f.close()</span><br><span class="line">except OSError as error:</span><br><span class="line"> print('打开文件出错\n原因是:' + str(error))</span><br><span class="line"></span><br><span class="line"># 打开文件出错</span><br><span class="line"># 原因是:[Errno 2] No such file or directory: 'test.txt'</span><br><span class="line">打开文件出错</span><br><span class="line">原因是:[Errno 2] No such file or directory: 'test.txt'</span><br></pre></td></tr></table></figure><p>一个<code>try</code>语句可能包含多个<code>except</code>子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。</p><p>【例子】</p><p>[4]:</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><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">try:</span><br><span class="line"> int("abc")</span><br><span class="line"> s = 1 + '1'</span><br><span class="line"> f = open('test.txt')</span><br><span class="line"> print(f.read())</span><br><span class="line"> f.close()</span><br><span class="line">except OSError as error:</span><br><span class="line"> print('打开文件出错\n原因是:' + str(error))</span><br><span class="line">except TypeError as error:</span><br><span class="line"> print('类型出错\n原因是:' + str(error))</span><br><span class="line">except ValueError as error:</span><br><span class="line"> print('数值出错\n原因是:' + str(error))</span><br><span class="line"></span><br><span class="line"># 数值出错</span><br><span class="line"># 原因是:invalid literal for int() with base 10: 'abc'</span><br><span class="line">数值出错</span><br><span class="line">原因是:invalid literal for int() with base 10: 'abc'</span><br></pre></td></tr></table></figure><p>【例子】</p><p>[5]:</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><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">dict1 = {'a': 1, 'b': 2, 'v': 22}</span><br><span class="line">try:</span><br><span class="line"> x = dict1['y']</span><br><span class="line">except LookupError:</span><br><span class="line"> print('查询错误')</span><br><span class="line">except KeyError:</span><br><span class="line"> print('键错误')</span><br><span class="line">else:</span><br><span class="line"> print(x)</span><br><span class="line"></span><br><span class="line"># 查询错误</span><br><span class="line">查询错误</span><br></pre></td></tr></table></figure><p><code>try-except-else</code>语句尝试查询不在<code>dict</code>中的键值对,从而引发了异常。这一异常准确地说应属于<code>KeyError</code>,但由于<code>KeyError</code>是<code>LookupError</code>的子类,且将<code>LookupError</code>置于<code>KeyError</code>之前,因此程序优先执行该<code>except</code>代码块。所以,使用多个<code>except</code>代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。</p><p>【例子】</p><p>[6]:</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><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">dict1 = {'a': 1, 'b': 2, 'v': 22}</span><br><span class="line">try:</span><br><span class="line"> x = dict1['y']</span><br><span class="line">except KeyError:</span><br><span class="line"> print('键错误')</span><br><span class="line">except LookupError:</span><br><span class="line"> print('查询错误')</span><br><span class="line">else:</span><br><span class="line"> print(x)</span><br><span class="line"></span><br><span class="line"># 键错误</span><br><span class="line">键错误</span><br></pre></td></tr></table></figure><p>【例子】一个 <code>except</code> 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。</p><p>[7]:</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><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">try:</span><br><span class="line"> s = 1 + '1'</span><br><span class="line"> int("abc")</span><br><span class="line"> f = open('test.txt')</span><br><span class="line"> print(f.read())</span><br><span class="line"> f.close()</span><br><span class="line">except (OSError, TypeError, ValueError) as error:</span><br><span class="line"> print('出错了!\n原因是:' + str(error))</span><br><span class="line"></span><br><span class="line"># 出错了!</span><br><span class="line"># 原因是:unsupported operand type(s) for +: 'int' and 'str'</span><br><span class="line">出错了!</span><br><span class="line">原因是:unsupported operand type(s) for +: 'int' and 'str'</span><br></pre></td></tr></table></figure><hr><h2 id="4-try-except-finally-语句"><a href="#4-try-except-finally-语句" class="headerlink" title="4. try - except - finally 语句"></a>4. try - except - finally 语句</h2><p>try: 检测范围 except Exception[as reason]: 出现异常后的处理代码 finally: 无论如何都会被执行的代码</p><p>不管<code>try</code>子句里面有没有发生异常,<code>finally</code>子句都会执行。</p><p>【例子】如果一个异常在<code>try</code>子句里被抛出,而又没有任何的<code>except</code>把它截住,那么这个异常会在<code>finally</code>子句执行后被抛出。</p><p>[10]:</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><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">def divide(x, y):</span><br><span class="line"> try:</span><br><span class="line"> result = x / y</span><br><span class="line"> print("result is", result)</span><br><span class="line"> except ZeroDivisionError:</span><br><span class="line"> print("division by zero!")</span><br><span class="line"> finally:</span><br><span class="line"> print("executing finally clause")</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">divide(2, 1)</span><br><span class="line"># result is 2.0</span><br><span class="line"># executing finally clause</span><br><span class="line">divide(2, 0)</span><br><span class="line"># division by zero!</span><br><span class="line"># executing finally clause</span><br><span class="line">divide("2", "1")</span><br><span class="line"># executing finally clause</span><br><span class="line"># TypeError: unsupported operand type(s) for /: 'str' and 'str'</span><br><span class="line">result is 2.0</span><br><span class="line">executing finally clause</span><br><span class="line">division by zero!</span><br><span class="line">executing finally clause</span><br></pre></td></tr></table></figure><hr><h2 id="5-try-except-else-语句"><a href="#5-try-except-else-语句" class="headerlink" title="5. try - except - else 语句"></a>5. try - except - else 语句</h2><p>如果在<code>try</code>子句执行时没有发生异常,Python将执行<code>else</code>语句后的语句。</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">try</span>:</span><br><span class="line"> 检测范围</span><br><span class="line"><span class="keyword">except</span>:</span><br><span class="line"> 出现异常后的处理代码</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line"> 如果没有异常执行这块代码</span><br></pre></td></tr></table></figure><p>使用<code>except</code>而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。</p><p>try: 检测范围 except(Exception1[, Exception2[,…ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 else: 如果没有异常执行这块代码</p><p>【例子】</p><p>[12]:</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><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">try:</span><br><span class="line"> fh = open("testfile.txt", "w")</span><br><span class="line"> fh.write("这是一个测试文件,用于测试异常!!")</span><br><span class="line">except IOError:</span><br><span class="line"> print("Error: 没有找到文件或读取文件失败")</span><br><span class="line">else:</span><br><span class="line"> print("内容写入文件成功")</span><br><span class="line"> fh.close()</span><br><span class="line"></span><br><span class="line"># 内容写入文件成功</span><br><span class="line">内容写入文件成功</span><br></pre></td></tr></table></figure><p>注意:<code>else</code>语句的存在必须以<code>except</code>语句的存在为前提,在没有<code>except</code>语句的<code>try</code>语句中使用<code>else</code>语句,会引发语法错误。</p><hr><h2 id="6-raise语句"><a href="#6-raise语句" class="headerlink" title="6. raise语句"></a>6. raise语句</h2><p>Python 使用<code>raise</code>语句抛出一个指定的异常。</p><p>【例子】</p><p>[13]:</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><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">try:</span><br><span class="line"> raise NameError('HiThere')</span><br><span class="line">except NameError:</span><br><span class="line"> print('An exception flew by!')</span><br><span class="line"> </span><br><span class="line"># An exception flew by!</span><br><span class="line">An exception flew by!</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h1 id="Python入门-上"><a href="#Python入门-上" class="headerlink" title="Python入门(上)"></a>Python入门(上)</h1><p>[TOC]</p>
<h1 id="简介"><a href="#简介" </summary>
<category term="python基础" scheme="https://wicherqaq.github.io/categories/python%E5%9F%BA%E7%A1%80/"/>
</entry>
<entry>
<title>运算符优先级</title>
<link href="https://wicherqaq.github.io/2020/09/09/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/"/>
<id>https://wicherqaq.github.io/2020/09/09/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/</id>
<published>2020-09-09T07:55:29.000Z</published>
<updated>2020-09-09T08:20:05.843Z</updated>
<content type="html"><![CDATA[<table><thead><tr><th><strong>优先级</strong></th><th><strong>运算符</strong></th><th><strong>名称或含义</strong></th><th><strong>使用形式</strong></th><th><strong>结合方向</strong></th><th><strong>说明</strong></th></tr></thead><tbody><tr><td><strong>1</strong></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td></td><td><strong>[]</strong></td><td>数组下标</td><td>数组名[常量表达式]</td><td>左到右</td><td>–</td></tr><tr><td><strong>()</strong></td><td>圆括号</td><td>(表达式)/函数名(形参表)</td><td>–</td><td></td><td></td></tr><tr><td><strong>.</strong></td><td>成员选择(对象)</td><td>对象.成员名</td><td>–</td><td></td><td></td></tr><tr><td><strong>-></strong></td><td>成员选择(指针)</td><td>对象指针->成员名</td><td>–</td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td><strong>2</strong></td><td><strong>-</strong></td><td>负号运算符</td><td>-表达式</td><td><strong>右到左</strong></td><td>单目运算符</td></tr><tr><td><strong>~</strong></td><td>按位取反运算符</td><td>~表达式</td><td></td><td></td><td></td></tr><tr><td><strong>++</strong></td><td>自增运算符</td><td>++变量名/变量名++</td><td></td><td></td><td></td></tr><tr><td><strong>–</strong></td><td>自减运算符</td><td>–变量名/变量名–</td><td></td><td></td><td></td></tr><tr><td>*****</td><td>取值运算符</td><td>*指针变量</td><td></td><td></td><td></td></tr><tr><td><strong>&</strong></td><td>取地址运算符</td><td>&变量名</td><td></td><td></td><td></td></tr><tr><td><strong>!</strong></td><td>逻辑非运算符</td><td>!表达式</td><td></td><td></td><td></td></tr><tr><td><strong>类型</strong></td><td>强制类型转换</td><td>(数据类型)表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong>sizeof</strong></td><td>长度运算符</td><td>sizeof(表达式)</td><td>–</td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td><strong>3</strong></td><td><strong>/</strong></td><td>除</td><td>表达式/表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td>*****</td><td>乘</td><td>表达式*表达式</td><td></td><td></td><td></td></tr><tr><td><strong>%</strong></td><td>余数(取模)</td><td>整型表达式%整型表达式</td><td></td><td></td><td></td></tr><tr><td><strong>4</strong></td><td><strong><em>\</em>+**</strong></td><td>加</td><td>表达式+表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td><strong>-</strong></td><td>减</td><td>表达式-表达式</td><td></td><td></td><td></td></tr><tr><td><strong>5</strong></td><td><strong><em>\</em><<**</strong></td><td>左移</td><td>变量<<表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td><strong>>></strong></td><td>右移</td><td>变量>>表达式</td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td><strong>6</strong></td><td><strong><em>\</em>>**</strong></td><td>大于</td><td>表达式>表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td><strong>>=</strong></td><td>大于等于</td><td>表达式>=表达式</td><td></td><td></td><td></td></tr><tr><td><strong><</strong></td><td>小于</td><td>表达式<表达式</td><td></td><td></td><td></td></tr><tr><td><strong><=</strong></td><td>小于等于</td><td>表达式<=表达式</td><td></td><td></td><td></td></tr><tr><td><strong>7</strong></td><td><strong>==</strong></td><td>等于</td><td>表达式==表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td><strong>!=</strong></td><td>不等于</td><td>表达式!= 表达式</td><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td><strong>8</strong></td><td><strong><em>\</em>&**</strong></td><td>按位与</td><td>表达式&表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td><strong>9</strong></td><td><strong><em>\</em>^**</strong></td><td>按位异或</td><td>表达式^表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td><strong>10</strong></td><td><strong><em>\</em>|**</strong></td><td>按位或</td><td>表达式|表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td><strong>11</strong></td><td><strong><em>\</em>&&**</strong></td><td>逻辑与</td><td>表达式&&表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td><strong>12</strong></td><td><strong><em>\</em>||**</strong></td><td>逻辑或</td><td>表达式||表达式</td><td>左到右</td><td>双目运算符</td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td><strong>13</strong></td><td><strong><em>\</em>?:**</strong></td><td>条件运算符</td><td>表达式1?表达式2: 表达式3</td><td><strong><em>\</em>右到左**</strong></td><td>三目运算符</td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td><strong>14</strong></td><td><strong><em>\</em>=**</strong></td><td>赋值运算符</td><td>变量=表达式</td><td><strong><em>\</em>右到左**</strong></td><td>–</td></tr><tr><td><strong>/=</strong></td><td>除后赋值</td><td>变量/=表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong>*=</strong></td><td>乘后赋值</td><td>变量*=表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong>%=</strong></td><td>取模后赋值</td><td>变量%=表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong>+=</strong></td><td>加后赋值</td><td>变量+=表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong>-=</strong></td><td>减后赋值</td><td>变量-=表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong><<=</strong></td><td>左移后赋值</td><td>变量<<=表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong>>>=</strong></td><td>右移后赋值</td><td>变量>>=表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong>&=</strong></td><td>按位与后赋值</td><td>变量&=表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong>^=</strong></td><td>按位异或后赋值</td><td>变量^=表达式</td><td>–</td><td></td><td></td></tr><tr><td><strong>|=</strong></td><td>按位或后赋值</td><td>变量|=表达式</td><td>–</td><td></td><td></td></tr><tr><td></td><td></td><td></td><td></td><td></td><td></td></tr><tr><td><strong>15</strong></td><td><strong>,</strong></td><td>逗号运算符</td><td>表达式,表达式,…</td><td>左到右</td><td>–</td></tr></tbody></table><h4 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h4><ul><li>同一优先级的运算符,运算次序由结合方向所决定。</li><li>简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符</li></ul>]]></content>
<summary type="html"><table>
<thead>
<tr>
<th><strong>优先级</strong></th>
<th><strong>运算符</strong></th>
<th><strong>名称或含义</strong></th>
<th><strong>使用形式</strong></</summary>
</entry>
<entry>
<title>Hexo博客迁移</title>
<link href="https://wicherqaq.github.io/2020/09/03/Hexo%E5%8D%9A%E5%AE%A2%E8%BF%81%E7%A7%BB/"/>
<id>https://wicherqaq.github.io/2020/09/03/Hexo%E5%8D%9A%E5%AE%A2%E8%BF%81%E7%A7%BB/</id>
<published>2020-09-03T06:12:56.000Z</published>
<updated>2020-09-03T06:13:32.000Z</updated>
<content type="html"><![CDATA[<h4 id="环境安装"><a href="#环境安装" class="headerlink" title="环境安装"></a>环境安装</h4><ul><li>安装node.js</li><li>安装cmpn镜像源 <code>npm install -g cnpm --registery=https://registry.npm.taobao.org</code></li><li>安装hexo框架 <code>cnpm install -g hexo-cli</code>,并且利用<code>hexo -v</code>来验证</li></ul><h4 id="拷贝原始数据"><a href="#拷贝原始数据" class="headerlink" title="拷贝原始数据"></a>拷贝原始数据</h4><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></pre></td><td class="code"><pre><span class="line"># 以下是需要拷贝的文件和目录</span><br><span class="line">_config.yml</span><br><span class="line">package.json</span><br><span class="line">scaffolds</span><br><span class="line">source</span><br><span class="line">themes</span><br></pre></td></tr></table></figure><h4 id="安装依赖模块"><a href="#安装依赖模块" class="headerlink" title="安装依赖模块"></a>安装依赖模块</h4><p>执行下面的命令之前,需要把以上拷贝的文件复制到新电脑的博客文件夹下,如<code>/blog</code>下</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">npm install</span><br><span class="line">npm install hexo-deployer-git --save</span><br><span class="line">npm install hexo-generator-feed --save</span><br><span class="line">npm install hexo-generator-sitemap --save</span><br></pre></td></tr></table></figure><h4 id="构建、运行、发布"><a href="#构建、运行、发布" class="headerlink" title="构建、运行、发布"></a>构建、运行、发布</h4><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></pre></td><td class="code"><pre><span class="line">hexo g</span><br><span class="line">hexo s</span><br><span class="line">hexo d# 要求填写github或其他发布平台的账号密码</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h4 id="环境安装"><a href="#环境安装" class="headerlink" title="环境安装"></a>环境安装</h4><ul>
<li>安装node.js</li>
<li>安装cmpn镜像源 <code>npm install -g cnpm -</summary>
<category term="Hexo" scheme="https://wicherqaq.github.io/tags/Hexo/"/>
</entry>
<entry>
<title>Linux的Shell编程</title>
<link href="https://wicherqaq.github.io/2020/09/03/Linux%E7%9A%84Shell%E7%BC%96%E7%A8%8B/"/>
<id>https://wicherqaq.github.io/2020/09/03/Linux%E7%9A%84Shell%E7%BC%96%E7%A8%8B/</id>
<published>2020-09-03T05:21:22.000Z</published>
<updated>2020-09-03T06:08:38.000Z</updated>
<content type="html"><![CDATA[<h4 id="Linux的Shell编程"><a href="#Linux的Shell编程" class="headerlink" title="Linux的Shell编程"></a>Linux的Shell编程</h4><p> Shell 编程一般指 shell 脚本编程。</p><h5 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h5><p>使用 vi 编辑器新建一个文件 hello.sh </p><figure class="highlight shell"><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="meta">#</span><span class="bash">!/bin/bash </span></span><br><span class="line">echo "Hello World !"</span><br></pre></td></tr></table></figure><h5 id="执行"><a href="#执行" class="headerlink" title="执行"></a>执行</h5><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></pre></td><td class="code"><pre><span class="line"># 方式1</span><br><span class="line">sh hello.sh</span><br><span class="line"></span><br><span class="line"># 方式2</span><br><span class="line">chmod +x ./hello.sh #使脚本具有执行权限</span><br><span class="line">./hello.sh #执行脚本</span><br></pre></td></tr></table></figure><h4 id="变量"><a href="#变量" class="headerlink" title="变量"></a>变量</h4><h5 id="局部变量"><a href="#局部变量" class="headerlink" title="局部变量"></a>局部变量</h5><figure class="highlight shell"><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="meta">#</span><span class="bash">!/bin/bash</span></span><br><span class="line">str="hello"</span><br><span class="line">echo ${str}world</span><br></pre></td></tr></table></figure><h5 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h5><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">echo $PATH</span><br><span class="line">echo $HOME</span><br></pre></td></tr></table></figure><h4 id="特殊字符"><a href="#特殊字符" class="headerlink" title="特殊字符"></a>特殊字符</h4><table><thead><tr><th>$#</th><th>传递到脚本的参数个数</th></tr></thead><tbody><tr><td>$*</td><td>以一个单字符串显示所有向脚本传递的参数。</td></tr><tr><td>$$</td><td>脚本运行的当前进程 ID 号</td></tr><tr><td>$!</td><td>后台运行的最后一个进程的 ID 号</td></tr><tr><td>$@</td><td>与$*相同,但是使用时加引号,并在引号中返回每个参数。</td></tr><tr><td>$?</td><td>显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。</td></tr></tbody></table><figure class="highlight shell"><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="meta">#</span><span class="bash">!/bin/bash</span></span><br><span class="line">echo "第一个参数为: $1";</span><br><span class="line">echo "参数个数为: $#";</span><br><span class="line">echo "传递的参数作为一个字符串显示: $*";</span><br></pre></td></tr></table></figure><p>执行: ./test.sh 1 2 3 </p><h4 id="运算符"><a href="#运算符" class="headerlink" title="运算符"></a>运算符</h4> <figure class="highlight shell"><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="meta">#</span><span class="bash">!/bin/bash</span></span><br><span class="line">a=1;</span><br><span class="line">b=2;</span><br><span class="line">echo `expr $a + $b`;</span><br><span class="line">echo $((a+b));</span><br><span class="line">echo $[a+b];</span><br></pre></td></tr></table></figure><h4 id="if语句"><a href="#if语句" class="headerlink" title="if语句"></a>if语句</h4> <figure class="highlight shell"><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="bash">!/bin/bash</span></span><br><span class="line">read -p "please input your name:" NAME ## read命令用于从控制台读取输入数据</span><br><span class="line"><span class="meta">#</span><span class="bash"><span class="comment"># printf '%s\n' $NAME</span></span></span><br><span class="line">if [ $NAME = root ]</span><br><span class="line">then</span><br><span class="line">echo "hello ${NAME}, welcome !"</span><br><span class="line">elif [ $NAME = itcast ]</span><br><span class="line">then</span><br><span class="line">echo "hello ${NAME}, welcome !"</span><br><span class="line">else</span><br><span class="line">echo "Get out Please!"</span><br><span class="line">fi</span><br></pre></td></tr></table></figure><h4 id="for语句"><a href="#for语句" class="headerlink" title="for语句"></a>for语句</h4><p>方式1:</p><figure class="highlight shell"><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="meta">#</span><span class="bash">!/bin/bash</span></span><br><span class="line">for N in 1 2 3 </span><br><span class="line">do</span><br><span class="line"> echo $N</span><br><span class="line">done</span><br></pre></td></tr></table></figure><p>方式2:</p><figure class="highlight shell"><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="meta">#</span><span class="bash">!/bin/bash</span></span><br><span class="line">for ((i = 0; i <= 5; i++)) </span><br><span class="line"> do </span><br><span class="line"> echo "welcome $i times" </span><br><span class="line"> done</span><br></pre></td></tr></table></figure><h4 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h4><figure class="highlight shell"><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="bash">!/bin/bash</span></span><br><span class="line">funWithReturn(){</span><br><span class="line">echo "这个函数会对输入的两个数字进行相加运算..."</span><br><span class="line">echo "输入第一个数字: "</span><br><span class="line">read aNum</span><br><span class="line">echo "输入第二个数字: "</span><br><span class="line">read anotherNum</span><br><span class="line">echo "两个数字分别为 $aNum 和 $anotherNum !"</span><br><span class="line">return $(($aNum+$anotherNum))</span><br><span class="line">} </span><br><span class="line">funWithReturn</span><br><span class="line">echo "输入的两个数字之和为 $? !"</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h4 id="Linux的Shell编程"><a href="#Linux的Shell编程" class="headerlink" title="Linux的Shell编程"></a>Linux的Shell编程</h4><p> Shell 编程一般指 shell 脚本编程。</</summary>
<category term="Linux" scheme="https://wicherqaq.github.io/tags/Linux/"/>
</entry>
<entry>
<title>树莓派开机发送ip地址到邮箱</title>
<link href="https://wicherqaq.github.io/2020/08/27/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E5%8F%91%E9%80%81ip%E5%9C%B0%E5%9D%80%E5%88%B0%E9%82%AE%E7%AE%B1/"/>
<id>https://wicherqaq.github.io/2020/08/27/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%BC%80%E6%9C%BA%E5%8F%91%E9%80%81ip%E5%9C%B0%E5%9D%80%E5%88%B0%E9%82%AE%E7%AE%B1/</id>
<published>2020-08-27T01:27:59.000Z</published>
<updated>2020-08-27T01:55:40.000Z</updated>
<content type="html"><![CDATA[<h4 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h4><p>一直以来,获取树莓派的IP一直都是一个让人头疼的问题。因为可能会面对不同的场景,某些场景下真的不能判断哪个ip是树莓派的。由于公司局域网内的机器比较多,我用<strong>IP Scanner</strong>软件扫描局域网内的机器,并不知道哪个IP是树莓派的,一个个试过去也不太现实,因此<strong>利用开机脚本发送邮箱</strong>成了一个不错的解决方案。</p><p>下面我来介绍一下如何才能实现这个功能</p><h4 id="第一步、编写python脚本"><a href="#第一步、编写python脚本" class="headerlink" title="第一步、编写python脚本"></a>第一步、编写python脚本</h4><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><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><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line">import socket</span><br><span class="line">import smtplib</span><br><span class="line">import time</span><br><span class="line">from email.mime.text import MIMEText</span><br><span class="line"></span><br><span class="line"># 校验当前计算机的网络是否可用,是否可以连外网</span><br><span class="line">def check_network():</span><br><span class="line"> while True:</span><br><span class="line"> try:</span><br><span class="line"> url = "www.baidu.com" </span><br><span class="line"> host = socket.gethostbyname(url)</span><br><span class="line"> socket.create_connection((host,80),2)</span><br><span class="line"> print("Network is Ready!")</span><br><span class="line"> break</span><br><span class="line"> except Exception as e:</span><br><span class="line"> print(e)</span><br><span class="line"> print("Network is not ready,Sleep 5s...")</span><br><span class="line"> time.sleep(5)</span><br><span class="line"> return True</span><br><span class="line"></span><br><span class="line"># 获取本机的IP地址</span><br><span class="line">def get_host_ip():</span><br><span class="line"> try:</span><br><span class="line"> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)</span><br><span class="line"> s.connect(('8.8.8.8', 80))</span><br><span class="line"> ip = s.getsockname()[0]</span><br><span class="line"> finally:</span><br><span class="line"> s.close()</span><br><span class="line"></span><br><span class="line"> return ip</span><br><span class="line"></span><br><span class="line"># 发送邮件</span><br><span class="line">def send_email():</span><br><span class="line"> from_addr = "your email address@mail.com"</span><br><span class="line"> password = "your password"</span><br><span class="line"> smtp_server = 'smtp.163.com'</span><br><span class="line"> to_addr = "receive address"</span><br><span class="line"> msg = MIMEText('Your raspberry IP addr is:'+get_host_ip())</span><br><span class="line"> msg["Subject"] = "raspberry IP addr notify"</span><br><span class="line"> msg['from'] = from_addr</span><br><span class="line"> msg['to'] = to_addr</span><br><span class="line"> try:</span><br><span class="line"> server = smtplib.SMTP(smtp_server)</span><br><span class="line"> server.login(from_addr, password)</span><br><span class="line"> server.sendmail(from_addr, [to_addr], msg.as_string())</span><br><span class="line"> server.quit()</span><br><span class="line"> print('success')</span><br><span class="line"> except Exception as e:</span><br><span class="line"> print('Faild:%s' % e)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> check_network()</span><br><span class="line"> send_email()</span><br></pre></td></tr></table></figure><h4 id="第二部、编写shell脚本"><a href="#第二部、编写shell脚本" class="headerlink" title="第二部、编写shell脚本"></a>第二部、编写shell脚本</h4><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></pre></td><td class="code"><pre><span class="line">// 以下操作都在/usr/local/src/raspberryIP下</span><br><span class="line">// 需要把上一步编写的python脚本放到该目录下</span><br><span class="line">cd /usr/local/src/raspberryIP</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></pre></td><td class="code"><pre><span class="line">// 创建一个*.sh可执行文件</span><br><span class="line">sudo vim clientStart.sh</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></pre></td><td class="code"><pre><span class="line">// 编写执行脚本</span><br><span class="line">cd /usr/local/src/raspberryIP</span><br><span class="line">sudo python raspberryIP.py</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></pre></td><td class="code"><pre><span class="line">// 保存后测试下是否可以执行</span><br><span class="line">./clientStart.sh</span><br></pre></td></tr></table></figure><h4 id="第三步、开机启动方法设置"><a href="#第三步、开机启动方法设置" class="headerlink" title="第三步、开机启动方法设置"></a>第三步、开机启动方法设置</h4><p>编辑/etc/rc.local文件,在rc.local文件里Exit 0 前加入</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">/usr/local/src/raspberryIP/clientStart.sh start</span><br></pre></td></tr></table></figure><p>至此,所有工作都已完成</p>]]></content>
<summary type="html"><h4 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h4><p>一直以来,获取树莓派的IP一直都是一个让人头疼的问题。因为可能会面对不同的场景,某些场景下真的不能判断哪个ip是树莓派的。由于公司局域网内的</summary>
<category term="树莓派" scheme="https://wicherqaq.github.io/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
</entry>
<entry>
<title>Idea中git的使用</title>
<link href="https://wicherqaq.github.io/2020/08/01/Idea%E4%B8%ADgit%E7%9A%84%E4%BD%BF%E7%94%A8/"/>
<id>https://wicherqaq.github.io/2020/08/01/Idea%E4%B8%ADgit%E7%9A%84%E4%BD%BF%E7%94%A8/</id>
<published>2020-08-01T10:39:07.000Z</published>
<updated>2020-08-01T10:41:38.000Z</updated>
<content type="html"><![CDATA[<p>工作中多人使用<a href="http://lib.csdn.net/base/git" target="_blank" rel="noopener">版本控制</a>软件协作开发,常见的应用场景归纳如下:</p><p>假设小组中有两个人,组长小张,组员小袁</p><p>场景一:小张创建项目并提交到远程<a href="http://lib.csdn.net/base/git" target="_blank" rel="noopener">Git</a>仓库</p><p>场景二:小袁从远程<a href="http://lib.csdn.net/base/git" target="_blank" rel="noopener">Git</a>仓库上获取项目源码</p><p>场景三:小袁修改了部分源码,提交到远程仓库</p><p>场景四:小张从远程仓库获取小袁的提交</p><p>场景五:小袁接受了一个新功能的任务,创建了一个分支并在分支上开发</p><p>场景六:小袁把分支提交到远程Git仓库</p><p>场景七:小张获取小袁提交的分支</p><p>场景八:小张把分支合并到主干</p><h3 id="场景一:小张创建项目并提交到远程Git仓库"><a href="#场景一:小张创建项目并提交到远程Git仓库" class="headerlink" title="场景一:小张创建项目并提交到远程Git仓库"></a>场景一:小张创建项目并提交到远程Git仓库</h3><p>创建好项目,选择VCS - > Import into Version Control -> Create Git Repository</p><p><img src="http://img.blog.csdn.net/20160912161234797" alt="img"></p><p>接下来指定本地仓库的位置,按个人习惯指定即可,例如这里选择了项目源代码同目录</p><p><img src="http://img.blog.csdn.net/20160912161334752" alt="img"></p><p>点击OK后创建完成本地仓库,注意,这里仅仅是本地的。下面把项目源码添加到本地仓库。</p><p>下图是Git与提交有关的三个命令对应的操作,Add命令是把文件从IDE的工作目录添加到本地仓库的stage区,Commit命令把stage区的暂存文件提交到当前分支的仓库,并清空stage区。Push命令把本地仓库的提交同步到远程仓库。</p><p><img src="http://img.blog.csdn.net/20160912164147415" alt="img"></p><p>IDEA中对操作做了一定的简化,Commit和Push可以在一步中完成。</p><p>具体操作,在项目上点击右键,选择Git菜单</p><p><img src="http://img.blog.csdn.net/20160912165901032" alt="img"></p><p><img src="http://img.blog.csdn.net/20160912165911954" alt="img"></p><p><img src="http://img.blog.csdn.net/20160912165921938" alt="img"></p><p>因为是第一次提交,Push前需要指定远程仓库的地址。如下图,点击Define remote后,在弹出的窗口中输入远程仓库地址。</p><p><img src="http://img.blog.csdn.net/20160912165942829" alt="img"></p><h3 id="场景二:小袁从远程Git仓库上获取项目源码"><a href="#场景二:小袁从远程Git仓库上获取项目源码" class="headerlink" title="场景二:小袁从远程Git仓库上获取项目源码"></a>场景二:小袁从远程Git仓库上获取项目源码</h3><p>即克隆项目,操作如下:</p><p><img src="http://img.blog.csdn.net/20160912170148207" alt="img"></p><p>输入小张Push时填写的远程仓库地址</p><p><img src="http://img.blog.csdn.net/20160912170214880" alt="img"></p><p>接下来按向导操作,即可把项目从远程仓库克隆到本地仓库和IDE工作区。</p><h3 id="场景三:小袁修改了部分源码,提交到远程仓库"><a href="#场景三:小袁修改了部分源码,提交到远程仓库" class="headerlink" title="场景三:小袁修改了部分源码,提交到远程仓库"></a>场景三:小袁修改了部分源码,提交到远程仓库</h3><p>这个操作和首次提交的流程基本一致,分别是 Add -> Commit -> Push。请参考场景一</p><h3 id="场景四:小张从远程仓库获取小袁的提交"><a href="#场景四:小张从远程仓库获取小袁的提交" class="headerlink" title="场景四:小张从远程仓库获取小袁的提交"></a>场景四:小张从远程仓库获取小袁的提交</h3><p>获取更新有两个命令:Fetch和Pull,Fetch是从远程仓库下载文件到本地的origin/master,然后可以手动对比修改决定是否合并到本地的master库。Pull则是直接下载并合并。如果各成员在工作中都执行修改前先更新的规范,则可以直接使用Pull方式以简化操作。</p><p><img src="http://img.blog.csdn.net/20160912170628933" alt="img"></p><h3 id="场景五:小袁接受了一个新功能的任务,创建了一个分支并在分支上开发"><a href="#场景五:小袁接受了一个新功能的任务,创建了一个分支并在分支上开发" class="headerlink" title="场景五:小袁接受了一个新功能的任务,创建了一个分支并在分支上开发"></a>场景五:小袁接受了一个新功能的任务,创建了一个分支并在分支上开发</h3><p>建分支也是一个常用的操作,例如临时修改bug、开发不确定是否加入的功能等,都可以创建一个分支,再等待合适的时机合并到主干。</p><p>创建流程如下:</p><p><img src="http://img.blog.csdn.net/20160912171844429" alt="img"></p><p>选择New Branch并输入一个分支的名称</p><p><img src="http://img.blog.csdn.net/20160912171858663" alt="img"></p><p>创建完成后注意IDEA的右下角,如下图,Git: wangpangzi_branch表示已经自动切换到wangpangzi_branch分支,当前工作在这个分支上。</p><p>点击后弹出一个小窗口,在Local Branches中有其他可用的本地分支选项,点击后选择Checkout即可切换当前工作的分支(见场景7操作切换其他分支)。</p><p><img src="http://img.blog.csdn.net/20160912173123122" alt="img"></p><p>如下图,点击Checkout</p><p><img src="http://img.blog.csdn.net/20160912173307202" alt="img"></p><p>注意,这里创建的分支仅仅在本地仓库,如果想让组长小张获取到这个分支,还需要提交到远程仓库。</p><h3 id="场景六:小袁把分支提交到远程Git仓库"><a href="#场景六:小袁把分支提交到远程Git仓库" class="headerlink" title="场景六:小袁把分支提交到远程Git仓库"></a>场景六:小袁把分支提交到远程Git仓库</h3><p>切换到新建的分支,使用Push功能</p><p><img src="http://img.blog.csdn.net/20160912173718844" alt="img"></p><p><img src="http://img.blog.csdn.net/20160912174243815" alt="img"></p><h3 id="场景七:小张获取小袁提交的分支"><a href="#场景七:小张获取小袁提交的分支" class="headerlink" title="场景七:小张获取小袁提交的分支"></a>场景七:小张获取小袁提交的分支</h3><p>使用Pull功能打开更新窗口,点击Remote栏后面的刷新按钮,会在Branches to merge栏中刷新出新的分支。这里并不想做合并,所以不要选中任何分支,直接点击Pull按钮完成操作。</p><p><img src="http://img.blog.csdn.net/20160912174329143" alt="img"></p><p>更新后,再点击右下角,可以看到在Remote Branches区已经有了新的分支,点击后在弹出的子菜单中选择Checkout as new local branch,在本地仓库中创建该分支。完成后在Local Branches区也会出现该分支的选项,可以按上面的方法,点击后选择Checkout切换。</p><p><img src="http://img.blog.csdn.net/20160912174729488" alt="img"></p><h3 id="场景八:小张把分支合并到主干"><a href="#场景八:小张把分支合并到主干" class="headerlink" title="场景八:小张把分支合并到主干"></a>场景八:小张把分支合并到主干</h3><p>新功能开发完成,体验很好,项目组决定把该功能合并到主干上。</p><p>切换到master分支,选择Merge Changes</p><p><img src="http://img.blog.csdn.net/20160912175201306" alt="img"></p><p>选择要合并的分支,点击Merge完成</p><p><img src="http://img.blog.csdn.net/20160912175359903" alt="img"></p>]]></content>
<summary type="html"><p>工作中多人使用<a href="http://lib.csdn.net/base/git" target="_blank" rel="noopener">版本控制</a>软件协作开发,常见的应用场景归纳如下:</p>
<p>假设小组中有两个人,组长小张,组员小袁</p>
<</summary>
<category term="开发工具" scheme="https://wicherqaq.github.io/tags/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>redis缓存穿透、缓存击穿、缓存雪崩</title>
<link href="https://wicherqaq.github.io/2020/06/01/redis%E7%BC%93%E5%AD%98%E7%A9%BF%E9%80%8F%E3%80%81%E7%BC%93%E5%AD%98%E5%87%BB%E7%A9%BF%E3%80%81%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9/"/>
<id>https://wicherqaq.github.io/2020/06/01/redis%E7%BC%93%E5%AD%98%E7%A9%BF%E9%80%8F%E3%80%81%E7%BC%93%E5%AD%98%E5%87%BB%E7%A9%BF%E3%80%81%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9/</id>
<published>2020-06-01T02:09:36.000Z</published>
<updated>2020-06-01T02:28:52.000Z</updated>
<content type="html"><![CDATA[<h3 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h3><p>随着互联网系统发展的逐步完善,提高系统的QPS(每秒查询率),目前的绝大部分系统都增加了<a href="http://mp.weixin.qq.com/s?__biz=MzU5NTAzNjM0Mw==&mid=2247484731&idx=2&sn=932f690ee1b775e864d3e113739a421a&chksm=fe7954e3c90eddf5d2f7de72909a43b5151797df7212b10311c497c3d1708d9a0613279f5734&scene=21#wechat_redirect" target="_blank" rel="noopener">缓存机制</a>从而避免请求过多的直接与数据库操作从而造成系统瓶颈,极大的提升了用户体验和系统稳定性。但同时,一个缓存机制的设计如果不是很好,就可能带来一些问题:<strong>缓存穿透、缓存击穿与缓存雪崩效应</strong>。这些问题的出现本质上都是在一定的条件下导致的数据库DB的访问量过高导致的系统QPS较低的问题。</p><p>前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。常见的缓存机制如下图:</p><img src="/2020/06/01/redis%E7%BC%93%E5%AD%98%E7%A9%BF%E9%80%8F%E3%80%81%E7%BC%93%E5%AD%98%E5%87%BB%E7%A9%BF%E3%80%81%E7%BC%93%E5%AD%98%E9%9B%AA%E5%B4%A9/缓存机制.png" style="zoom:60%;"><h3 id="缓存问题"><a href="#缓存问题" class="headerlink" title="缓存问题"></a>缓存问题</h3><h4 id="缓存穿透"><a href="#缓存穿透" class="headerlink" title="缓存穿透"></a>缓存穿透</h4><h5 id="描述"><a href="#描述" class="headerlink" title="描述"></a>描述</h5><p>缓存穿透是指<strong>缓存和数据库中都没有的数据</strong>,而用户不断发起请求。由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。</p><p>在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。</p><p>如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。</p><h5 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h5><ol><li><strong>接口层增加校验</strong>,如用户鉴权校验,id做基础校验,id<=0的直接拦截;</li><li>从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为<strong>key-null</strong>,<strong>缓存有效时间可以设置短点</strong>,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击</li></ol><h4 id="缓存击穿"><a href="#缓存击穿" class="headerlink" title="缓存击穿"></a>缓存击穿</h4><h5 id="描述-1"><a href="#描述-1" class="headerlink" title="描述"></a>描述</h5><p><strong>缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期)</strong>,这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。</p><h5 id="解决方案-1"><a href="#解决方案-1" class="headerlink" title="解决方案"></a>解决方案</h5><ol><li>设置热点数据永远不过期。</li><li>接口限流与熔断,降级。重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准备,当接口中的某些 服务 不可用时候,进行熔断,失败快速返回机制。</li><li>布隆过滤器。bloomfilter就类似于一个hash set,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个key是否存在于某容器,不存在就直接返回。布隆过滤器的关键就在于hash算法和容器大小,</li></ol><h4 id="缓存雪崩"><a href="#缓存雪崩" class="headerlink" title="缓存雪崩"></a>缓存雪崩</h4><h5 id="描述-2"><a href="#描述-2" class="headerlink" title="描述"></a>描述</h5><p>缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是, 缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。</p><h5 id="解决方案-2"><a href="#解决方案-2" class="headerlink" title="解决方案"></a>解决方案</h5><ol><li>缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。</li><li>如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。</li><li>设置热点数据永远不过期。</li></ol>]]></content>
<summary type="html"><h3 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h3><p>随着互联网系统发展的逐步完善,提高系统的QPS(每秒查询率),目前的绝大部分系统都增加了<a href="http://mp.weixin.</summary>
<category term="Java面试题" scheme="https://wicherqaq.github.io/categories/Java%E9%9D%A2%E8%AF%95%E9%A2%98/"/>
</entry>
<entry>
<title>wget命令</title>
<link href="https://wicherqaq.github.io/2020/05/30/wget%E5%91%BD%E4%BB%A4/"/>
<id>https://wicherqaq.github.io/2020/05/30/wget%E5%91%BD%E4%BB%A4/</id>
<published>2020-05-30T04:01:02.000Z</published>
<updated>2020-05-30T04:13:32.000Z</updated>
<content type="html"><![CDATA[<h3 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h3><p>wget命令用来从指定的URL下载文件。wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。</p><h3 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h3><ul><li><p><code>wget [选项] [参数]</code></p></li><li><p>参数</p><blockquote><table><thead><tr><th>选项</th><th>描述</th></tr></thead><tbody><tr><td>-a<日志文件></td><td>在指定的日志文件中记录资料的执行过程;</td></tr><tr><td>-A<后缀名></td><td>指定要下载文件的后缀名,多个后缀名之间使用逗号进行分隔;</td></tr><tr><td>-b</td><td>进行后台的方式运行wget;</td></tr><tr><td>-B<连接地址></td><td>设置参考的连接地址的基地地址;</td></tr><tr><td>-c</td><td>继续执行上次终端的任务;</td></tr><tr><td>-C<标志></td><td>设置服务器数据块功能标志on为激活,off为关闭,默认值为on;</td></tr><tr><td>-d</td><td>调试模式运行指令;</td></tr><tr><td>-D<域名列表></td><td>设置顺着的域名列表,域名之间用“,”分隔;</td></tr><tr><td>-e<指令></td><td>作为文件“.wgetrc”中的一部分执行指定的指令;</td></tr><tr><td>-h</td><td>显示指令帮助信息;</td></tr><tr><td>-i<文件></td><td>从指定文件获取要下载的URL地址;</td></tr><tr><td>-l<目录列表></td><td>设置顺着的目录列表,多个目录用“,”分隔;</td></tr><tr><td>-L</td><td>仅顺着关联的连接;</td></tr><tr><td>-r</td><td>递归下载方式;</td></tr><tr><td>-nc</td><td>文件存在时,下载文件不覆盖原有文件;</td></tr><tr><td>-nv</td><td>下载时只显示更新和出错信息,不显示指令的详细执行过程;</td></tr><tr><td>-q</td><td>不显示指令执行过程;</td></tr><tr><td>-nh</td><td>不查询主机名称;</td></tr><tr><td>-v</td><td>显示详细执行过程;</td></tr><tr><td>-V</td><td>显示版本信息;</td></tr><tr><td>–passive-ftp</td><td>使用被动模式PASV连接FTP服务器;</td></tr><tr><td>–follow-ftp</td><td>从HTML文件中下载FTP连接文件。</td></tr></tbody></table></blockquote></li></ul><h3 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h3><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><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">wget http://test.com/testfile.zip ->下载指定文件到当前文件夹</span><br><span class="line">wget -O wordpress.zip http://test.com/download ->指定保存名字</span><br><span class="line">wget --limit-rate=300k http://www.linuxde.net/testfile.zip ->限制下载速度</span><br><span class="line">wget -c http://www.linuxde.net/testfile.zip ->断点续传</span><br><span class="line">wget -b http://www.linuxde.net/testfile.zip ->后台下载</span><br><span class="line"></span><br><span class="line"># 设置使用指定浏览器下载(伪装下载)</span><br><span class="line">wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" http://www.linuxde.net/testfile.zip</span><br><span class="line"></span><br><span class="line">wget --spider url ->测试下载</span><br><span class="line">wget --tries=40 URL ->设置重试次数为40</span><br><span class="line">wget -i filelist.txt ->从filelist.txt获取下载地址</span><br><span class="line"></span><br><span class="line"># 镜像网站</span><br><span class="line"># --miror开户镜像下载。</span><br><span class="line"># -p下载所有为了html页面显示正常的文件。</span><br><span class="line"># --convert-links下载后,转换成本地的链接。</span><br><span class="line"># -P ./LOCAL保存所有文件和目录到本地指定目录</span><br><span class="line">wget --mirror -p --convert-links -P ./LOCAL URL</span><br><span class="line"></span><br><span class="line">wget --reject=gif ur ->下载一个网站,但你不希望下载图片,可以使用这条命令</span><br><span class="line">wget -o download.log URL ->把下载信息存入日志文件</span><br><span class="line">wget -Q5m -i filelist.txt ->限制总下载文件大小</span><br><span class="line">wget -r -A.pdf url ->下载指定格式文件</span><br><span class="line"></span><br><span class="line"># FTP下载</span><br><span class="line">wget ftp-url</span><br><span class="line">wget --ftp-user=USERNAME --ftp-password=PASSWORD url</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h3 id="概述"><a href="#概述" class="headerlink" title="概述"></a>概述</h3><p>wget命令用来从指定的URL下载文件。wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,w</summary>
<category term="Linux命令" scheme="https://wicherqaq.github.io/categories/Linux%E5%91%BD%E4%BB%A4/"/>
</entry>
</feed>