-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
1071 lines (912 loc) · 182 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>夜光糖果屋</title>
<link href="/atom.xml" rel="self"/>
<link href="http://blog.moeoj.net/"/>
<updated>2016-07-31T14:04:26.835Z</updated>
<id>http://blog.moeoj.net/</id>
<author>
<name>夜光</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>在Linux下运行Steam时,提示“加载steamui.so失败”的解决方法</title>
<link href="http://blog.moeoj.net/2016/07/31/%E5%9C%A8Linux%E4%B8%8B%E8%BF%90%E8%A1%8CSteam%E6%97%B6%EF%BC%8C%E6%8F%90%E7%A4%BA%E2%80%9C%E5%8A%A0%E8%BD%BDsteamui-so%E5%A4%B1%E8%B4%A5%E2%80%9D%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/"/>
<id>http://blog.moeoj.net/2016/07/31/在Linux下运行Steam时,提示“加载steamui-so失败”的解决方法/</id>
<published>2016-07-31T13:28:47.000Z</published>
<updated>2016-07-31T14:04:26.835Z</updated>
<content type="html"><p>昨天装好了Arch Linux,KDE装了,常用软件也装上了。然而最后装上的Fcitx输入法就跟核弹引爆程序一样,只要一打字就会发生爆炸。试着装上各种模块组件+改各种设置……无解。于是我就删掉了Arch改装Ubuntu。</p>
<p>装好Ubuntu之后顺手装上了核弹(NVIDIA显卡)驱动程序和Steam。安装过程非常顺利。装好之后,点一下Steam的图标,发现无法运行,提示“Fatal Error: Failed to load steamui.so”。</p>
<p><img src="/images/steam-ui/fatal-error.png" alt="Steam无法启动"></p>
<p>Σ(`д′*ノ)ノ </p>
<p>╮( ̄▽ ̄”)╭</p>
<p>看我如何解决它。</p>
<a id="more"></a>
<p>首先我需要看到更多的信息:</p>
<p><img src="/images/steam-ui/debug-mode.png" alt="启动DEBUG模式"></p>
<p>运行steam,观察输出:</p>
<p><img src="/images/steam-ui/trying-libgl.png" alt="错误信息"></p>
<p>后面输出的内容意思是:</p>
<p>steamui.so:libGL.so.1,你在哪里~?<br>steamui.so:啊这里没有<br>steamui.so:这里也没有<br>steamui.so:这里还是没有<br>steamui.so:没有libGL.so.1我要死啦!!!<br>steamui.so:啊死掉了<br>Steam:steamui.so你在干啥?<br>steamui.so:我死掉了,要libGL.so.1才能活过来<br>Steam:…… </p>
<p>所以我们要帮 <strong>steamui.so</strong> 找 <strong>libGL.so.1</strong> </p>
<p><img src="/images/steam-ui/find.png" alt="查找libGL"></p>
<p>找到了四个,两个32位,两个64位,两个是mesa的,两个是核弹的……</p>
<p>嗯,Steam是32位的。</p>
<p>我们来给 <strong>steamui.so</strong> 指引前进的道路:</p>
<p><img src="/images/steam-ui/test.png" alt="运行测试"></p>
<p>然后运行steam试试:</p>
<p><img src="/images/steam-ui/running.png" alt="成功运行Steam"></p>
<p>出现了!!!!</p>
<p>来试试游戏能不能玩:</p>
<p><img src="/images/steam-ui/low-fps.png" alt="FPS过低提示"></p>
<p>(明明都有60FPS好么!!!)</p>
<p>然后可以写一个启动脚本了,完整版是这样的:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="shebang">#!/bin/bash</span><br><span class="line"></span></span><br><span class="line"><span class="built_in">export</span> LD_LIBRARY_PATH=/usr/lib32:/usr/lib/i386-linux-gnu/mesa:<span class="variable">$LD_LIBRARY_PATH</span></span><br><span class="line">/usr/bin/steam $*</span><br></pre></td></tr></table></figure></p>
<p>用终端运行此Shell脚本,Steam正常启动。</p>
<p>最后再写一个.desktop文件就可以双击图标直接启动啦~</p>
</content>
<summary type="html">
<p>昨天装好了Arch Linux,KDE装了,常用软件也装上了。然而最后装上的Fcitx输入法就跟核弹引爆程序一样,只要一打字就会发生爆炸。试着装上各种模块组件+改各种设置……无解。于是我就删掉了Arch改装Ubuntu。</p>
<p>装好Ubuntu之后顺手装上了核弹(NVIDIA显卡)驱动程序和Steam。安装过程非常顺利。装好之后,点一下Steam的图标,发现无法运行,提示“Fatal Error: Failed to load steamui.so”。</p>
<p><img src="/images/steam-ui/fatal-error.png" alt="Steam无法启动"></p>
<p>Σ(`д′*ノ)ノ </p>
<p>╮( ̄▽ ̄”)╭</p>
<p>看我如何解决它。</p>
</summary>
<category term="爬坑教程" scheme="http://blog.moeoj.net/categories/%E7%88%AC%E5%9D%91%E6%95%99%E7%A8%8B/"/>
<category term="Linux" scheme="http://blog.moeoj.net/tags/Linux/"/>
<category term="Steam" scheme="http://blog.moeoj.net/tags/Steam/"/>
</entry>
<entry>
<title>设置apm镜像,解决Atom插件下载慢的问题</title>
<link href="http://blog.moeoj.net/2016/07/31/%E8%AE%BE%E7%BD%AEapm%E9%95%9C%E5%83%8F%EF%BC%8C%E8%A7%A3%E5%86%B3Atom%E6%8F%92%E4%BB%B6%E4%B8%8B%E8%BD%BD%E6%85%A2%E7%9A%84%E9%97%AE%E9%A2%98/"/>
<id>http://blog.moeoj.net/2016/07/31/设置apm镜像,解决Atom插件下载慢的问题/</id>
<published>2016-07-31T12:59:52.000Z</published>
<updated>2016-07-31T13:24:20.458Z</updated>
<content type="html"><p>由于某些原因,在国内安装Atom插件速度非常缓慢。实际上Atom使用的插件管理器apm和npm是一样的东西,可以通过指定npm镜像来加快Atom插件安装速度,提升Atom插件安装成功率。</p>
<p>然而我在网上搜了一下,发现没有相关的教程来教你如何设置apm镜像。于是,我决定写下本篇教程,为大家节省宝贵的时间。<br><a id="more"></a></p>
<h2 id="u8981_u600E_u4E48_u505A_u5462_uFF1F"><a href="#u8981_u600E_u4E48_u505A_u5462_uFF1F" class="headerlink" title="要怎么做呢?"></a>要怎么做呢?</h2><p>首先,Atom的配置文件保存在 <strong>用户目录/.atom</strong> 文件夹中。Windows中的用户目录默认为 <strong>C:\User\用户名</strong> ,Linux/Mac则为 <strong>/home/用户名</strong> 。在npm里,我们可以通过编辑 <strong>.npmrc</strong> 文件来配置npm。同样,我们也可以编辑 <strong>.apmrc</strong> 文件来配置apm。我们只需要一项配置:</p>
<blockquote>
<p>registry = <a href="https://registry.npm.taobao.org" target="_blank" rel="external">https://registry.npm.taobao.org</a> </p>
</blockquote>
<p>将这一行保存为 <strong>.apmrc</strong> 文件,放在 <strong>用户目录/.atom</strong> 目录中,我们就可以通过淘宝npm镜像来安装Atom插件了。为了获得加速效果,我们需要通过 <strong>apm install 插件名</strong> 这条命令来安装。当然,你可以用Python之类的语言编写一个插件批量安装脚本。</p>
<h2 id="u7528_u547D_u4EE4_u64CD_u4F5C_u66F4_u9AD8_u6548"><a href="#u7528_u547D_u4EE4_u64CD_u4F5C_u66F4_u9AD8_u6548" class="headerlink" title="用命令操作更高效"></a>用命令操作更高效</h2><p>只需要复制下面的命令到命令行/终端中执行,即可快速完成设置:</p>
<h3 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">'registry = https://registry.npm.taobao.org'</span> &gt; %UserProfile%\.atom\.apmrc</span><br></pre></td></tr></table></figure>
<h3 id="Linux/Mac_OS_X"><a href="#Linux/Mac_OS_X" class="headerlink" title="Linux/Mac OS X"></a>Linux/Mac OS X</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">'registry = https://registry.npm.taobao.org'</span> &gt; ~/.atom/.apmrc</span><br></pre></td></tr></table></figure>
<p>赶快试试看吧!</p>
</content>
<summary type="html">
<p>由于某些原因,在国内安装Atom插件速度非常缓慢。实际上Atom使用的插件管理器apm和npm是一样的东西,可以通过指定npm镜像来加快Atom插件安装速度,提升Atom插件安装成功率。</p>
<p>然而我在网上搜了一下,发现没有相关的教程来教你如何设置apm镜像。于是,我决定写下本篇教程,为大家节省宝贵的时间。<br>
</summary>
<category term="爬坑教程" scheme="http://blog.moeoj.net/categories/%E7%88%AC%E5%9D%91%E6%95%99%E7%A8%8B/"/>
<category term="Atom" scheme="http://blog.moeoj.net/tags/Atom/"/>
</entry>
<entry>
<title>超入门级的软件破解实例</title>
<link href="http://blog.moeoj.net/2016/06/30/%E8%B6%85%E5%85%A5%E9%97%A8%E7%BA%A7%E7%9A%84%E8%BD%AF%E4%BB%B6%E7%A0%B4%E8%A7%A3%E5%AE%9E%E4%BE%8B/"/>
<id>http://blog.moeoj.net/2016/06/30/超入门级的软件破解实例/</id>
<published>2016-06-30T08:42:17.000Z</published>
<updated>2016-06-30T10:35:47.271Z</updated>
<content type="html"><p> 最近得到了一个小玩意,一个游戏外挂(或者叫做辅助)。在Windows 10上运行两分钟左右系统就会蓝屏,基本无法使用。不过,倒是可以用它来写一篇教程。</p>
<p> 这是一个用易语言来开发的游戏外挂,它通过截获和发送网络封包来模拟客户端操作,实现外挂功能。当然,这篇文章要讲的内容和外挂本身的功能无关。这个外挂有一个令人反感的“功能”,每次启动的时候,都会检查收藏夹里是否存在某个网站的快捷方式,如果没有,将会往你的收藏夹里塞入一个URL快捷方式。</p>
<p> 不过我倒是认为,这个快捷方式和作者本人无关。因为名字看起来更像一个大而全的外挂开发交流论坛。为什么会这样呢?因为许多易语言外挂都使用了某些论坛提供的“易语言模块”,里面封装了内存读写、DLL注入、驱动安装卸载、抓包发包等外挂开发常用功能模块。其中有一些“易语言模块”会夹带私货,在背后悄悄地做一些不为人知的事情。受害者包括外挂开发者以外,还包括所有外挂使用者。</p>
<p> 本文将以一个实例来教你怎样从已经编译好的程序中,去除这些不需要的代码。<br><a id="more"></a></p>
<h2 id="u6478_u5E95"><a href="#u6478_u5E95" class="headerlink" title="摸底"></a>摸底</h2><p> 在对一个程序开刀之前,先对它做一个初步的了解。</p>
<p> 首先用PEiD查壳,结果为Visual C++ 6.0。对于外挂程序,这个结果说明十有八九是使用易语言开发的。而且应该没有加壳。</p>
<p> 随意找一个PE文件资源编辑器,打开它,如果找到类似这样的窗口资源,那就是易语言程序了。<br><img src="/images/crack/0.png" alt="易语言程序的特征"><br> 易语言编译出的程序里夹带的私货实在是太多啦!</p>
<p> 知道上述信息以后,我们就可以直接开始开工了。</p>
<h2 id="u8C03_u6559"><a href="#u8C03_u6559" class="headerlink" title="调教"></a>调教</h2><p> 360安全卫士拦截到的程序行为是这个样子的:<br><img src="/images/crack/1.png" alt="360拦截了修改收藏夹操作"></p>
<p> 我们可以从这个信息开始下手。我们可以肯定的是,这个程序做这件事情的时候,一定会创建文件。</p>
<p> 然后我们可以看看Windows API中有哪一个能创建文件。最常用的有两个:</p>
<blockquote>
<p>CreateFileA<br>CreateFileW</p>
</blockquote>
<p> 上面的是ASCII版本,下面的是Unicode版本。</p>
<p> 用Ollydbg载入目标,设置断点,然后运行试一试。<br><img src="/images/crack/2.png" alt="设置断点"></p>
<p> 运行之后程序在这个地方断了下来:<br><img src="/images/crack/3.png" alt="断点"></p>
<p> 我们可以看到右下角的参数列表正好是我们所希望的,不过目前位于内核模块中,我们要改的不是Windows系统DLL,所以我们需要跳到程序模块里去。</p>
<p> 点击OD工具栏上的“K”,查看调用堆栈。<br><img src="/images/crack/4.png" alt="调用堆栈"></p>
<p> 一直按Ctrl+F9,这样程序会不停地执行到return语句,直到看到主程序模块为止。<br><img src="/images/crack/5.png" alt="调用堆栈"><br><img src="/images/crack/6.png" alt="调用堆栈"></p>
<p> 这时候下一步就是主模块了,按F7,即可运行到主模块中。<br><img src="/images/crack/7.png" alt="主模块"></p>
<p> 我们可以看到函数返回以后,来到了00471D8C的位置。而上面正好有一个CALL,可以推测刚才那一长串调用堆栈都是从这个CALL开始的。</p>
<p> C++中的函数调用编译成x86汇编后,它长得像这样:</p>
<blockquote>
<p>push 存放最右边的参数的寄存器<br>push 存放中间的参数的寄存器<br>push 存放最左边的参数的寄存器<br>call 函数地址</p>
</blockquote>
<p> 将参数列表从右往左压入堆栈,然后CALL一下函数地址,即可完成一次函数调用。这中间可能会穿插mov指令,用来将参数送入寄存器中。</p>
<p> 完整的函数调用是这么一块:<br><img src="/images/crack/8.png" alt="完整的函数调用"></p>
<p> 全部用空指令填充:<br><img src="/images/crack/9.png" alt="空指令填充"><br><img src="/images/crack/10.png" alt="空指令填充完毕"></p>
<p> 然后就可以保存文件了:<br><img src="/images/crack/11.png" alt="空指令填充完毕"><br><img src="/images/crack/12.png" alt="空指令填充完毕"><br><img src="/images/crack/13.png" alt="空指令填充完毕"></p>
<p> 好了,检验装逼是否成功的时刻到了!</p>
<p> 运行了一下,程序已经不会再写收藏夹了,并且程序可以正常工作。这说明装逼非常成功。</p>
<p> 为了避免广告嫌疑,在这里就不放出程序运行截图了。如果有兴趣的话,可以通过联系我来获取原版程序和修改版程序。</p>
</content>
<summary type="html">
<p> 最近得到了一个小玩意,一个游戏外挂(或者叫做辅助)。在Windows 10上运行两分钟左右系统就会蓝屏,基本无法使用。不过,倒是可以用它来写一篇教程。</p>
<p> 这是一个用易语言来开发的游戏外挂,它通过截获和发送网络封包来模拟客户端操作,实现外挂功能。当然,这篇文章要讲的内容和外挂本身的功能无关。这个外挂有一个令人反感的“功能”,每次启动的时候,都会检查收藏夹里是否存在某个网站的快捷方式,如果没有,将会往你的收藏夹里塞入一个URL快捷方式。</p>
<p> 不过我倒是认为,这个快捷方式和作者本人无关。因为名字看起来更像一个大而全的外挂开发交流论坛。为什么会这样呢?因为许多易语言外挂都使用了某些论坛提供的“易语言模块”,里面封装了内存读写、DLL注入、驱动安装卸载、抓包发包等外挂开发常用功能模块。其中有一些“易语言模块”会夹带私货,在背后悄悄地做一些不为人知的事情。受害者包括外挂开发者以外,还包括所有外挂使用者。</p>
<p> 本文将以一个实例来教你怎样从已经编译好的程序中,去除这些不需要的代码。<br>
</summary>
<category term="逆向工程" scheme="http://blog.moeoj.net/categories/%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B/"/>
<category term="易语言" scheme="http://blog.moeoj.net/tags/%E6%98%93%E8%AF%AD%E8%A8%80/"/>
<category term="破解" scheme="http://blog.moeoj.net/tags/%E7%A0%B4%E8%A7%A3/"/>
</entry>
<entry>
<title>在Unity uGUI中使用转义字符的方法</title>
<link href="http://blog.moeoj.net/2016/04/12/%E5%9C%A8Unity-uGUI%E4%B8%AD%E4%BD%BF%E7%94%A8%E8%BD%AC%E4%B9%89%E5%AD%97%E7%AC%A6%E7%9A%84%E6%96%B9%E6%B3%95/"/>
<id>http://blog.moeoj.net/2016/04/12/在Unity-uGUI中使用转义字符的方法/</id>
<published>2016-04-12T02:10:10.000Z</published>
<updated>2016-04-12T02:27:00.339Z</updated>
<content type="html"><p>最近写了一个游戏,需要从后端获取排行榜数据,然后呈现在游戏界面上。<br>但是,在文本中使用转义字符并赋值给Unity uGUI的Text控件时,文本中的转义字符并不会转义。</p>
<p>尝试了\n,\r\n,System.Environment.NewLine,&lt;br&gt;,均不起作用。<br><a id="more"></a><br>如图所示:<br><img src="/images/unity/1.png" alt="无法转义的字符"><br>经过一番尝试,终于找到了解决方法。<br><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//这是错误的方式:</span></span><br><span class="line">rankText.GetComponent&lt;Text&gt; ().text = www.text;</span><br><span class="line"></span><br><span class="line"><span class="comment">//这是正确的方式:</span></span><br><span class="line">rankText.GetComponent&lt;Text&gt; ().text = System.Text.RegularExpressions.Regex.Unescape(www.text);</span><br></pre></td></tr></table></figure></p>
<p>这样就成功地解决了问题。<br><img src="/images/unity/2.png" alt="转义后的字符"><br><strong>Regex.Unescape</strong>方法可以转义输入的字符串中所有的转义字符。</p>
<p>参考:<br>MSDN:<a href="https://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.unescape.aspx" target="_blank" rel="external">Regex.Unescape 方法 (String)</a></p>
</content>
<summary type="html">
<p>最近写了一个游戏,需要从后端获取排行榜数据,然后呈现在游戏界面上。<br>但是,在文本中使用转义字符并赋值给Unity uGUI的Text控件时,文本中的转义字符并不会转义。</p>
<p>尝试了\n,\r\n,System.Environment.NewLine,&lt;br&gt;,均不起作用。<br>
</summary>
<category term="游戏开发" scheme="http://blog.moeoj.net/categories/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
<category term="C#" scheme="http://blog.moeoj.net/tags/C/"/>
<category term="Unity" scheme="http://blog.moeoj.net/tags/Unity/"/>
</entry>
<entry>
<title>在Linux中便捷地安装Node.js的方法</title>
<link href="http://blog.moeoj.net/2016/02/29/%E5%9C%A8Linux%E4%B8%AD%E4%BE%BF%E6%8D%B7%E5%9C%B0%E5%AE%89%E8%A3%85Node-js%E7%9A%84%E6%96%B9%E6%B3%95/"/>
<id>http://blog.moeoj.net/2016/02/29/在Linux中便捷地安装Node-js的方法/</id>
<published>2016-02-29T05:39:22.000Z</published>
<updated>2016-03-01T02:50:11.493Z</updated>
<content type="html"><h1 id="u4E3A_u4EC0_u4E48_u4F1A_u6709_u672C_u6559_u7A0B"><a href="#u4E3A_u4EC0_u4E48_u4F1A_u6709_u672C_u6559_u7A0B" class="headerlink" title="为什么会有本教程"></a>为什么会有本教程</h1><p>Ubuntu源里的Node.js版本比较低,不能满足正常的使用需求。<br>当然,我们可以编译安装,或者从官网下载二进制文件,然后设置环境变量(操作略微繁琐)。</p>
<p>还可以这样安装,<strong>非常便捷</strong>,请往下看:</p>
<a id="more"></a>
<h1 id="u5982_u4F55_u5B89_u88C5"><a href="#u5982_u4F55_u5B89_u88C5" class="headerlink" title="如何安装"></a>如何安装</h1><p>本文以Ubuntu为例。</p>
<h2 id="u9002_u5408_u76F4_u63A5_u590D_u5236_u7684_u5B89_u88C5_u547D_u4EE4"><a href="#u9002_u5408_u76F4_u63A5_u590D_u5236_u7684_u5B89_u88C5_u547D_u4EE4" class="headerlink" title="适合直接复制的安装命令"></a>适合直接复制的安装命令</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">apt-get install git</span><br><span class="line">curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.<span class="number">29.0</span>/install.sh | bash &amp;&amp; <span class="built_in">source</span> ~/.nvm/nvm.sh</span><br><span class="line">nvm install v4.<span class="number">3.1</span></span><br></pre></td></tr></table></figure>
<h2 id="Step1_uFF1A_u5B89_u88C5git_uFF1A"><a href="#Step1_uFF1A_u5B89_u88C5git_uFF1A" class="headerlink" title="Step1:安装git:"></a>Step1:安装git:</h2><p>直接从源里安装即可:</p>
<blockquote>
<p># apt-get update<br># apt-get install git</p>
</blockquote>
<h2 id="Step2_uFF1A_u5B89_u88C5NVM_uFF08Node_Version_Manger_uFF09"><a href="#Step2_uFF1A_u5B89_u88C5NVM_uFF08Node_Version_Manger_uFF09" class="headerlink" title="Step2:安装NVM(Node Version Manger)"></a>Step2:安装NVM(Node Version Manger)</h2><p>这一步我们直接从github上下载NVM的安装脚本,并直接运行(安装过程依赖git命令)</p>
<blockquote>
<p>$ curl -o- <a href="https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh" target="_blank" rel="external">https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh</a> | bash &amp;&amp; source ~/.nvm/nvm.sh</p>
</blockquote>
<h2 id="Step3_uFF1A_u4F7F_u7528NVM_u5B89_u88C5Node-js"><a href="#Step3_uFF1A_u4F7F_u7528NVM_u5B89_u88C5Node-js" class="headerlink" title="Step3:使用NVM安装Node.js"></a>Step3:使用NVM安装Node.js</h2><p>如果上一步操作没有出现错误提示,NVM应该已经可用了。<br>如果提示不存在<strong>nvm</strong>命令,可以尝试重启Terminal。<br>先打开<a href="https://nodejs.org/" target="_blank" rel="external">Node.js官网</a>,看看Node.js的最新版本号。<br>截止至本教程写作时,Node.js的最新LTS版本是4.3.1。<br>这里以安装4.3.1为例,你可根据实际情况安装所需要的版本号。</p>
<blockquote>
<p>$ nvm install v4.3.1</p>
</blockquote>
<p>稍等片刻,NVM将自动下载并安装指定版本的Node.js</p>
<h2 id="Step4_uFF1A_u5B8C_u6210_u5B89_u88C5"><a href="#Step4_uFF1A_u5B8C_u6210_u5B89_u88C5" class="headerlink" title="Step4:完成安装"></a>Step4:完成安装</h2><p>安装成功后,你将看到这样的提示信息:<strong>Now using node v4.3.1 (npm v2.14.12)</strong><br>查看当前Node.js的版本:</p>
<blockquote>
<p>$ node --version</p>
</blockquote>
<p>作者看到的是<strong>v4.3.1</strong>,说明安装成功了。</p>
<h2 id="Step5_uFF1A_u5982_u4F55_u4F7F_u7528"><a href="#Step5_uFF1A_u5982_u4F55_u4F7F_u7528" class="headerlink" title="Step5:如何使用"></a>Step5:如何使用</h2><p>以后当你想使用Node.js的时候,先运行一下NVM(以4.3.1为例):</p>
<blockquote>
<p>$ nvm use 4.3.1</p>
</blockquote>
<p>如果想永久生效,输入下面的命令:</p>
<blockquote>
<p>$ nvm alias default stable</p>
</blockquote>
<p>如果想指定永久生效的版本号:</p>
<blockquote>
<p>$ nvm alias default 4.3.1</p>
</blockquote>
<p>如果想列出所有已安装的版本:</p>
<blockquote>
<p>$ nvm ls</p>
</blockquote>
<p>如果想列出所有可安装的版本:</p>
<blockquote>
<p>$ nvm ls-remote</p>
</blockquote>
<p>怎么样,是不是很简单!</p>
<h2 id="u7F3A_u70B9"><a href="#u7F3A_u70B9" class="headerlink" title="缺点"></a>缺点</h2><p>在#权限下没有安装nvm,所以也没有Node.js……</p>
</content>
<summary type="html">
<h1 id="u4E3A_u4EC0_u4E48_u4F1A_u6709_u672C_u6559_u7A0B"><a href="#u4E3A_u4EC0_u4E48_u4F1A_u6709_u672C_u6559_u7A0B" class="headerlink" title="为什么会有本教程"></a>为什么会有本教程</h1><p>Ubuntu源里的Node.js版本比较低,不能满足正常的使用需求。<br>当然,我们可以编译安装,或者从官网下载二进制文件,然后设置环境变量(操作略微繁琐)。</p>
<p>还可以这样安装,<strong>非常便捷</strong>,请往下看:</p>
</summary>
<category term="NodeJS" scheme="http://blog.moeoj.net/tags/NodeJS/"/>
<category term="教程" scheme="http://blog.moeoj.net/tags/%E6%95%99%E7%A8%8B/"/>
</entry>
<entry>
<title>稍微改进了一下博客</title>
<link href="http://blog.moeoj.net/2016/02/28/%E7%A8%8D%E5%BE%AE%E6%94%B9%E8%BF%9B%E4%BA%86%E4%B8%80%E4%B8%8B%E5%8D%9A%E5%AE%A2/"/>
<id>http://blog.moeoj.net/2016/02/28/稍微改进了一下博客/</id>
<published>2016-02-28T15:54:00.000Z</published>
<updated>2016-02-29T05:08:00.525Z</updated>
<content type="html"><p>最近重装了系统,好多东西都重新配置过了。<br>因为SSH Key没有备份,重新换了一个。试了一下,能行,这博客可以继续写。</p>
<p>然后顺手给博客增加一些<del>无用的</del>功能,从这篇博客发表之后,本博客的文章加载速度更快了(仅限电脑浏览)。<br>您可以点开本博客的文章试试效果。</p>
<h2 id="u8BDD_u8BF4"><a href="#u8BDD_u8BF4" class="headerlink" title="话说"></a>话说</h2><p>嗯……其实这个应该发在QQ空间说说里头,太短了。</p>
<h2 id="u540E_u7EED"><a href="#u540E_u7EED" class="headerlink" title="后续"></a>后续</h2><p>2016年2月29日中午修复了几个BUG,移除了动画效果。</p>
</content>
<summary type="html">
<p>最近重装了系统,好多东西都重新配置过了。<br>因为SSH Key没有备份,重新换了一个。试了一下,能行,这博客可以继续写。</p>
<p>然后顺手给博客增加一些<del>无用的</del>功能,从这篇博客发表之后,本博客的文章加载速度更快了(仅限电脑浏览)。<br>您可以
</summary>
<category term="吃饱没事干" scheme="http://blog.moeoj.net/categories/%E5%90%83%E9%A5%B1%E6%B2%A1%E4%BA%8B%E5%B9%B2/"/>
<category term="厨余垃圾" scheme="http://blog.moeoj.net/tags/%E5%8E%A8%E4%BD%99%E5%9E%83%E5%9C%BE/"/>
</entry>
<entry>
<title>手有点痒</title>
<link href="http://blog.moeoj.net/2016/01/30/%E6%89%8B%E6%9C%89%E7%82%B9%E7%97%92/"/>
<id>http://blog.moeoj.net/2016/01/30/手有点痒/</id>
<published>2016-01-30T13:45:29.000Z</published>
<updated>2016-01-30T14:28:00.890Z</updated>
<content type="html"><h2 id="u5982_u679C_u4F60_u80FD_u770B_u5230_u8FD9_u884C_u5B57"><a href="#u5982_u679C_u4F60_u80FD_u770B_u5230_u8FD9_u884C_u5B57" class="headerlink" title="如果你能看到这行字"></a>如果你能看到这行字</h2><p>用Chrome或者火狐浏览器浏览本页面,按下F12,打开开发者工具。<br>切换到“Console”,或者“控制台”。<br>然后输入d(),回车。</p>
<script>
function d() {
console.log("看来你的手也有点痒……")
setInterval("var d = Math.random() * 6 - 3;document.body.style.transform='translateX(' + d + 'px)';document.body.style.transform='translateY(' + d + 'px)';", 50);
}
</script></content>
<summary type="html">
<h2 id="u5982_u679C_u4F60_u80FD_u770B_u5230_u8FD9_u884C_u5B57"><a href="#u5982_u679C_u4F60_u80FD_u770B_u5230_u8FD9_u884C_u5B57" class="heade
</summary>
<category term="吃饱没事干" scheme="http://blog.moeoj.net/categories/%E5%90%83%E9%A5%B1%E6%B2%A1%E4%BA%8B%E5%B9%B2/"/>
<category term="有趣" scheme="http://blog.moeoj.net/tags/%E6%9C%89%E8%B6%A3/"/>
</entry>
<entry>
<title>和我一起学Python3 第六节 列表、元组、字典与集合</title>
<link href="http://blog.moeoj.net/2016/01/25/%E5%92%8C%E6%88%91%E4%B8%80%E8%B5%B7%E5%AD%A6Python3-%E7%AC%AC%E5%85%AD%E8%8A%82-%E5%88%97%E8%A1%A8%E3%80%81%E5%85%83%E7%BB%84%E3%80%81%E5%AD%97%E5%85%B8%E4%B8%8E%E9%9B%86%E5%90%88/"/>
<id>http://blog.moeoj.net/2016/01/25/和我一起学Python3-第六节-列表、元组、字典与集合/</id>
<published>2016-01-25T03:31:50.000Z</published>
<updated>2016-01-29T13:51:19.715Z</updated>
<content type="html"><p>大家好~~~~</p>
<p>作者前几天到NIIT实训去了,学了“如何在博客了加入背景音乐”(雾)。</p>
<p>老师说,用这个:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="title">audio</span> <span class="attribute">src</span>=<span class="value">"blablablabla……"</span> <span class="attribute">controls</span>=<span class="value">"controls"</span> <span class="attribute">loop</span>=<span class="value">"loop"</span>&gt;</span></span><br><span class="line">您的浏览器实在是太先进了</span><br><span class="line"><span class="tag">&lt;/<span class="title">audio</span>&gt;</span></span><br></pre></td></tr></table></figure></p>
<p>标签就可以了!</p>
<p>话说……播放列表怎么做QAQ</p>
<p>扯远了,我们来接着学习Python吧。</p>
<a id="more"></a>
<p>这节课我们来讲Python中的四种特殊的数据类型,它们的特点是:</p>
<ul>
<li>由0个、1个或多个基本类型的数据组成</li>
<li>可以层层嵌套</li>
</ul>
<p>它们就是:<br>(标题上那四个……)</p>
<p>我们先来学习这里面的“列表”和“元组”。</p>
<p>Python中的“列表”、“元组”和“字符串”都是<strong>序列对象</strong>。</p>
<p>什么叫做“序列对象”呢?</p>
<p>序列对象就是具有下列特点的对象:</p>
<ul>
<li>成员<strong>有序</strong>排列</li>
<li>可以通过下标访问</li>
<li>可以迭代</li>
</ul>
<h2 id="u5143_u7EC4_28Tuple_29"><a href="#u5143_u7EC4_28Tuple_29" class="headerlink" title="元组(Tuple)"></a>元组(Tuple)</h2><p>元组是一种<strong>不可变</strong>的序列对象。</p>
<p>一个元组的表示方式是:<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(&#23545;&#35937;1, &#23545;&#35937;2, &#23545;&#35937;3)</span><br></pre></td></tr></table></figure></p>
<p>其中的“对象”可以是任何一种数据类型,包括本节所讲的所有类型。<br><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="prompt">&gt;&gt;&gt; </span>(<span class="number">123</span>, <span class="string">'你好'</span>, [<span class="string">'hello'</span>])</span><br><span class="line">(<span class="number">123</span>, <span class="string">'你好'</span>, [<span class="string">'hello'</span>])</span><br></pre></td></tr></table></figure></p>
<p>这就是一个元组,其中第一个对象是一个int,第二个对象是一个string,第三个对象是一个列表(List)</p>
<p>一个元组被创建之后就不能被修改,所有的“修改”操作只是完全重新创建了一个新的元组,然后取代了原有的元组。</p>
<p>有时候元组可以没有括号,但括号+逗号+2个或2个以上的对象所构成的,一定是一个独立的“元组”。<br>例如:<br><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="prompt">&gt;&gt;&gt; </span><span class="number">1</span>,<span class="number">2</span></span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>((<span class="number">1</span>,<span class="number">2</span>))</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span><span class="number">1</span>,(<span class="number">2</span>)</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>(<span class="number">1</span>,(<span class="number">2</span>))</span><br><span class="line">(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span><span class="number">1</span>,(<span class="number">2</span>,<span class="number">3</span>)</span><br><span class="line">(<span class="number">1</span>, (<span class="number">2</span>, <span class="number">3</span>))</span><br></pre></td></tr></table></figure></p>
<p>第一到第四种情况,它们都是等价的。都是同一个元组对象:(1, 2)<br>第五中情况为元组嵌套元组。</p>
<p>元组在“给函数传递多个参数”、“一个函数同时返回多个值”等场合中都有应用。<br>这里举一个简单的例子:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a = <span class="number">1</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b = <span class="number">2</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a,b = b,a</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b</span><br><span class="line"><span class="number">1</span></span><br></pre></td></tr></table></figure></p>
<p>这就是<strong>两数交换</strong>的写法,a, b = b, a。<br>相当于:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(a, b) = (b, a)</span><br></pre></td></tr></table></figure></p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">temp_b = b</span><br><span class="line">temp_a = a</span><br><span class="line">a = temp_b</span><br><span class="line">b = temp_a</span><br></pre></td></tr></table></figure>
<p>你问我[a, b] = [b, a]可不可以?<br>当然可以。</p>
<p>a和b都是不可变对象,它们的值是不会被修改的。<br>当然,也没有创建出两个新的int。<br>这个“两数交换”其实是交换了a和b的引用,现在通过a访问到的是之前的b,通过b访问到的是之前的a。它们在内存中的实际位置没有发生变化。值也没有发生变化。</p>
<p>你可以通过下标访问元组的任意项,语法是:有序对象[位置]。Python中的[]非常强大,我们一会再学。<br><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="prompt">&gt;&gt;&gt; </span>(<span class="number">1</span>,<span class="number">2</span>)[<span class="number">1</span>]</span><br><span class="line"><span class="number">2</span></span><br></pre></td></tr></table></figure></p>
<h2 id="u5217_u8868_28List_29"><a href="#u5217_u8868_28List_29" class="headerlink" title="列表(List)"></a>列表(List)</h2><p>列表和元组很相似,但有一点区别:<strong>列表的内容可以被修改</strong>。<br>创建了一个列表之后,你可以对它进行增删改查操作。<br>一个列表的表示方式是:<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[&#23545;&#35937;1, &#23545;&#35937;2, &#23545;&#35937;3]</span><br></pre></td></tr></table></figure></p>
<p>这是一个列表的例子:<br><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="prompt">&gt;&gt;&gt; </span>a = [<span class="number">1</span>, <span class="string">'2'</span>, [<span class="number">3</span>]]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="string">'2'</span>, [<span class="number">3</span>]]</span><br></pre></td></tr></table></figure></p>
<p>其中的对象从左往右依次为int,string,list。</p>
<p>我们可以当数组用:<br><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="prompt">&gt;&gt;&gt; </span>a[<span class="number">0</span>]</span><br><span class="line"><span class="number">1</span></span><br></pre></td></tr></table></figure></p>
<p>可以当堆栈用:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.append(<span class="number">4</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="string">'2'</span>, [<span class="number">3</span>], <span class="number">4</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.pop()</span><br><span class="line"><span class="number">4</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="string">'2'</span>, [<span class="number">3</span>]]</span><br></pre></td></tr></table></figure></p>
<p>可以拼接两个List:<br><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="prompt">&gt;&gt;&gt; </span>a.extend([<span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>])</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="string">'2'</span>, [<span class="number">3</span>], <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>]</span><br></pre></td></tr></table></figure></p>
<p>当然,你可以将两个List相加,它会返回一个由两个List拼接而成的新List。由于是完全重新创建的List,所以耗时长,消耗内存大。一般不建议使用。</p>
<p>可以当队列用:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.append(<span class="string">'abc'</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="string">'2'</span>, [<span class="number">3</span>], <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="string">'abc'</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.pop(<span class="number">0</span>)</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">'2'</span>, [<span class="number">3</span>], <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="string">'abc'</span>]</span><br></pre></td></tr></table></figure></p>
<p>pop(下标)将返回并删除指定位置的元素。如果不指定参数,则目标为队列末尾。</p>
<p>可以插队:<br><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="prompt">&gt;&gt;&gt; </span>a.insert(<span class="number">3</span>, <span class="string">'d'</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">'2'</span>, [<span class="number">3</span>], <span class="number">4</span>, <span class="string">'d'</span>, <span class="number">5</span>, <span class="number">6</span>, <span class="string">'abc'</span>]</span><br></pre></td></tr></table></figure></p>
<p>使用insert(位置, 内容)可以在指定位置(从0到n-1)插入一个对象。</p>
<p>可以排序:<br><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="prompt">&gt;&gt;&gt; </span>a = [<span class="number">6</span>, <span class="number">4</span>, <span class="number">2</span>, <span class="number">1</span>, <span class="number">3</span>, <span class="number">5</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.sort()</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>]</span><br></pre></td></tr></table></figure></p>
<p>如果List中有多种数据类型,依然可以对它进行排序,Python会尽可能让其按照一定的顺序排列<br>sort()函数会直接修改List的内容,不会返回数据。</p>
<p>如果你想保留原List,请使用sorted()函数。<br><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="prompt">&gt;&gt;&gt; </span>a = [<span class="number">6</span>, <span class="number">4</span>, <span class="number">2</span>, <span class="number">1</span>, <span class="number">3</span>, <span class="number">5</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b = sorted(a)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">6</span>, <span class="number">4</span>, <span class="number">2</span>, <span class="number">1</span>, <span class="number">3</span>, <span class="number">5</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>]</span><br></pre></td></tr></table></figure></p>
<p>使用reverse()方法可以翻转一个List的顺序:<br><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="prompt">&gt;&gt;&gt; </span>b.reverse()</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b</span><br><span class="line">[<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><br></pre></td></tr></table></figure></p>
<p>可以删除List中一个指定内容的项:<br><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="prompt">&gt;&gt;&gt; </span>a = [<span class="string">'abc'</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="string">'abc'</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.remove(<span class="number">4</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="string">'abc'</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="string">'abc'</span>, <span class="number">5</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.remove(<span class="string">'abc'</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="string">'abc'</span>, <span class="number">5</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.remove(<span class="string">'abc'</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">5</span>]</span><br></pre></td></tr></table></figure></p>
<p>是否还记得,Python中所有的变量名都是<strong>引用</strong>?(在上一节中提到过)<br>我们可以试验一下。</p>
<p>现在有一个列表a:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br></pre></td></tr></table></figure></p>
<p>你想复制一份a,如何操作?<br><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="prompt">&gt;&gt;&gt; </span>b = a</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br></pre></td></tr></table></figure></p>
<p>看起来好像复制了一份a。<br><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="prompt">&gt;&gt;&gt; </span>a.append(<span class="number">4</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br></pre></td></tr></table></figure></p>
<p>没错,a和b只是同一个List的<strong>两个引用</strong>。或者你可以理解为“两个名称”。其实内存中只有一个List……</p>
<p>那……怎么复制呢?</p>
<p>当然,你可以遍历这个List,创建一个新的List,把每个项目一个一个加进去。<br>不过,Python那强大的[]运算符能更加省事。</p>
<p>它不仅可以访问序列中的一个对象,还可以访问序列中的一组对象。</p>
<p>如果想复制一个List,你可以这么做:<br><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="prompt">&gt;&gt;&gt; </span>b = a[:]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.append(<span class="number">5</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<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"><span class="prompt">&gt;&gt;&gt; </span>b</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br></pre></td></tr></table></figure></p>
<p>这才是两个List。</p>
<h2 id="Python__u5207_u7247"><a href="#Python__u5207_u7247" class="headerlink" title="Python 切片"></a>Python 切片</h2><p>话说a[:]是什么鬼……</p>
<p>好的,现在讲一讲a[:]是什么鬼。</p>
<p>Python的[]有下列三种用法:</p>
<blockquote>
<ul>
<li>有序对象[位置]<br>返回一个序列指定位置的对象,这个位置取值范围为从0 ~ n-1(顺序访问),也可以从-1 ~ -n(逆序访问)</li>
</ul>
<ul>
<li>有序对象[起始位置:终止位置]<br>返回一个序列中指定始末位置的片段(不包含终止位置对应的对象),若起始位置大于等于终止位置,则返回空序列。位置同样支持负数值。(注意……返回的序列顺序不会发生变化)</li>
</ul>
<ul>
<li>有序对象[起始位置:终止位置:步进值]<br>在上面的基础上,加上一个“对象之间的距离”值。</li>
</ul>
</blockquote>
<p>这称为“切片”。</p>
<p>来试一试吧:<br><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="prompt">&gt;&gt;&gt; </span>a = list(range(<span class="number">1</span>,<span class="number">21</span>))</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">[<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 class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">20</span>]</span><br></pre></td></tr></table></figure></p>
<p>在Python 3中,range()返回一个迭代器,支持1~3个参数,1个参数返回从0 ~ n-1的迭代器,其余情况和上面的“切片”类似……区别就是步进值允许负数,返回一个倒序的数列迭代器。<br>使用list()函数将迭代器转换为List对象。<br><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="prompt">&gt;&gt;&gt; </span>a[-<span class="number">1</span>]</span><br><span class="line"><span class="number">20</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a[-<span class="number">2</span>]</span><br><span class="line"><span class="number">19</span></span><br></pre></td></tr></table></figure></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="prompt">&gt;&gt;&gt; </span>a[<span class="number">5</span>]</span><br><span class="line"><span class="number">6</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a[<span class="number">1</span>:<span class="number">5</span>]</span><br><span class="line">[<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"><span class="prompt">&gt;&gt;&gt; </span>a[:<span class="number">5</span>]</span><br><span class="line">[<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></pre></td></tr></table></figure>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a[<span class="number">14</span>]</span><br><span class="line"><span class="number">15</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a[<span class="number">14</span>:-<span class="number">1</span>]</span><br><span class="line">[<span class="number">15</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">19</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a[<span class="number">14</span>:]</span><br><span class="line">[<span class="number">15</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">20</span>]</span><br></pre></td></tr></table></figure>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a[:]</span><br><span class="line">[<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 class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">20</span>]</span><br></pre></td></tr></table></figure>
<p>是不是突然理解了a[:]……<br><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="prompt">&gt;&gt;&gt; </span>a[::<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 class="number">11</span>, <span class="number">13</span>, <span class="number">15</span>, <span class="number">17</span>, <span class="number">19</span>]</span><br></pre></td></tr></table></figure></p>
<p>没错,只要冒号数量对得上,位置可以为空,表示开始位置/末尾位置。步进值也可以为空,默认为1。<br>由此可推测:<br>a[::]的效果和a[:]是一样的。<br><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="prompt">&gt;&gt;&gt; </span>a[::]</span><br><span class="line">[<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 class="number">10</span>, <span class="number">11</span>, <span class="number">12</span>, <span class="number">13</span>, <span class="number">14</span>, <span class="number">15</span>, <span class="number">16</span>, <span class="number">17</span>, <span class="number">18</span>, <span class="number">19</span>, <span class="number">20</span>]</span><br></pre></td></tr></table></figure></p>
<p>所有的序列对象都可以这么玩:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>s = <span class="string">'我从未见过如此厚颜无耻之人'</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>s[<span class="number">3</span>:]</span><br><span class="line"><span class="string">'见过如此厚颜无耻之人'</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>s[::<span class="number">2</span>]</span><br><span class="line"><span class="string">'我未过此颜耻人'</span></span><br></pre></td></tr></table></figure></p>
<h2 id="u5B57_u5178_28Dict_29"><a href="#u5B57_u5178_28Dict_29" class="headerlink" title="字典(Dict)"></a>字典(Dict)</h2><p>字典是用key-value方式存储的数据结构。</p>
<p>使用这种数据结构,你可以通过key,在很短的时间内查找到value。</p>
<p>这适合存储类似于名字-成绩,单词-含义,属性-值……这样的成对出现的数据。</p>
<p>话不多说,直接看示范:<br><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="prompt">&gt;&gt;&gt; </span>a = &#123;<span class="string">'小明'</span>: <span class="number">100</span>, <span class="string">'小红'</span>: <span class="number">97</span>, <span class="string">'小刚'</span>: <span class="number">86</span>&#125;</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a[<span class="string">'小明'</span>]</span><br><span class="line"><span class="number">100</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a[<span class="string">'小埋'</span>] = <span class="number">99</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">'小埋'</span>: <span class="number">99</span>, <span class="string">'小红'</span>: <span class="number">97</span>, <span class="string">'小明'</span>: <span class="number">100</span>, <span class="string">'小刚'</span>: <span class="number">86</span>&#125;</span><br></pre></td></tr></table></figure></p>
<p>它的格式是:<br><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">&#123;key1: value1, key2: value2, key3: value3&#125;</span><br></pre></td></tr></table></figure></p>
<p>访问方式是:<br><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]</span><br></pre></td></tr></table></figure></p>
<p><strong>key必须是不可变类型。</strong><br><strong>key必须是不可变类型。</strong><br><strong>key必须是不可变类型。</strong> </p>
<p>使用可变对象作为key会报错:<br><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="prompt">&gt;&gt;&gt; </span>a[[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]] = <span class="number">12</span></span><br><span class="line">Traceback (most recent call last):</span><br><span class="line"> File <span class="string">"&lt;stdin&gt;"</span>, line <span class="number">1</span>, <span class="keyword">in</span> &lt;module&gt;</span><br><span class="line">TypeError: unhashable type: <span class="string">'list'</span></span><br></pre></td></tr></table></figure></p>
<p>(从错误信息来看,Dict的索引是基于Hash的)</p>
<p>访问不存在的key会报错:<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#62;&#62;&#62; a[&#39;BL&#39;]&#10;Traceback (most recent call last):&#10; File &#34;&#60;stdin&#62;&#34;, line 1, in &#60;module&#62;&#10;KeyError: &#39;BL&#39;</span><br></pre></td></tr></table></figure></p>
<p>怎么避免这个错误呢?使用dict提供的get方法即可。<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.get(<span class="string">'BL'</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.get(<span class="string">'BL'</span>, <span class="number">1</span>)</span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.get(<span class="string">'小埋'</span>)</span><br><span class="line"><span class="number">99</span></span><br></pre></td></tr></table></figure></p>
<p>字典.get(key):如果key不存在,返回None。<br>字典.get(key, 返回值):如果key不存在,返回用户指定的值。</p>
<p>你可以检查key是否存在:<br><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="prompt">&gt;&gt;&gt; </span><span class="string">'小埋'</span> <span class="keyword">in</span> a</span><br><span class="line"><span class="keyword">True</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span><span class="string">'BL'</span> <span class="keyword">in</span> a</span><br><span class="line"><span class="keyword">False</span></span><br></pre></td></tr></table></figure></p>
<p>可以移除字典中的项目:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.pop(<span class="string">'小埋'</span>)</span><br><span class="line"><span class="number">99</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">'小红'</span>: <span class="number">97</span>, <span class="string">'小明'</span>: <span class="number">100</span>, <span class="string">'小刚'</span>: <span class="number">86</span>&#125;</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span><span class="keyword">del</span> a[<span class="string">'小明'</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="string">'小红'</span>: <span class="number">97</span>, <span class="string">'小刚'</span>: <span class="number">86</span>&#125;</span><br></pre></td></tr></table></figure></p>
<p><strong>注意:Dict内部的数据存放顺序和添加的顺序无关。</strong></p>
<p>Dict的两个特点:</p>
<ul>
<li>查找速度快</li>
<li>浪费内存多</li>
</ul>
<h2 id="u96C6_u5408_28set_29"><a href="#u96C6_u5408_28set_29" class="headerlink" title="集合(set)"></a>集合(set)</h2><p>和字典类似,但只有key,没有value。</p>
<p>和数学定义的“集合”类似,集合中的元素具有确定性、互异性和无序性。(23333333)</p>
<p>集合的使用方式:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a = &#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.add(<span class="number">4</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>&#125;</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.remove(<span class="number">1</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>&#125;</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.add(<span class="number">4</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.add(<span class="number">4</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.add(<span class="number">4</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a.add(<span class="number">4</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br><span class="line">&#123;<span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>&#125;</span><br></pre></td></tr></table></figure></p>
<p>和数学上的集合一样,可以求交集和并集:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b = &#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b &amp; a</span><br><span class="line">&#123;<span class="number">2</span>, <span class="number">3</span>&#125;</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b | a</span><br><span class="line">&#123;<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>&#125;</span><br></pre></td></tr></table></figure></p>
<p>和dict一样,不可在set中放入“不可变对象”。<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#62;&#62;&#62; a.add([1])&#10;Traceback (most recent call last):&#10; File &#34;&#60;stdin&#62;&#34;, line 1, in &#60;module&#62;&#10;TypeError: unhashable type: &#39;list&#39;</span><br></pre></td></tr></table></figure></p>
</content>
<summary type="html">
<p>大家好~~~~</p>
<p>作者前几天到NIIT实训去了,学了“如何在博客了加入背景音乐”(雾)。</p>
<p>老师说,用这个:<br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="title">audio</span> <span class="attribute">src</span>=<span class="value">"blablablabla……"</span> <span class="attribute">controls</span>=<span class="value">"controls"</span> <span class="attribute">loop</span>=<span class="value">"loop"</span>&gt;</span></span><br><span class="line">您的浏览器实在是太先进了</span><br><span class="line"><span class="tag">&lt;/<span class="title">audio</span>&gt;</span></span><br></pre></td></tr></table></figure></p>
<p>标签就可以了!</p>
<p>话说……播放列表怎么做QAQ</p>
<p>扯远了,我们来接着学习Python吧。</p>
</summary>
<category term="Python3教程" scheme="http://blog.moeoj.net/categories/Python3%E6%95%99%E7%A8%8B/"/>
<category term="Python" scheme="http://blog.moeoj.net/tags/Python/"/>
<category term="教程" scheme="http://blog.moeoj.net/tags/%E6%95%99%E7%A8%8B/"/>
</entry>
<entry>
<title>今天登录Steam,遇到了SSL错误</title>
<link href="http://blog.moeoj.net/2016/01/18/%E4%BB%8A%E5%A4%A9%E7%99%BB%E5%BD%95Steam%EF%BC%8C%E9%81%87%E5%88%B0%E4%BA%86SSL%E9%94%99%E8%AF%AF/"/>
<id>http://blog.moeoj.net/2016/01/18/今天登录Steam,遇到了SSL错误/</id>
<published>2016-01-18T03:42:13.000Z</published>
<updated>2016-01-18T11:10:01.458Z</updated>
<content type="html"><p>这几天由于学校的某些安排,我又住学校了。到学校之后,当然是先学(yú)习(lè)一下啦~先来看看Steam上有没有新推出的好玩的东西。</p>
<p>我打开Steam页面,是这个样子的:<br><img src="/images/steam-ssl/main.png" alt="Steam商店页面"></p>
<p>Steam商店主页看起来非常地<del>不</del>正常。<br>登录状态掉了,先去登录一下好了。o((&gt;ω&lt; ))o<br>这时候需要戳一下右上角的“登录”。(。・ω・)ノ゙<br><a id="more"></a><br>结果出现了这个:<br><img src="/images/steam-ssl/ssl-error.png" alt="SSL错误信息"></p>
<p>(┙&gt;∧&lt;)┙へ┻┻<br><img src="/images/steam-ssl/ssl-error-2.png" alt="SSL错误信息"></p>
<p>简单来说,( ・ˍ・)目前打开了一个“假的”Steam登录页面。<br>\(“▔□▔)/这就是“中间人攻击”啊喂!<br>(;&gt;△&lt;)要是登录页面不用HTTPS,我的Steam账号就被盗了。</p>
<p>所谓的“中间人攻击”就是在网络上通信时,数据被中间的网络设备截取、篡改、伪造等行为,非常常见。例如中国电信、联通、移动经常会在正常的网页里植入一些关于宽带业务、某种颜色、澳门*场的广告,还有某个伟大的防火(和谐)……都是这类攻击。</p>
<p>使用SSL协议通信可以在一定程度上防止此类攻击。在我们使用HTTP协议访问网页时,有三大风险:</p>
<ul>
<li>窃听:第三方可以获取通信内容。(不要在互联网上随意发送私密照片,相册加密也没用╮( ̄▽ ̄)╭ ,某315晚会有现场演示)</li>
<li>篡改:第三方可以修改通信内容。(运营商的广告是这样做的,广告拦截工具也是这样做的)</li>
<li>冒充:第三方可以冒充他人身份参与通信。(比如伟大的……( ̄ε(# ̄)☆╰╮o( ̄▽ ̄///) )</li>
</ul>
<p>在使用SSL/TLS协议之后:</p>
<ul>
<li>信息是加密传输的,攻击者看到的都是奇♂怪的数据。</li>
<li>信息带有校验,如果信息被篡改,双方都能得知。</li>
<li>身份无法被冒充,因为攻击者不知道怎么生成加密后的信息。</li>
</ul>
<p>一个模拟场景:<br>小A去咖啡厅“钓鱼”。他带了一台笔记本电脑,具有无线网卡,可以建立热点。他连上网络之后,建立了一个和咖啡厅WiFi具有相同的SSID,加密方式和密码的热点。</p>
<p>小B经常在这个咖啡厅上网,他的设备已经保存了咖啡厅WiFi的SSID和密码。这天他像往常一样,打开WiFi,设备自动连接上了咖啡厅的WiFi。(看起来是的)</p>
<p>A打开抓包工具,对无线网卡进行抓包。他发现了一些HTTP POST请求。里面包含了这样的信息:“txtUserName=学号;TextBox2=密码”(这不是学校的教务系统吗233333……)。同时还发现了一些奇♂怪的图片,以及B浏览过的网址……</p>
<p>不过,对于使用HTTPS的网站,A无法得到有价值的信息……</p>
<p>A自己做了一个“钓鱼”网站,并且编写了一个小程序。在截取到B的设备请求DNS查询(UDP协议)的时候,立即给B的设备回复一个精心构造的查询结果,使得此域名解析到A的笔记本电脑IP地址上。B在通过该域名访问此网站时,会打开A的“钓鱼”页面。</p>
<p>B是通过HTTPS协议访问这网站的。</p>
<p>A啊,还是too young, too simple, sometimes naive. B发现他不能访问这个网站,像这样:<br><img src="/images/steam-ssl/https-test.png" alt="没有SSL证书"><br>(‵▽′)A的服务器没有提供CA证书嘛……</p>
<p>于是A把自己的网站的证书部署上去了……</p>
<p>然后……结果就和本文的开头类似。(。・`ω´・)。<br>是假的,是头发的特技,是特技的头发……<br>证书和域名是绑定的。( &gt;з&lt;)</p>
<p>话说这个s-msn.com是什么鬼,和msn有什么关系……(´・ω・`)<br><img src="/images/steam-ssl/s-msn.png" alt="s-msn备案信息1"><br><img src="/images/steam-ssl/s-msn-2.png" alt="s-msn备案信息2"><br><img src="/images/steam-ssl/s-msn-3.png" alt="s-msn备案信息3"><br>Σ(`д′*ノ)ノ<br>挂代理登录Steam去。<br><img src="/images/steam-ssl/steam.png" alt="Steam登录成功"><br>_(:3 」∠)_登录成功了……果然不是Steam的问题。</p>
</content>
<summary type="html">
<p>这几天由于学校的某些安排,我又住学校了。到学校之后,当然是先学(yú)习(lè)一下啦~先来看看Steam上有没有新推出的好玩的东西。</p>
<p>我打开Steam页面,是这个样子的:<br><img src="/images/steam-ssl/main.png" alt="Steam商店页面"></p>
<p>Steam商店主页看起来非常地<del>不</del>正常。<br>登录状态掉了,先去登录一下好了。o((&gt;ω&lt; ))o<br>这时候需要戳一下右上角的“登录”。(。・ω・)ノ゙<br>
</summary>
<category term="厨余垃圾" scheme="http://blog.moeoj.net/categories/%E5%8E%A8%E4%BD%99%E5%9E%83%E5%9C%BE/"/>
<category term="牢骚" scheme="http://blog.moeoj.net/tags/%E7%89%A2%E9%AA%9A/"/>
</entry>
<entry>
<title>和我一起学Python3 第五节 保留字、变量和数据类型</title>
<link href="http://blog.moeoj.net/2016/01/11/%E5%92%8C%E6%88%91%E4%B8%80%E8%B5%B7%E5%AD%A6Python3-%E7%AC%AC%E4%BA%94%E8%8A%82-%E4%BF%9D%E7%95%99%E5%AD%97%E3%80%81%E5%8F%98%E9%87%8F%E5%92%8C%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/"/>
<id>http://blog.moeoj.net/2016/01/11/和我一起学Python3-第五节-保留字、变量和数据类型/</id>
<published>2016-01-11T11:23:58.000Z</published>
<updated>2016-01-12T14:33:33.433Z</updated>
<content type="html"><h2 id="u4FDD_u7559_u5B57"><a href="#u4FDD_u7559_u5B57" class="headerlink" title="保留字"></a>保留字</h2><p>所谓保留字,就是在一种程序设计语言中,具有特殊含义的单词。<br><strong>它们不能作为变量名、函数名、对象名等标识符使用。</strong></p>
<p>要想查看当前版本的Python保留字列表,请使用下面的命令:<br><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="prompt">&gt;&gt;&gt; </span><span class="keyword">import</span> keyword</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>keyword.kwlist</span><br></pre></td></tr></table></figure></p>
<a id="more"></a>
<h2 id="u53D8_u91CF"><a href="#u53D8_u91CF" class="headerlink" title="变量"></a>变量</h2><p>和初中数学课本里的“变量”一样。在Python中,它不仅可以是一个实数,它还可以是一个虚数,以及任意的数据类型。</p>
<p>声明一个变量的方法为:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">变量名 = 值</span><br></pre></td></tr></table></figure></p>
<p>变量名开头不能是阿拉伯数字,可以使用各国文字、英文、下划线作为开头。</p>
<p>在Python中,所有的“变量”只是一个“引用”。你可以理解为,它是一个实际存在的数据的名称。通过这个名称,你就可以访问对应的数据。</p>
<p>操作符 “=”(赋值) 可以使得左边的“变量名”与右边的“值”建立对应关系。</p>
<p>下面的语句可以创建一个名为a的变量,值为1:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">a = <span class="number">1</span></span><br></pre></td></tr></table></figure></p>
<p>这样的变量名是合法的:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">私は変数 = <span class="number">123</span></span><br><span class="line">我是变量 = <span class="number">456</span></span><br><span class="line">_123 = <span class="number">321</span></span><br></pre></td></tr></table></figure></p>
<p>而这样的变量名是非法的:<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">1a = 789</span><br></pre></td></tr></table></figure></p>
<h2 id="u6570_u636E_u7C7B_u578B"><a href="#u6570_u636E_u7C7B_u578B" class="headerlink" title="数据类型"></a>数据类型</h2><p>Python的数据类型分为两类:可变对象和不可变对象。</p>
<p>不可变对象一旦被创建,无法更改。你可以通过运算符、函数调用来产生一个新的数据,替换掉原有的数据或者给它一个新的变量名。</p>
<p>可变对象在创建完毕之后,可以修改它的内容。</p>
<p>Python中的不可变对象为:</p>
<ul>
<li>None(空)</li>
<li>int(整数)</li>
<li>float(浮点数)</li>
<li>bool(布尔)</li>
<li>complex(复数)</li>
<li>String(字符串)</li>
<li>Tuple(元组)</li>
<li>bytes(字节)</li>
</ul>
<p>可变对象为:</p>
<ul>
<li>List(列表)</li>
<li>Dictionarie(字典)</li>
<li>Set(集合)</li>
</ul>
<h3 id="None"><a href="#None" class="headerlink" title="None"></a>None</h3><p>None表示空值,它是一个特殊的值,含义就是“什么也没有”。注意,<strong>None与0不等价。</strong></p>
<h3 id="u6570_u503C"><a href="#u6570_u503C" class="headerlink" title="数值"></a>数值</h3><h4 id="u6574_u6570"><a href="#u6574_u6570" class="headerlink" title="整数"></a>整数</h4><p>在Python 3中,整数的长度是无限的。<br>整数的例子如下:</p>
<blockquote>
<p>123<br>-321<br>1234567890123456789<br>0</p>
</blockquote>
<h4 id="u6D6E_u70B9_u6570"><a href="#u6D6E_u70B9_u6570" class="headerlink" title="浮点数"></a>浮点数</h4><p>Python中提供的浮点数为双精度(64bit)浮点数。与C语言中的double类型相同。<br>Python不支持单精度浮点数。</p>
<p>浮点数的例子如下:</p>
<blockquote>
<p>123.45<br>-321.01<br>5.0<br>.9</p>
</blockquote>
<h4 id="u590D_u6570"><a href="#u590D_u6570" class="headerlink" title="复数"></a>复数</h4><p>复数是一对浮点数。其中一个表示实部,另一个表示虚部。<br>Python的复数由实部、+或-、虚部和j构成。<br>这是一些复数的例子:<br><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="prompt">&gt;&gt;&gt; </span>z = <span class="number">12</span>-<span class="number">2.3j</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>z = -<span class="number">1.2</span>+<span class="number">3.4j</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>z.real</span><br><span class="line">-<span class="number">1.2</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>z.imag</span><br><span class="line"><span class="number">3.4</span></span><br></pre></td></tr></table></figure></p>
<p>不能对复数使用除法、取模和三个参数的pow()操作。(三个参数的pow是幂取模运算)。<br>复数类型有一个方法conjugate(),它可以改变虚部的符号:<br><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="prompt">&gt;&gt;&gt; </span>z.conjugate()</span><br><span class="line">(-<span class="number">1.2</span>-<span class="number">3.4j</span>)</span><br></pre></td></tr></table></figure></p>
<p>该方法会返回一个新的复数,它的虚部符号和原复数相反。</p>
<h4 id="u7CBE_u786E_u5341_u8FDB_u5236_u5C0F_u6570"><a href="#u7CBE_u786E_u5341_u8FDB_u5236_u5C0F_u6570" class="headerlink" title="精确十进制小数"></a>精确十进制小数</h4><p>虽然大部分情况下,使用浮点数导致的数值不精确问题对程序的影响不大,而且浮点数的运算速度优势足以掩盖它的缺点。不过,在某些情况下,例如涉及到金钱的计算,即使要付出时间的代价,也要确保它的完全准确性。这时候我们可以使用 Python 提供的 decimal 模块。<br>要使用它,需要先导入 decimal 模块,像这样:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span><span class="keyword">import</span> decimal</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a = decimal.Decimal(<span class="number">123</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>b = decimal.Decimal(<span class="string">"4567.8901234567890123"</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a + b</span><br><span class="line">Decimal(<span class="string">'4690.8901234567890123'</span>)</span><br></pre></td></tr></table></figure></p>
<p>math 和 cmath 模块提供的函数不适用于处理 decimal ,但是 math 模块所提供的函数在 decimal 里存在对应的方法。比如,要计算 $e^x$ (x 是一个浮点数),可以使用 math.exp(x)。如果 x 是一个 decimal.Decimal,你需要使用 x.exp()。<br>decimal.Decimal 数据类型还提供ln()方法,用于计算自然对数(以e为底)。</p>
<h3 id="u5E03_u5C14"><a href="#u5E03_u5C14" class="headerlink" title="布尔"></a>布尔</h3><p>布尔类型只有两个值:<strong>True</strong>和<strong>False</strong><br>布尔类型用来表述逻辑含义:真和假。<br><strong>True</strong>为真,<strong>False</strong>为假。<br>用于条件语句。</p>
<h3 id="u5B57_u7B26_u4E32"><a href="#u5B57_u7B26_u4E32" class="headerlink" title="字符串"></a>字符串</h3><p>字符串是用单引号(’)或者双引号(”)括起来的任意文本。<br>不要使用中文单引号和双引号。只有英文单引号和英文双引号才符合Python语法。</p>
<p>使用三个单引号括起来可以表示多行文本。<br><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="string">'使用单引号括起来的文本'</span></span><br><span class="line">双引号字符串 = <span class="string">"使用双引号括起来的文本"</span></span><br><span class="line">包含单引号的字符串 = <span class="string">"这一段文本中包含了'单引号'"</span></span><br><span class="line">包含双引号的字符串 = <span class="string">'这一段文本中包含了"双引号"'</span></span><br><span class="line">包含转义字符的字符串 = <span class="string">'我既包含了单引号\',又包含了双引号"'</span></span><br><span class="line">多行文本 = <span class="string">'''第一行</span><br><span class="line">第二行</span><br><span class="line">第三行</span><br><span class="line">第四行'''</span></span><br><span class="line">双引号多行文本 = <span class="string">""" 一段有换行的文字 """</span></span><br></pre></td></tr></table></figure></p>
<p>在上述代码中,第五个字符串包含了转义符号:\<br>输入一些不能直接输入或者显示的字符,需要使用转义字符。</p>
<p>Python 转义字符表:</p>
<table>
<thead>
<tr>
<th>转义字符</th>
<th>含义</th>
</tr>
</thead>
<tbody>
<tr>
<td>\newline</td>
<td>忽略换行</td>
</tr>
<tr>
<td>\\</td>
<td>反斜杠</td>
</tr>
<tr>
<td>\’</td>
<td>单引号</td>
</tr>
<tr>
<td>\”</td>
<td>双引号</td>
</tr>
<tr>
<td>\a</td>
<td>蜂鸣</td>
</tr>
<tr>
<td>\b</td>
<td>退格</td>
</tr>
<tr>
<td>\f</td>
<td>走纸</td>
</tr>
<tr>
<td>\n</td>
<td>换行</td>
</tr>
<tr>
<td>\N{name}</td>
<td>给定名称的 Unicode 字符</td>
</tr>
<tr>
<td>\ooo</td>
<td>给定八进制值的字符</td>
</tr>
<tr>
<td>\r</td>
<td>回车符</td>
</tr>
<tr>
<td>\t</td>
<td>制表符</td>
</tr>
<tr>
<td>\uhhhh</td>
<td>给定16位十六进制值的 Unicode 字符</td>
</tr>
<tr>
<td>\Uhhhhhhhh</td>
<td>给定32位十六进制值的 Unicode 字符</td>
</tr>
<tr>
<td>\v</td>
<td>垂直制表符</td>
</tr>
<tr>
<td>\xhh</td>
<td>给定8位十六进制值的 Unicode 字符</td>
</tr>
</tbody>
</table>
<p>如果不想使用转义符号,你可以使用r前缀:<br><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="prompt">&gt;&gt;&gt; </span>text = <span class="string">r'末尾的换行是没有用的\n'</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>print(text)</span><br><span class="line">末尾的换行是没有用的\n</span><br></pre></td></tr></table></figure></p>
<p>由于Python3的字符串在内存中以Unicode表示,一个字符对应N个字节,如果你想在网络上传输或者写入文件,需要转为bytes类型。<br>使用前缀b来创建bytes类型的数据:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a = <span class="string">b'Hello'</span></span><br></pre></td></tr></table></figure></p>
<p>bytes的每一个字符只能占用一个字节。</p>
<p>通过使用encode()方法,可以将字符串编码为指定编码的bytes,像这样:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span><span class="string">'Hello'</span>.encode(<span class="string">'utf-8'</span>)</span><br><span class="line"><span class="string">b'Hello'</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span><span class="string">'你好'</span>.encode(<span class="string">'utf-8'</span>)</span><br><span class="line"><span class="string">b'\xe4\xbd\xa0\xe5\xa5\xbd'</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span><span class="string">'你好'</span>.encode(<span class="string">'ascii'</span>)</span><br></pre></td></tr></table></figure></p>
<p>最后一行会报错:<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Traceback (most recent call last):&#10; File &#34;&#60;stdin&#62;&#34;, line 1, in &#60;module&#62;&#10;UnicodeEncodeError: &#39;ascii&#39; codec can&#39;t encode characters in position 0-1: ordinal not in range(128)</span><br></pre></td></tr></table></figure></p>
<h3 id="u57FA_u672C_u7C7B_u578B_u76F8_u4E92_u8F6C_u6362"><a href="#u57FA_u672C_u7C7B_u578B_u76F8_u4E92_u8F6C_u6362" class="headerlink" title="基本类型相互转换"></a>基本类型相互转换</h3><p>下面这些函数用于转换数据类型(括号为参数,[]内的是可选参数):</p>
<table>
<thead>
<tr>
<th>函数</th>
<th>功能</th>
</tr>
</thead>
<tbody>
<tr>
<td>chr(a)</td>
<td>返回ASCII码对应的字符串</td>
</tr>
<tr>
<td>ord(x)</td>
<td>返回一个字符的Unicode值</td>
</tr>
<tr>
<td>complex(real[,imaginary])</td>
<td>将字符串或数字转为复数</td>
</tr>
<tr>
<td>float(x)</td>
<td>将数字或字符串转换为浮点数</td>
</tr>
<tr>
<td>int(x[,base])</td>
<td>将数字或字符串转换为一个整数,base为基数(进制)</td>
</tr>
<tr>
<td>hex(x)</td>
<td>将整数转换为十六进制数(字符串形式)</td>
</tr>
<tr>
<td>oct(x)</td>
<td>将整数转换为八进制数(字符串形式)</td>
</tr>
<tr>
<td>str(object)</td>
<td>把一个对象转换为字符串</td>
</tr>
<tr>
<td>list(x)</td>
<td>将序列对象转换为列表</td>
</tr>
<tr>
<td>tuple(x)</td>
<td>把序列对象转换为元组(Tuple)</td>
</tr>
<tr>
<td>type(x)</td>
<td>返回对象的数据类型</td>
</tr>
</tbody>
</table>
<p>这是一些示例:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>int(<span class="string">"123"</span>)</span><br><span class="line"><span class="number">123</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>str(<span class="number">1</span>) + str(<span class="number">1</span>)</span><br><span class="line"><span class="string">'11'</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>chr(<span class="number">61</span>)</span><br><span class="line"><span class="string">'='</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>ord(<span class="string">'A'</span>)</span><br><span class="line"><span class="number">65</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>float(<span class="number">23</span>)</span><br><span class="line"><span class="number">23.0</span></span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>complex(<span class="number">12</span>,<span class="number">3.4</span>)</span><br><span class="line">(<span class="number">12</span>+<span class="number">3.4j</span>)</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>list((<span class="number">12</span>,<span class="number">34</span>,<span class="number">56</span>)) <span class="comment">#参数是tuple</span></span><br><span class="line">[<span class="number">12</span>, <span class="number">34</span>, <span class="number">56</span>]</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>tuple([<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>]) <span class="comment">#参数是list</span></span><br><span class="line">(<span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>)</span><br></pre></td></tr></table></figure></p>
</content>
<summary type="html">
<h2 id="u4FDD_u7559_u5B57"><a href="#u4FDD_u7559_u5B57" class="headerlink" title="保留字"></a>保留字</h2><p>所谓保留字,就是在一种程序设计语言中,具有特殊含义的单词。<br><strong>它们不能作为变量名、函数名、对象名等标识符使用。</strong></p>
<p>要想查看当前版本的Python保留字列表,请使用下面的命令:<br><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="prompt">&gt;&gt;&gt; </span><span class="keyword">import</span> keyword</span><br><span class="line"><span class="prompt">&gt;&gt;&gt; </span>keyword.kwlist</span><br></pre></td></tr></table></figure></p>
</summary>
<category term="Python3教程" scheme="http://blog.moeoj.net/categories/Python3%E6%95%99%E7%A8%8B/"/>
<category term="Python" scheme="http://blog.moeoj.net/tags/Python/"/>
<category term="教程" scheme="http://blog.moeoj.net/tags/%E6%95%99%E7%A8%8B/"/>
</entry>
<entry>
<title>和我一起学Python3 第四节 输入与输出</title>
<link href="http://blog.moeoj.net/2016/01/11/%E5%92%8C%E6%88%91%E4%B8%80%E8%B5%B7%E5%AD%A6Python3-%E7%AC%AC%E5%9B%9B%E8%8A%82-%E8%BE%93%E5%85%A5%E4%B8%8E%E8%BE%93%E5%87%BA/"/>
<id>http://blog.moeoj.net/2016/01/11/和我一起学Python3-第四节-输入与输出/</id>
<published>2016-01-11T04:03:28.000Z</published>
<updated>2016-01-11T10:55:26.984Z</updated>
<content type="html"><p>“上课!起立!”</p>
<p>“老师好~”</p>
<p>“同学们好~请坐~”</p>
<p>好,今天我们来学习第一课:输入与输出</p>
<a id="more"></a>
<p>在开始之前,我们先讲一讲Python的两种模式:</p>
<h2 id="u547D_u4EE4_u4EA4_u4E92_u6A21_u5F0F"><a href="#u547D_u4EE4_u4EA4_u4E92_u6A21_u5F0F" class="headerlink" title="命令交互模式"></a>命令交互模式</h2><p>在Windows下,按Win徽标键+R,输入cmd,回车,打开命令提示符。</p>
<p>在你看到 C:\Users\你的用户名&gt; 的时候,输入 py -3 即可进入Python命令行。</p>
<p>Python的官方解释器(也叫做CPython)使用 <em>&gt;&gt;&gt;</em> 作为交互环境的提示符。此时输入Python语句,按下回车键,将会立即执行所输入的语句。</p>
<p>输入下面的语句,退出Python交互式命令行:</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">exit()</span><br></pre></td></tr></table></figure>
<p>在Arch linux中,你可以直接输入 python 进入此模式。</p>
<p>在其他的大多数Linux发行版、Mac OS X中,你可以输入 python3 进入此模式。</p>
<p>在这个模式中,你可以很方便的检验Python语句的正确性。学习Python的时候,打开一个Python交互命令窗口会对你很有帮助。</p>
<p><strong>听说大小写错误的话,电脑会爆掉的(~ ̄▽ ̄)~</strong></p>
<p>本教程后面的代码,如果开头有 &gt;&gt;&gt; 则表示在命令模式中执行。</p>
<h2 id="u811A_u672C_u6587_u4EF6_u6A21_u5F0F"><a href="#u811A_u672C_u6587_u4EF6_u6A21_u5F0F" class="headerlink" title="脚本文件模式"></a>脚本文件模式</h2><p>你可以把 Python 代码全都写在一个文件中,然后使用 Python 解释器执行它。</p>
<h3 id="u4F7F_u7528Linux_u3001Unix_u3001Mac_OS_X"><a href="#u4F7F_u7528Linux_u3001Unix_u3001Mac_OS_X" class="headerlink" title="使用Linux、Unix、Mac OS X"></a>使用Linux、Unix、Mac OS X</h3><p>在书写Python代码之前,建议加上这两行:</p>
<blockquote>
<p>#!/usr/bin/env python3</p>
<p>#conding:utf-8</p>
</blockquote>
<p>第一行是Unix系统的<strong>Hashbang</strong>(也叫作<strong>Shebang</strong>),表示此脚本使用 #! 后面指定的程序执行。</p>
<p>它的格式是这样子的:</p>
<blockquote>
<p>#! interpreter [optional-arg]</p>
</blockquote>
<p>在Arch Linux中,由于默认的Python解释器为Python3,你应该去掉末尾的3。</p>
<p>这样,当你在Linux/Unix/Mac OS X中执行这个Python脚本的时候,只需要输入:</p>
<blockquote>
<p>$ ./文件名.py</p>
</blockquote>
<p>就可以啦。(\$表示当前权限,请不要输入\$)</p>
<p>你也可以不写,使用下面的命令来运行:</p>
<blockquote>
<p>$ python3 ./文件名.py</p>
</blockquote>
<p>第二行表示此文件使用UTF-8编码。</p>
<p>像这样子写都是可以的:</p>
<blockquote>
<p># coding=编码名<br># -*- coding: 编码名 -*-<br># coding: 编码名<br><del># vim: set fileencoding=编码名 :</del></p>
</blockquote>
<p><strong>注意,它只能出现在第一行或者第二行。否则……嗯,你写了个注释。</strong></p>
<h3 id="u4F7F_u7528Windows"><a href="#u4F7F_u7528Windows" class="headerlink" title="使用Windows"></a>使用Windows</h3><p>Windows系统本身没有Hashbang。</p>
<p>不过,如果你使用Python3.3引入的 py 启动器的话,你可以这么写:</p>
<blockquote>
<p>#! python</p>
</blockquote>
<p>这表示使用Python2执行(如果你有的话)。</p>
<blockquote>
<p>#! python2.7</p>
</blockquote>
<p>这表示使用Python2.7执行。</p>
<blockquote>
<p>#! python2.6</p>
</blockquote>
<p>你一定看得懂!</p>
<blockquote>
<p>#! python3</p>
</blockquote>
<p>这会使用Python3.x的解释器执行。</p>
<p>你也可以通过Windows文件关联,双击一个Python脚本文件,直接启动。使用的解释器版本取决于你的Windows设置。如果你安装了Python3.3以上的版本,默认的文件关联下,#!是有效果的。</p>
<p>有效的扩展名如下:</p>
<ul>
<li>.py:Python脚本文件</li>
<li>.pyw:Python窗体脚本文件,不会出现大黑框</li>
<li>.pyc:编译成字节码的Python脚本文件</li>
<li>.pyo:编译并优化过后的Python脚本文件</li>
</ul>
<p>这是一个供参考的文件头:</p>
<blockquote>
<p>#! python3</p>
<p>#coding:utf-8</p>
</blockquote>
<h2 id="u8F93_u5165"><a href="#u8F93_u5165" class="headerlink" title="输入"></a>输入</h2><p>只有输出不好玩?好的,我们可以给程序加入一个功能,让用户可以输入数据。</p>
<p>使用input()函数来获取用户的输入:<br><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">input(<span class="string">'提示信息'</span>)</span><br></pre></td></tr></table></figure></p>
<p>input()函数将会返回用户所输入的文本信息。你需要使用一个变量来存储用户输入的文本。</p>
<p>请进入Python命令模式,输入 &gt;&gt;&gt; 后面的代码:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a = input(<span class="string">'type something:'</span>)</span><br></pre></td></tr></table></figure></p>
<p>此时你会看到 type something: 的提示,随意输入一些文字,然后按下回车。</p>
<p>然后输入下面的代码:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>a</span><br></pre></td></tr></table></figure></p>
<p>你将会看到刚才输入的文本。如下图:<br><img src="/images/python/4/input.png" alt="输入文本"></p>
<h2 id="u8F93_u51FA"><a href="#u8F93_u51FA" class="headerlink" title="输出"></a>输出</h2><p>使用print()函数可以在指定设备上输出文字。</p>
<p>在上两节课中,我们曾经写过一个 Hello World 程序:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(<span class="string">'你好,世界'</span>)</span><br></pre></td></tr></table></figure></p>
<p>它会输出’你好,世界’字样,然后换行。我们可以查询print()函数的用法:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>help(<span class="keyword">print</span>)</span><br></pre></td></tr></table></figure></p>
<p>得到的信息如下:<br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(...)&#10;&#12288;&#12288;print(value, ..., sep=&#39; &#39;, end=&#39;\n&#39;, file=sys.stdout, flush=False)&#10;&#10;&#12288;&#12288;Prints the values to a stream, or to sys.stdout by default.&#10;&#12288;&#12288;Optional keyword arguments:&#10;&#12288;&#12288;file: a file-like object (stream); defaults to the current sys.stdout.&#10;&#12288;&#12288;sep: string inserted between values, default a space.&#10;&#12288;&#12288;end: string appended after the last value, default a newline.&#10;&#12288;&#12288;flush: whether to forcibly flush the stream.</span><br></pre></td></tr></table></figure></p>
<p>我们只需要关注这些内容:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(要输出的内容, ... ,要输出的内容, sep=<span class="string">'两个内容之间的间隔符'</span>, end=<span class="string">'输出结束后输出的字符'</span>)</span><br></pre></td></tr></table></figure></p>
<p>如果你想输出不换行的文本,可以试试:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="prompt">&gt;&gt;&gt; </span>print(<span class="string">'你好~'</span>, end=<span class="string">''</span>)</span><br></pre></td></tr></table></figure></p>
<p>来,让我们来写一个完整的程序,请打开文本编辑器,写入下面的内容:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#! python3</span></span><br><span class="line"><span class="comment">#conding:utf-8</span></span><br><span class="line">名字 = input(<span class="string">'请输入您的尊姓大名:'</span>)</span><br><span class="line">print(<span class="string">'爱与正义的魔法少女'</span>, 名字, <span class="string">',闪亮登场!'</span>, sep=<span class="string">''</span>)</span><br><span class="line">input() <span class="comment"># Windows中直接双击运行时,可以用它来暂停查看结果</span></span><br></pre></td></tr></table></figure></p>
<p>请将文件保存为<strong>UTF-8</strong>编码,文件名为<strong>hello.py</strong>,然后<strong>双击</strong>它。<br>如果你使用Linux、Unix或Mac OS X,根据刚才讲过的内容,相信你已经知道该怎么做了。</p>
<p>运行结果如下:<br><img src="/images/python/4/print.png" alt="运行结果"><br>噗……</p>
<hr>
<p>好,这节课就上到这里,同学们,下课!<br>“哦~~!放学啦!放学啦!” </p>
</content>
<summary type="html">
<p>“上课!起立!”</p>
<p>“老师好~”</p>
<p>“同学们好~请坐~”</p>
<p>好,今天我们来学习第一课:输入与输出</p>
</summary>
<category term="Python3教程" scheme="http://blog.moeoj.net/categories/Python3%E6%95%99%E7%A8%8B/"/>
<category term="Python" scheme="http://blog.moeoj.net/tags/Python/"/>
<category term="教程" scheme="http://blog.moeoj.net/tags/%E6%95%99%E7%A8%8B/"/>
</entry>
<entry>
<title>和我一起学Python3 第三节 安装开发工具</title>
<link href="http://blog.moeoj.net/2016/01/10/%E5%92%8C%E6%88%91%E4%B8%80%E8%B5%B7%E5%AD%A6Python3-%E7%AC%AC%E4%B8%89%E8%8A%82-%E5%AE%89%E8%A3%85%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/"/>
<id>http://blog.moeoj.net/2016/01/10/和我一起学Python3-第三节-安装开发工具/</id>
<published>2016-01-10T12:05:21.000Z</published>
<updated>2016-01-11T06:00:40.138Z</updated>
<content type="html"><p>在安装了Python运行环境之后,我们还需要安装编写Python代码的工具。</p>
<a id="more"></a>
<p>你可以使用文本编辑器或集成开发环境来开发Python程序:</p>
<h2 id="u6587_u672C_u7F16_u8F91_u5668"><a href="#u6587_u672C_u7F16_u8F91_u5668" class="headerlink" title="文本编辑器"></a>文本编辑器</h2><p>你可以选择下列文本编辑器:</p>
<ul>
<li><a href="https://atom.io/" target="_blank" rel="external">Github Atom</a> + 插件</li>
<li><a href="http://www.vim.org/" target="_blank" rel="external">Vim</a> + 插件</li>
<li><a href="http://www.sublimetext.com/" target="_blank" rel="external">Sublime Text</a> + 插件(不付费有弹窗)</li>
<li><a href="https://notepad-plus-plus.org/" target="_blank" rel="external">Notepad++</a>(仅Windows,似乎智能提示比较一般,和其他编辑器比起来,只有文字编码这方面有优势)</li>
<li><a href="https://code.visualstudio.com/" target="_blank" rel="external">VSCode</a> + 插件</li>
</ul>
<p><strong>请勿使用“记事本”(Notepad)作为文本编辑器。</strong></p>
<p>因为记事本保存UTF-8编码的文件时,会在文件的头部加入一些奇♂怪的字符。这个字符叫做“ZERO WIDTH NO-BREAK SPACE”,写作“EF BB BF”,又称为<del>“BOOM”</del>“BOM”。UTF-8不需要BOM,有些程序例如早期版本的Firefox、PHP等并不能识别BOM,它可能会导致一些不可预测的问题。<del>比如电脑爆炸之类的。</del></p>
<p>作者使用的是Atom,这是一个跨平台的文本编辑器,需要安装三个插件:</p>
<blockquote>
<p>apm install autocomplete-plus-python-jedi<br>apm install autocomplete-python<br>apm install script</p>
</blockquote>
<p>前两个为自动补全插件,第三个可以在Atom中运行当前脚本。<br><img src="/images/python/3/atom-plugin.png" alt="Atom 插件安装"></p>
<p>作者:Atom有个缺点,打开太慢了……</p>
<p>在Atom中按Ctrl+Shift+L,输入Python,回车:<br><img src="/images/python/3/atom-language.png" alt="Atom 语言选择"><br>它就具有了智能提示和代码补全。<br><img src="/images/python/3/atom-test1.png" alt="Atom 智能提示"><br>试着输入try,按Tab键可以自动补全代码:<br><img src="/images/python/3/atom-test2.png" alt="Atom 代码补全"><br>按下Crtl+Shift+B即可运行:<br><img src="/images/python/3/atom-test3.png" alt="Atom 运行脚本"></p>
<h2 id="IDE"><a href="#IDE" class="headerlink" title="IDE"></a>IDE</h2><p>文本编辑器只是用来写代码的程序,如果你需要使用更高级的,例如更详细的提示、自动编译、项目管理、调试等功能,可以使用集成开发环境。</p>
<p>你可以选择这些IDE:</p>
<ul>
<li><a href="http://www.eclipse.org/" target="_blank" rel="external">Eclipse</a> + <a href="http://www.pydev.org/" target="_blank" rel="external">PyDev</a></li>
<li><a href="http://www.jetbrains.com/pycharm/" target="_blank" rel="external">PyCharm</a>(最佳)</li>
<li><a href="https://www.visualstudio.com/" target="_blank" rel="external">Visual Studio 2015</a>(体积巨大)</li>
</ul>
<p>PyCharm是非常优秀的IDE,有社区版(免费)和专业版(收费)。除了需要占用巨大的内存(23333),其他方面都是杠杠的。推荐使用8GB内存+SSD来运行它。</p>
<p>如果你要使用VS2015来开发Python,请在安装时勾选这个选项:<br><img src="/images/python/3/vs2015.png" alt="VS 2015 安装Python开发工具"></p>
<hr>
<p>PS:其实作者最常用的是Notepad++,因为打开快……</p>
</content>
<summary type="html">
<p>在安装了Python运行环境之后,我们还需要安装编写Python代码的工具。</p>
</summary>
<category term="Python3教程" scheme="http://blog.moeoj.net/categories/Python3%E6%95%99%E7%A8%8B/"/>
<category term="Python" scheme="http://blog.moeoj.net/tags/Python/"/>
<category term="教程" scheme="http://blog.moeoj.net/tags/%E6%95%99%E7%A8%8B/"/>
</entry>
<entry>
<title>和我一起学Python3 第二节 开始前的准备工作</title>
<link href="http://blog.moeoj.net/2016/01/10/%E5%92%8C%E6%88%91%E4%B8%80%E8%B5%B7%E5%AD%A6Python3-%E7%AC%AC%E4%BA%8C%E8%8A%82-%E5%BC%80%E5%A7%8B%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C/"/>
<id>http://blog.moeoj.net/2016/01/10/和我一起学Python3-第二节-开始前的准备工作/</id>
<published>2016-01-10T06:01:57.000Z</published>
<updated>2016-01-11T06:00:40.143Z</updated>
<content type="html"><p>Python是跨平台的,它可以运行在Windows、Linux/Unix和Mac系统上。</p>
<p>在开始学习Python之前,首先需要安装Python的运行环境。</p>
<a id="more"></a>
<h2 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h2><p>如果你使用Linux,作者认为你应该具有一定的使用经验。</p>
<p>主流的Linux发行版都自带了Python。如果你使用的是Arch Linux的话,那么,默认的Python解释器版本就是Python3。</p>
<p>在Debian、Ubuntu等发行版中,你可以使用Python命令进入Python2的交互环境,使用Python3命令来进入Python3的交互环境。它们对应的包管理命令是pip和pip3。</p>
<p>使用下面的命令安装pip:</p>
<blockquote>
<p>sudo apt-get install python-pip python3-pip</p>
</blockquote>
<p>如果你使用的是CentOS这一类发行版,你需要编译安装Python3。为了确保标准库完整可用,建议你在编译前安装openssl等系统库。</p>
<p>如果你不知道怎么安装,下面是一些提示:</p>
<blockquote>
<p>wget<br>tar zxvf<br>cd<br>./configure<br>make &amp;&amp; make install</p>
</blockquote>
<p>你可以使用Python的easy_install来安装pip。</p>
<p>如果你仍然不知道如何安装,建议使用Windows操作系统。</p>
<h2 id="Mac_OS_X"><a href="#Mac_OS_X" class="headerlink" title="Mac OS X"></a>Mac OS X</h2><p>在<a href="https://www.python.org/" target="_blank" rel="external">Python官网</a>上找到相应的版本并安装。请<a href="https://www.python.org/ftp/python/3.5.1/python-3.5.1-macosx10.6.pkg" target="_blank" rel="external">点击这里下载</a>并安装。</p>
<h2 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h2><p>根据你的Windows版本(32位或64位),在<a href="https://www.python.org/" target="_blank" rel="external">Python官网</a>上选择合适的安装程序,下载它。</p>
<ul>
<li><a href="https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe" target="_blank" rel="external">32位点此下载</a></li>
<li><a href="https://www.python.org/ftp/python/3.5.1/python-3.5.1-amd64.exe" target="_blank" rel="external">64位点此下载</a></li>
</ul>
<p>然后运行刚才下载的安装程序:<br><img src="/images/python/2/install.jpg" alt="安装界面"><br>就是这么简单。</p>
<p>按 Win徽标键+R ,输入cmd,回车,打开命令提示符。</p>
<p>如果你没有安装Python2,你可以直接在命令行中输入Python来进入Python交互环境,使用pip来管理Python包。</p>
<p>如果你在安装Python2之后安装Python3:</p>
<blockquote>
<p>py -2</p>
</blockquote>
<p>可以进入Python2</p>
<blockquote>
<p>py -3</p>
</blockquote>
<p>可以进入Python3</p>
<blockquote>
<p>pip</p>
</blockquote>
<p>可以管理Python2的包</p>
<blockquote>
<p>pip3<br>pip3.5</p>
</blockquote>
<p>可以管理Python3的包</p>
<p>最后,让我们一起写一个“Hello World”程序:<br>在命令行中输入py -3<br>当出现&gt;&gt;&gt;符号时,输入:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">print(<span class="string">'你好,世界'</span>)</span><br></pre></td></tr></table></figure></p>
<p>你将会看到:<br><img src="/images/python/2/helloworld.png" alt="Hello World"><br>嗯,你已经学会了Python,哈哈。</p>
</content>
<summary type="html">
<p>Python是跨平台的,它可以运行在Windows、Linux/Unix和Mac系统上。</p>
<p>在开始学习Python之前,首先需要安装Python的运行环境。</p>
</summary>
<category term="Python3教程" scheme="http://blog.moeoj.net/categories/Python3%E6%95%99%E7%A8%8B/"/>
<category term="Python" scheme="http://blog.moeoj.net/tags/Python/"/>
<category term="教程" scheme="http://blog.moeoj.net/tags/%E6%95%99%E7%A8%8B/"/>
</entry>
<entry>
<title>和我一起学Python3 第一节 前言</title>
<link href="http://blog.moeoj.net/2016/01/09/%E5%92%8C%E6%88%91%E4%B8%80%E8%B5%B7%E5%AD%A6Python3-%E7%AC%AC%E4%B8%80%E8%8A%82-%E5%89%8D%E8%A8%80/"/>
<id>http://blog.moeoj.net/2016/01/09/和我一起学Python3-第一节-前言/</id>
<published>2016-01-09T03:12:00.000Z</published>
<updated>2016-01-11T06:00:40.129Z</updated>
<content type="html"><h2 id="Python__u7B80_u4ECB"><a href="#Python__u7B80_u4ECB" class="headerlink" title="Python 简介"></a>Python 简介</h2><p> Python是一种程序设计语言。在应用广泛的各种语言中,Python可能是最容易学习和使用的语言,它易于阅读和理解,语法简洁清晰,表达力强。使用Python编写程序,所需要的代码量要远少于C++、Java之类的语言。</p>
<a id="more"></a>
<p> Python的作者,Guido von Rossum,荷兰人。1989年他为了打发圣诞节假期,开始开发Python语言的编译/解释器。Python这个名字源于当时他正在看的英国电视剧《Monty Python’s Flying Circus》。他希望这个语言能实现他的理念:易学易用,介于C和Shell之间,功能全面,可扩展的语言。</p>
<p> 使用Python编写程序时,一般无需关心计算机的工作机制,只需要将精力放在程序逻辑上。它的历史比Java悠久,具有广泛的应用。这种语言的用户不仅仅是计算机专家,还有计算机爱好者、学生(包括文科生)、科学家、工程师。如果你想掌握一种编程语言,用来快速实现想法或者让计算机自动完成一些工作,Python是一个不错的选择。</p>
<p> Python是面向对象的程序设计语言。当然,你也可以用于面向过程的程序设计,甚至是一定程度的函数式编程。Python的强大之处在于它拥有一个强大的标准库,只需要几行代码,你就可以完成文件下载、压缩解压、网络通信、建立Web服务器等等看起来非常<del>装逼</del>强大的功能。</p>
<p> 当然,开发效率和运行效率往往不可兼得。Python的缺点就是运行效率低。如果一个C语言程序运行需要1秒,Java需要2秒,而Python可能需要100~200秒。[1] 不过,在大多数使用场合,这样的运行效率已经足够了。</p>
<p> Python的第三方库中,有一部分使用C语言编写而成,它们的运行效率并不低。如果你需要完成一些计算量庞大的任务,可以使用C、C++来编写动态链接库,甚至使用CUDA、OpenCL利用GPU完成计算。</p>
<h2 id="Python2__u4E0E_Python3"><a href="#Python2__u4E0E_Python3" class="headerlink" title="Python2 与 Python3"></a>Python2 与 Python3</h2><p> 去年,作者学习并使用了Python2.7。Python2.x和Python3.x之间存在许多差异,所以Python2.x的库和代码不能直接用于Python3.x。在使用Python2.7的过程中,作者发现Python2.7有一些坑爹的地方,例如:<br><img src="/images/python/1/2vs3.png" alt="Python2和3的差异"></p>
<p> 其实许多问题是历史遗留问题,是设计上的失误。这些问题在Python3中被修复了。由于许多公司的老项目迁移到Python3需要巨大的成本,所以短期内Python2依然是主流。但Python2已经停止了新特性的开发,目前的更新主要为修复BUG。并且,许多第三方库陆续支持了Python3。对于初学者,学习Python3可以绕过许多Python2的坑,不会被Python2的种种缺陷所困扰,并且还可以直接使用Python3的新特性。[2] 总之,Python3学起来爽,用起来更爽。</p>
<p> 如果你现在不会Python,或许,当你真正用Python来工作的时候,Python3已经是主流了。</p>
<p> 因为作者平时使用Python写的都是一些自己使用的程序,于是打算学习更好用的Python3。作者决定:一边学习,一边编写教程。</p>
<p> 什么情况下应该选择Python2呢:</p>
<ul>
<li>你要使用的库只能在Python2.x中工作</li>
<li>你被强制使用Python2.x</li>
<li>你使用的运行环境仅提供Python2.x</li>
</ul>
<p> Python2的语法和Python3相似,在需要的时候,学会了Python2可以快速掌握Python3,反之亦如此。只需了解两者的区别即可。[3]</p>
<p> 如果你有这样的疑问:为了工作,应该学Python2还是Python3?</p>
<p> 答案是:都学。</p>
<p> 其实两者的差距没有想象中的那么大。</p>
<p> 截止至本文写作时,Python2的最新版本是2.7.11,Python3的最新版本是3.5.1。</p>
<hr>
<p>[1]: Python3比Python2还要慢。<br>[2]: Python2中可以通过__future__模块来使用新特性。<br>[3]: 会遇到好多坑</p>
</content>
<summary type="html">