-
Notifications
You must be signed in to change notification settings - Fork 9
/
02_CT_Python_training-chinese.Rmd
4200 lines (2710 loc) · 100 KB
/
02_CT_Python_training-chinese.Rmd
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
# Python 教程 {#py3_ct}
陈同 ([email protected])
欢迎来到Python的世界,本教程将带你遨游`Python`,领悟`Python`的魅力。本教程专注于帮助初学者,尤其是生物信息分析人员快速学会`Python`的常用功能和使用方式,因此只精选了部分`Python`的功能,请额外参考Python经典教程[A byte of python](http://www.byteofpython.info/)和它的[中文版](http://woodpecker.org.cn/abyteofpython_cn/chinese/index.html) 来更好的理解*Python*. 本文档的概念和文字描述参考了A byte of python(中文版),特此感谢。
本教程在`2017年12月25日`更新到`Python3`版本。
This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.0/">Creative Commons Attribution-NonCommercial-ShareAlike 2.0 Generic License</a>.
欢迎访问我们的视频课程 <https://bioinfo.ke.qq.com>。
## 背景介绍
### 编程开篇
A:最近在看什么书?
B:编程。
A:沈从文的那本啊。
B:……
<img src="D:/project/GitHub/PBR_training/Image/biancheng.jpg"></img>
---
C:最近在学一门新语言,Python。
D:那是哪个国家的语言?
C:……
### 为什么学习Python
* 语法简单
Python语言写作的程序就像自然语言构建的伪代码一样,“所见即所想”。读`Python`代码就像读最简单的英文短文一样,写`Python`代码比写英文文章都要简单,“所想即所写”。很多刚学习`Python`的朋友都觉得很不可思议,原来怎么想怎么写出来就对了。
* 功能强大
现在程序语言的发展已经很成熟,每一种程序语言都能实现其它程序语言的全部功能。因此就程序语言本身来讲,功能都相差不大。`Python`语言的功能强大在于其活跃的社区和强大的第三方模块支持,使其作为科学计算的能力越来越强。
* 可扩展性好
能与C完美的融合,加快运行速度。可用加速模块有`Cython`, `PyPy`, `Pyrex`, `Psyco`等.
### Python常用包
1. 科学计算 `Numpy`, `SciPy` (也是安装python包的拦路虎直到有了[conda](http://mp.weixin.qq.com/s/A4_j8ZbyprMr1TT_wgisQQ))
2. 类比于R的数据框操作包 [Pandas](http://mp.weixin.qq.com/s/1h-_J2NKjD1KyymPAeHPOg)
3. 可视化工具 `Seaborn` (配合pandas), `matplotlib` (类比MATLAB), `plotly` (交互式绘图), `ggplot` (类比ggplot2)
4. 网站开发 `web.py`, `Django`, `Flask`
5. 任务调度和流程管理 `Airflow` (pipeline首选)
6. 机器学习 `scikit-learn` (经典), `PyML`, `Tensorflow` (谷歌释放), `pylearn2`, `Orange` (图形界面的机器学习包)
7. 网页抓取 `Beautiful Soup`,`requests`,
8. 可重复编程 `Jupyter`
9. 正则表达式 `re`
### 怎么学习Python
编程就像拼乐高,需要我们知道每个组分的特征以便在需要时可以使用,也需要脑袋中有个蓝图知道每一步要做什么,二者结合,就可以拼出你想要的世界。
在我看来,学习编程是**学以致用**,学习方式是**硬着头皮**去读,去写。
* 多读经典书籍
首先从概念和理论上了解程序设计或Python程序设计,多读。书读百遍其义自见。
* 多做练习
任何练习题都可以,先易后难。如果能找到专业相关的,更好。
* 多读代码
多读优秀的代码,矫正自己的习惯和思维。
### Python学习的几个阶段
```{r}
knitr::include_graphics("coding_is_hard_confidence_competence.png")
```
(图例“编程信心与能力”:纵轴为信心值,横轴为能力水平,虚线从左至右依次分割出手牵手蜜月期、混沌悬崖、绝望沙漠、令人兴奋的上升期四个阶段,第5条虚线标志着工作准备就绪)
* 读文档是蜜月期,读读就过去,谁都会。
* 写程序是混沌悬崖,知道是这么回事,就是写不出来;
* 调程序是绝望沙漠,怎么看自己写的都对,就是编译器不开眼;
* 程序正确了就是兴奋期,万里长征迈出又一步。
### 如何安装Python
Python社区有很多功能很好的包,但逐个安装需要解决繁杂的依赖关系。通常我会推荐安装已经做好的集成包,一劳永逸的解决后续问题。[Anaconda](https://store.continuum.io/cshop/anaconda/)是最优先推荐的分发包,集成了常用的数值计算、图形处理、可视化等工具包如`IPython`, `matplotlib`, `numpy`, `scipy`, 而且设定了更简单的安装Python模块的方法,可以节省大量的安装时间。
#### Python 常用包
1. 科学计算 `Numpy`, `SciPy` (也是安装python包的拦路虎直到有了[conda](http://mp.weixin.qq.com/s/A4_j8ZbyprMr1TT_wgisQQ))
2. 类比于R的数据框操作包 [Pandas](http://mp.weixin.qq.com/s/1h-_J2NKjD1KyymPAeHPOg)
3. 可视化工具 `Seaborn` (配合pandas), `matplotlib` (类比MATLAB), `plotly` (交互式绘图), `ggplot` (类比ggplot2)
4. 网站开发 `web.py`, `Django`, `Flask`
5. 任务调度和流程管理 `Airflow` (pipeline首选)
6. 机器学习 `scikit-learn` (经典), `PyML`, `Tensorflow` (谷歌释放), `pylearn2`, `Orange` (图形界面的机器学习包)
7. 网页抓取 `Beautiful Soup`,`requests`,
8. 可重复编程 `Jupyter`
9. 正则表达式 `re`
### 如何运行Python命令和脚本
* 对于初学者,本手册推荐直接在`Jupyter Notebook`下学习`Python`命令和脚本。我们这套教程也是用`Jupyter Notebook`写作而成,里面的代码可以随时修改和运行,并能同时记录你的脚本和输出,符合现在流行的“可重复性计算”的概念。
* Linux/Unix用户直接在终端(Terminal)进入你的目标文件夹`cd /working_dir`[回车],然后在终端输入`Jupyter notebook`[回车]即可启动`Jupyter notebook`。
* Windows用户可以新建一个`Jupyter_notebook.bat`文件(新建一个txt文件,写入内容后修改后缀为`.bat`。若不能修改后缀,请Google搜索“Window是如何显示文件扩展名”),并写入以下内容(注意把前两行的*盘符*和*路径*替换为你的工作目录),双击即可运行。
```
D:
cd PBR_training
jupyter notebook
pause
```
* `Jupyter notebook`启动后会打开默认的浏览器(需要在图形用户界面下工作),这时可以`新建`或`打开`相应路径下的ipynb文件。
* 对于LInux或Unix用户,直接在终端输入 `python` 然后回车即可打开交互式`python`解释器,如下图所示。在这个解释器了敲入任何合法的`python`语句即可执行。此外,所有的命令还可以存储到一个文件一起执行,如下图所示。我们有一个包含`python`程序的文件`test.py`,我们只要在终端输入`python test.py`并回车就可以运行这个文件。同时我们也可在终端通过输入`chmod 755 test.py`赋予程序`test.py`可执行权限,并在终端输入`./test.py`运行`Python`脚本。更多Linux下的高级使用和Linux命令使用请见教程Bash_training-chinese.ipynb。
```{r}
knitr::include_graphics("Python_start_run_linux.png")
```
* 对于Windows用户,可以通过“Windows键+R”调出“Run”窗口并输入“cmd”打开Windows命令解释器,输入`python`即可打开交互式`python`解释器。同时也可以双击安装后的软件的快捷方式打开图形界面的`Python`解释器,可以处理交互式命令和导入Python文件并执行。
* 对于交互式`Python`解释器,在使用结束后,通过键盘组合键`Ctrl-d` (Linux/Unix)或`Ctrl-z` (Windows)关闭。
### 使用什么编辑器写Python脚本
在你学成之后,可能主要操作都在服务器完成,而且日常工作一般会以脚本的形式解决。我个人推荐使用[Vim](http://www.vim.org/download.php)来写作Python脚本。
Linux下`vim`的配置文件可从[我的 github](https://github.com/Tong-Chen/vim)下载,Windows版可从[我的百度云](http://pan.baidu.com/s/1kT5KIN1) 下载。
## Python程序事例
```python
## 假如我们有如下FASTA格式的文件,我们想把多行序列合并为一行,怎么做?
for line in open("data/test2.fa"):
print(line.strip())
```
>NM_001011874 gene=Xkr4 CDS=151-2091
gcggcggcgggcgagcgggcgctggagtaggagctggggagcggcgcggccggggaaggaagccagggcg
aggcgaggaggtggcgggaggaggagacagcagggacaggTGTCAGATAAAGGAGTGCTCTCCTCCGCTG
CCGAGGCATCATGGCCGCTAAGTCAGACGGGAGGCTGAAGATGAAGAAGAGCAGCGACGTGGCGTTCACC
CCGCTGCAGAACTCGGACAATTCGGGCTCTGTGCAAGGACTGGCTCCAGGCTTGCCGTCGGGGTCCGGAG
>NM_001195662 gene=Rp1 CDS=55-909
AAGCTCAGCCTTTGCTCAGATTCTCCTCTTGATGAAACAAAGGGATTTCTGCACATGCTTGAGAAATTGC
AGGTCTCACCCAAAATGAGTGACACACCTTCTACTAGTTTCTCCATGATTCATCTGACTTCTGAAGGTCA
AGTTCCTTCCCCTCGCCATTCAAATATCACTCATCCTGTAGTGGCTAAACGCATCAGTTTCTATAAGAGT
GGAGACCCACAGTTTGGCGGCGTTCGGGTGGTGGTCAACCCTCGTTCCTTTAAGACTTTTGACGCTCTGC
TGGACAGTTTATCCAGGAAGGTACCCCTGCCCTTTGGGGTAAGGAACATCAGCACGCCCCGTGGACGACA
CAGCATCACCAGGCTGGAGGAGCTAGAGGACGGCAAGTCTTATGTGTGCTCCCACAATAAGAAGGTGCTG
>NM_011283 gene=Rp1 CDS=128-6412
AATAAATCCAAAGACATTTGTTTACGTGAAACAAGCAGGTTGCATATCCAGTGACGTTTATACAGACCAC
ACAAACTATTTACTCTTTTCTTCGTAAGGAAAGGTTCAACTTCTGGTCTCACCCAAAATGAGTGACACAC
CTTCTACTAGTTTCTCCATGATTCATCTGACTTCTGAAGGTCAAGTTCCTTCCCCTCGCCATTCAAATAT
CACTCATCCTGTAGTGGCTAAACGCATCAGTTTCTATAAGAGTGGAGACCCACAGTTTGGCGGCGTTCGG
GTGGTGGTCAACCCTCGTTCCTTTAAGACTTTTGACGCTCTGCTGGACAGTTTATCCAGGAAGGTACCCC
TGCCCTTTGGGGTAAGGAACATCAGCACGCCCCGTGGACGACACAGCATCACCAGGCTGGAGGAGCTAGA
GGACGGCAAGTCTTATGTGTGCTCCCACAATAAGAAGGTGCTGCCAGTTGACCTGGACAAGGCCCGCAGG
CGCCCTCGGCCCTGGCTGAGTAGTCGCTCCATAAGCACGCATGTGCAGCTCTGTCCTGCAACTGCCAATA
TGTCCACCATGGCACCTGGCATGCTCCGTGCCCCAAGGAGGCTCGTGGTCTTCCGGAATGGTGACCCGAA
>NM_0112835 gene=Rp1 CDS=128-6412
AATAAATCCAAAGACATTTGTTTACGTGAAACAAGCAGGTTGCATATCCAGTGACGTTTATACAGACCAC
ACAAACTATTTACTCTTTTCTTCGTAAGGAAAGGTTCAACTTCTGGTCTCACCCAAAATGAGTGACACAC
CTTCTACTAGTTTCTCCATGATTCATCTGACTTCTGAAGGTCAAGTTCCTTCCCCTCGCCATTCAAATAT
CACTCATCCTGTAGTGGCTAAACGCATCAGTTTCTATAAGAGTGGAGACCCACAGTTTGGCGGCGTTCGG
GTGGTGGTCAACCCTCGTTCCTTTAAGACTTTTGACGCTCTGCTGGACAGTTTATCCAGGAAGGTACCCC
TGCCCTTTGGGGTAAGGAACATCAGCACGCCCCGTGGACGACACAGCATCACCAGGCTGGAGGAGCTAGA
GGACGGCAAGTCTTATGTGTGCTCCCACAATAAGAAGGTGCTGCCAGTTGACCTGGACAAGGCCCGCAGG
CGCCCTCGGCCCTGGCTGAGTAGTCGCTCCATAAGCACGCATGTGCAGCTCTGTCCTGCAACTGCCAATA
TGTCCACCATGGCACCTGGCATGCTCCGTGCCCCAAGGAGGCTCGTGGTCTTCCGGAATGGTGACCCGAA
```python
aDict = {}
for line in open('data/test2.fa'):
if line[0] == '>':
key = line.strip()
aDict[key] = []
else:
aDict[key].append(line.strip())
##------------------------------------------
for key, valueL in list(aDict.items()):
print(key)
print(''.join(valueL))
```
>NM_001011874 gene=Xkr4 CDS=151-2091
gcggcggcgggcgagcgggcgctggagtaggagctggggagcggcgcggccggggaaggaagccagggcgaggcgaggaggtggcgggaggaggagacagcagggacaggTGTCAGATAAAGGAGTGCTCTCCTCCGCTGCCGAGGCATCATGGCCGCTAAGTCAGACGGGAGGCTGAAGATGAAGAAGAGCAGCGACGTGGCGTTCACCCCGCTGCAGAACTCGGACAATTCGGGCTCTGTGCAAGGACTGGCTCCAGGCTTGCCGTCGGGGTCCGGAG
>NM_001195662 gene=Rp1 CDS=55-909
AAGCTCAGCCTTTGCTCAGATTCTCCTCTTGATGAAACAAAGGGATTTCTGCACATGCTTGAGAAATTGCAGGTCTCACCCAAAATGAGTGACACACCTTCTACTAGTTTCTCCATGATTCATCTGACTTCTGAAGGTCAAGTTCCTTCCCCTCGCCATTCAAATATCACTCATCCTGTAGTGGCTAAACGCATCAGTTTCTATAAGAGTGGAGACCCACAGTTTGGCGGCGTTCGGGTGGTGGTCAACCCTCGTTCCTTTAAGACTTTTGACGCTCTGCTGGACAGTTTATCCAGGAAGGTACCCCTGCCCTTTGGGGTAAGGAACATCAGCACGCCCCGTGGACGACACAGCATCACCAGGCTGGAGGAGCTAGAGGACGGCAAGTCTTATGTGTGCTCCCACAATAAGAAGGTGCTG
>NM_011283 gene=Rp1 CDS=128-6412
AATAAATCCAAAGACATTTGTTTACGTGAAACAAGCAGGTTGCATATCCAGTGACGTTTATACAGACCACACAAACTATTTACTCTTTTCTTCGTAAGGAAAGGTTCAACTTCTGGTCTCACCCAAAATGAGTGACACACCTTCTACTAGTTTCTCCATGATTCATCTGACTTCTGAAGGTCAAGTTCCTTCCCCTCGCCATTCAAATATCACTCATCCTGTAGTGGCTAAACGCATCAGTTTCTATAAGAGTGGAGACCCACAGTTTGGCGGCGTTCGGGTGGTGGTCAACCCTCGTTCCTTTAAGACTTTTGACGCTCTGCTGGACAGTTTATCCAGGAAGGTACCCCTGCCCTTTGGGGTAAGGAACATCAGCACGCCCCGTGGACGACACAGCATCACCAGGCTGGAGGAGCTAGAGGACGGCAAGTCTTATGTGTGCTCCCACAATAAGAAGGTGCTGCCAGTTGACCTGGACAAGGCCCGCAGGCGCCCTCGGCCCTGGCTGAGTAGTCGCTCCATAAGCACGCATGTGCAGCTCTGTCCTGCAACTGCCAATATGTCCACCATGGCACCTGGCATGCTCCGTGCCCCAAGGAGGCTCGTGGTCTTCCGGAATGGTGACCCGAA
>NM_0112835 gene=Rp1 CDS=128-6412
AATAAATCCAAAGACATTTGTTTACGTGAAACAAGCAGGTTGCATATCCAGTGACGTTTATACAGACCACACAAACTATTTACTCTTTTCTTCGTAAGGAAAGGTTCAACTTCTGGTCTCACCCAAAATGAGTGACACACCTTCTACTAGTTTCTCCATGATTCATCTGACTTCTGAAGGTCAAGTTCCTTCCCCTCGCCATTCAAATATCACTCATCCTGTAGTGGCTAAACGCATCAGTTTCTATAAGAGTGGAGACCCACAGTTTGGCGGCGTTCGGGTGGTGGTCAACCCTCGTTCCTTTAAGACTTTTGACGCTCTGCTGGACAGTTTATCCAGGAAGGTACCCCTGCCCTTTGGGGTAAGGAACATCAGCACGCCCCGTGGACGACACAGCATCACCAGGCTGGAGGAGCTAGAGGACGGCAAGTCTTATGTGTGCTCCCACAATAAGAAGGTGCTGCCAGTTGACCTGGACAAGGCCCGCAGGCGCCCTCGGCCCTGGCTGAGTAGTCGCTCCATAAGCACGCATGTGCAGCTCTGTCCTGCAACTGCCAATATGTCCACCATGGCACCTGGCATGCTCCGTGCCCCAAGGAGGCTCGTGGTCTTCCGGAATGGTGACCCGAA
## Python语法
### 层级缩进
* 合适的缩进。空白在Python中是很重要的,它称为缩进。在逻辑行首的空白(空格和制表符)用来决定逻辑行的缩进层次,从而用来决定语句的分组。这意味着同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。通常的缩进为4个空格, 在`Jupyter Notebook`中为一个`Tab`键。
从下面这两个例子可以看出错误的缩进类型和对应的提示。
* "unexpected indent" 表示在不该出现空白的地方多了空白,并且指出问题出在第三行(line 3)。
* "expected an indented block" 表示应该有缩进的地方未缩进,也指出了问题所在行。
* "unindent does not match any outer indentation level" 表示缩进出现了不一致,问题通常会在指定行**及其前面的行**。
```python
print("不合适的缩进会引发错误,b前不该有的缩进")
a = 'No indent'
b = '我前面有个空格……'
```
File "<ipython-input-2-ff110daefedf>", line 3
b = '我前面有个空格……'
^
IndentationError: unexpected indent
```python
print("不合适的缩进,print是for的子语句,应该有缩进,却漏掉了")
a = [1,2,3]
for i in a:
print "我应该被缩进,我从属于for循环!!!\n"
```
File "<ipython-input-3-84bbc644895e>", line 5
print "我应该被缩进,我从属于for循环!!!\n"
^
IndentationError: expected an indented block
```python
a = [1,2, 3]
if a:
for i in a:
print(i)
print(i + 1,
"为什么我的缩进跟其它行不一样呢,我的空格被谁吃了?")
print(i + 1,
"为什么我的缩进跟其它行不一样呢,谁给了我个空格?")
```
File "<tokenize>", line 5
print(i + 1,
^
IndentationError: unindent does not match any outer indentation level
### Python作为计算器的使用
Python中可以进行基本的数学运算,与小学中学过的一样,加减乘除取余数等,需要注意的是运算符的优先级。
```python
2 + 2
```
4
```python
2 + 3 +5
```
10
```python
2 + 3 * 5
```
17
```python
(2 + 3) * 5
```
25
```python
## 整除
23 // 7
```
3
```python
## 取余数
23 % 7
```
2
#### 第一个小程序
```python
print("Hello, Python!")
```
Hello, Python!
```python
myname = input("Your name: ")
print("Hello", myname)
```
Your name: CT
Hello CT
### 变量、数据结构、流程控制
我们先看一个动图展示内存中变量的赋值、存储、值的改变和程序的运行。
点击访问动图 <http://www.ehbio.com/ehbio_resource/python_tutor.gif>
* 常量,指固定的数字或字符串,如`2`, `2.9`, `"Hello world"`等。
* 变量,存储了数字或字符串的事物称为变量,它可以被赋值或被修改。简单的可以理解为变量是一个盒子,你可以把任何东西放在里面,通过盒子的名字来取出盒子内的东西。
* 数值变量:存储了数的变量。
* 字符串变量:存储了字符串的变量。字符串变量的名字最好不为`str`,可以使用`aStr`。
* 列表 (list): list是处理一组*有序*项目的数据结构,即你可以在一个列表中存储一个 *序列* 的项目。假想你有一个购物列表,上面记载着你要买的东西,你就容易理解列表了。只不过在你的购物表上,可能每样东西都独自占有一行,而在Python中,你在每个项目之间用逗号分割。列表中的项目应该包括在**方括号**中,这样Python就知道你是在指明一个列表。一旦你创建了一个列表,你可以添加、删除或是搜索列表中的项目。由于你可以增加或删除项目,我们说列表是 *可变的* 数据类型,即这种类型是可以被改变的。列表变量的名字最好不为`list`,可以使用`aList`。
* 元祖 (tuple):元组和列表十分类似,但是不可修改。元组通过**圆括号中用逗号分割的项目**定义。元组通常用在使语句或用户定义的函数能够安全地采用一组值的时候,即被使用的元组的值不会改变。元组变量的名字最好不为`tuple`,可以使用`aTuple`。
* 集合 (Set):也与列表类似,但是元素不可重复。通常用来去除重复、求交集、并集等。而且集合的查询速度远远快于列表,可以用来提高运算速度。
* 字典 (dict): 字典类似于你通过联系人名字查找地址和联系人详细情况的地址簿,即,我们把键(名字)和值(详细情况)联系在一起。注意,键必须是唯一的,就像如果有两个人恰巧同名的话,你无法找到正确的信息。多个键可以指向同一个值。当一个键需要指向多个值时,这些值需要放在列表、元组或字典里面。注意,你只能使用不可变的对象(字符串,数字,元组)来作为字典的键,但是可以用不可变或可变的对象作为字典的值。键值对在字典中以这样的方式标记:d = {key1 : value1, key2 : value2 }。注意它们的键/值对用冒号分割,而各个对用逗号分割,所有这些都包括在**花括号**中。记住字典中的键/值对是没有顺序的。如果你想要一个特定的顺序,那么你应该在使用前自己对它们排序。列表变量的名字最好不为`dict`,可以使用`aDict`。
* 序列:列表、元组、字符串都是一种序列格式。同时还可以使用range来产生序列。序列的两个主要操作时*索引操作*和*切片操作*。
* 标示符
* 变量的名字被称为标示符。标识符对大小写敏感,第一个字符必须是字母表中的字母(大写或小写)或者一个下划线(\_),其它部分额外包含数字。有效的标示符有: `abc`, `_abc`, `a_b_2`, `__23`等。无效的标示符有: `2a`, `3b`。
* 标示符最好不使用Python内置的关键字,如`str`, `list`, `int`, `def`, `split`, `dict`等。
* 标示符最好能言词达意,即展示变量的类型,又带有变量的实际含义。如`line`表示文件的一行,`lineL`表示存有从文件读入的每一行的列表。
* 控制流
* `if`语句
`if`语句用来检验一个条件,如果条件为真,我们运行一块语句(称为 `if-块`),否则我们处理另外一块语句(称为 `else-块`)。`else` 从句是可选的。如果有多个条件,中间使用`elif`。
举个例子:“买五个包子,如果看到卖西瓜的,买一个”——最后程序猿买了一个包子”
```
买包子 = 5
if 看到卖西瓜的:
买包子 = 1
```
* `For`语句
for..in是一个循环语句,它在一序列的对象上递归,即逐一使用队列中的每个项目。
* `While`语句
只要在一个条件为真的情况下,`while`语句允许你重复执行一块语句。`while`语句是所谓 *循环* 语句的一个例子。`while`语句有一个可选的`else`从句。
* `break`语句是用来 *终止* 循环语句的,即哪怕循环条件没有成为False或序列还没有被完全递归,也停止执行循环语句。
一个重要的注释是,如果你从`for`或`while`循环中 *终止* ,任何对应的循环else块将不执行。
* `continue`语句被用来告诉`Python`跳过当前循环块中的剩余语句,然后 *继续* 进行下一轮循环。
* 逻辑运算符 `and`, `or`, `not`。
```python
## 变量名命名:为清晰表达,驼峰式,下划线式
LookLikeThis = 1
look_like_this = 'a'
```
#### Python中的数据类型:整数(int)、浮点(float)和字符串(str)
```python
type(2)
```
int
```python
type(2.5)
```
float
```python
type("Hello, everyone")
```
str
```python
type([1,2,3])
```
list
```python
## 类型转换函数
str()
int()
float()
```
```python
str(2)
```
'2'
```python
## 字符和数字不同
42 != "42"
```
True
```python
42 == int("42")
```
True
```python
## This is my first python program!
myName = input("Hello, what is your name?")
print('It is good to meet you,' + myName)
print('The length of your name is', str(len(myName)))
myAge = input('What is your age?')
print('You will be ' + str(int(myAge) + 1) + ' in a year.')
```
Hello, what is your name?CT
It is good to meet you,CT
The length of your name is 2
What is your age?20
You will be 21 in a year.
#### 逻辑值和比较操作
```python
a = False
a
```
False
```python
b = True
b
```
True
```python
a = "False"
a
```
'False'
```python
42 == 40
```
False
```python
42 == "42"
```
False
```python
30 == 30
```
True
```python
## 注意赋值(一个=)和比较(==)的区别
a = 'hello'
a == 'hello'
```
True
##### 布尔操作符`and`, `or`, `not`
* 逻辑与 `and`:所有为真才为真
* 逻辑或 `or`:所有为假才为假
* 逻辑非 `not`: 真变假,假变真
```python
(3 > 2) and (5 < 6)
```
True
```python
(3 < 2) or (5 < 6)
```
True
```python
not True
```
False
#### 控制流
if 条件(True or False) :
代码块1
elif 条件 :
代码块
else :
代码块2
```python
##条件
name = input('Please enter a name and click Enter\n')
if name == 'ehbio':
print ('hello ehbio')
else :
print ('You are not ehbio')
```
Please enter a name and click Enter
CT
You are not ehbio
#### While循环
```python
a = 0
while a < 5:
print('Hello, world')
a = a + 1
```
Hello, world
Hello, world
Hello, world
Hello, world
Hello, world
#### 数值变量操作
```python
print("数值变量")
a = 5 #注意等号两边的空格,为了易于辨识,操作符两侧最好有空格,数量不限
print(a)
print()
print("The type of a is", type(a))
##print "这是保留节目,通常判断变量的类型使用的不是type是isinstance."
##print "a is an int, ", isinstance(a,int)
## 再次赋值就是覆盖
a = 6
print(a)
```
数值变量
5
The type of a is <class 'int'>
6
```python
## 判断
print("比较数值的大小")
a = 5
## 注意大于号两边的空格,为了易于辨识,操作符两侧最好有空格,数量不限
if a > 4:
print("a is larger than 4.")
elif a == 4:
print("a is equal to 4.")
else:
print("a is less than 4")
```
比较数值的大小
a is larger than 4.
```python
print("给定数值变量a和b的值,通过判断和重新赋值使得a的值小,b的值大")
a = 5
b = 3
if a > b:
a,b = b,a
##-------------------
print(a)
print(b)
```
给定数值变量a和b的值,通过判断和重新赋值使得a的值小,b的值大
3
5
```python
print('''#数值运算, 符合传统的优先级,需要使用括号来改变优先级,
和小学学的数学一模一样!!''')
a = 5
b = 3
print("a + b =", a + b)
print("a * b =", a * b)
print("a / b =", a / b) # 1
print("2 * (a+b) =", 2 * (a + b))
print("取余数: a % b =", a % b)
print("取余数是很好的判断循环的地方,因为每个固定的周期余数就会循环一次")
```
#数值运算, 符合传统的优先级,需要使用括号来改变优先级,
和小学学的数学一模一样!!
a + b = 8
a * b = 15
a / b = 1.6666666666666667
2 * (a+b) = 16
取余数: a % b = 2
取余数是很好的判断循环的地方,因为每个固定的周期余数就会循环一次
```python
3 / 0
```
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-17-2b706ee9dd8e> in <module>()
----> 1 3 / 0
ZeroDivisionError: division by zero
#### 字符串变量操作
```python
print("字符串变量")
## 注意引号的配对
a = "Hello, welcome to Python"
##a = 123
##a = str(a)
print("The string a is:", a)
print()
## 占位符
print("The length of this string <%s> is %d" % (a, len(a)))
print()
print("The type of a is", type(a))
```
字符串变量
The string a is: Hello, welcome to Python
The length of this string <Hello, welcome to Python> is 24
The type of a is <class 'str'>
```python
a = "大事赖独断而不赖众谋"
print("The string a is:", a)
print()
## len函数:获得字符串长度
print("The length of this string <%s> is %d" % (a, len(a)))
print()
```
The string a is: 大事赖独断而不赖众谋
The length of this string <大事赖独断而不赖众谋> is 10
```python
a = "Hello, welcome to Python"
print("取出字符串的第一个字符、最后一个字符、中间部分字符")
print("The first character of a is %s\n" % a[0])
print("The first five characters of a are %s\n" % a[0:5])
print("The last character of a is %s\n" % a[-1])
print("The last two characters of a are %s\n" % a[-2:])
print("The last character of a is %s\n" % a[len(a) - 1])
print("\n这部分很重要啊,字符串的索引和切片操作是及其常用的。")
```
取出字符串的第一个字符、最后一个字符、中间部分字符
The first character of a is H
The first five characters of a are Hello
The last character of a is n
The last two characters of a are on
The last character of a is n
这部分很重要啊,字符串的索引和切片操作是及其常用的。
```python
a = "oaoaoaoa"
print("遍历字符串")
for i in a:
print(i)
print()
print("The index of first <o> is: ",a.find('o'))
print("The index of first <c> is: ",a.find('c'))
print("输出符合特定要求的字符的位置")
print()
pos = 0
for i in a:
pos += 1
if i == 'o':
print(pos)
#-------------------
##-----------------------
print('''\n知道吗?不经意间我们写出了Python的
一个内置的标准函数find或者index,而且功能还更强大''')
print('''\n自己尝试实现程序语言内建的函数是学习程序语言
的很好方法。''')
```
遍历字符串
o
a
o
a
o
a
o
a
The index of first <o> is: 0
The index of first <c> is: -1
输出符合特定要求的字符的位置
1
3
5
7
知道吗?不经意间我们写出了Python的
一个内置的标准函数find或者index,而且功能还更强大
自己尝试实现程序语言内建的函数是学习程序语言
的很好方法。
```python
print("我们看看用内置函数如何找到所有 o 的位置\n")
a = "oaoaoaoa"
print("内置函数find只能确定最先出现的 o 的位置")
pos = a.find('o')
print("因此,我们要在发现 o 之后,截取其后的字符串,再执行find操作")
while 1:
print(pos + 1)
new = a[pos + 1:].find('o')
if new == -1:
break
pos = new + pos + 1
## help(str)
```
我们看看用内置函数如何找到所有 o 的位置
内置函数find只能确定最先出现的 o 的位置
因此,我们要在发现 o 之后,截取其后的字符串,再执行find操作
1
3
5
7
```python
print()
print("利用split分割字符串\n")
str1 = "a b c d e f g"
strL = str1.split(' ')
print(strL)
print("\n使用split命令就可以把字符串分成列表了,想取用哪一列都随便你了。")
## 使用下面的命令查看可以对字符串进行的操作
## help(str)
```