原創(chuàng): 大土豆力 [生信菜鳥團(tuán)] 希望大家多多的支持 原文
hi,這里是手把手帶你學(xué)Python3系列階段性小結(jié)。
大概兩個(gè)多月前,我開設(shè)了這個(gè)「老坑」,內(nèi)容非?;A(chǔ),如果一路過來,已能初步滿足我的一些日常處理。
今天的推送對標(biāo)技能樹「生信分析人員如何系統(tǒng)入門python(2019更新版)」雖然不一定周全,但會盡可能地進(jìn)行完善。
看完此篇,也算是敲進(jìn)了大門。
寫在前面
Python is an interpreted, object-oriented, high-level programming language with dynamic semantics.
python是一種語法簡單易學(xué)且強(qiáng)調(diào)可讀性,一種面向?qū)ο?、解釋型高級編程語言,使用頻率和場景日益增長。
在這個(gè)系列的第一期開坑時(shí)候我寫到:
大多數(shù)告訴你 python 值得學(xué)習(xí)都是基于就業(yè)和收入,這樣的確容易打動一些人去加入學(xué)習(xí)。但是我覺得,學(xué)習(xí)一種編程語言真的要義在于,如何使用 [思維] 或者 [邏輯] 使用代碼實(shí)現(xiàn)一個(gè)有意義的事情,可能是減輕繁雜的重復(fù)工作,可能是利用編程解決一個(gè)實(shí)際問題。我覺得編程是一門藝術(shù),所以,你不想進(jìn)來看看么?
可能我現(xiàn)在正在經(jīng)歷階段是,能夠?qū)崿F(xiàn)小需求,測試完成的時(shí)候也是有些許成就感的,但是過程不太容易。慢慢來,比較快。
這里就給出的了我兩個(gè)多月來的學(xué)習(xí)階段性小結(jié),大概分為以下幾步:
理解常量與變量;
掌握基本數(shù)據(jù)類型及操作;
嘗試三大結(jié)構(gòu);
使用函數(shù);
小實(shí)戰(zhàn);
第一步:工欲善其事必先利其器
既然要學(xué)習(xí) Python 語言,配套的軟件工具必須要摸索到位,除了我在此次推送的 PyCharm外,也有@鮑師傅的 jupyter,新手還是推薦前者。偶爾用用終端界面的 python 也可以,但是別直接用IDLE啦,容易消磨熱情。
關(guān)于版本,從2.X到3.7.4各色版本都能下載到,但是這里并不推薦 python2 了,因?yàn)橐延邢⒎Q2020年1月1日將不再維護(hù) python2 版本,且在前期的野蠻發(fā)展中,一些「規(guī)范的格式」也沒有完全普及。
當(dāng)然,如果你使用的是 PyCharm,將會直接送你三個(gè)開場buff:
簡單易學(xué)
錯(cuò)誤提示
規(guī)范提示
安裝方法可以詳見早期的推文,這里要再啰嗦一句的是,如果使用 PyCharm 一定要開啟 PEP 8規(guī)范,通過安裝autopep8模塊就可以智能修改,從一開始就能夠?qū)懗觥妇隆沟拇a,就好比練字時(shí)臨摹了大家的字帖一般。
第二步:變量與常量
變量是針對常量來提出的,常量是指在程序中不會改變的量,而變量就可以用于儲存不同的計(jì)算結(jié)果或者不同類型的數(shù)據(jù)。變量的特點(diǎn)就是可以修改與賦值。
這里需要注意的是:
變量名只能出現(xiàn)字母、數(shù)字及下劃線,且不能以數(shù)字開頭;
變量名不能與關(guān)鍵字重復(fù)(包括自定義的函數(shù)名)例如:
and as assert break class continue def del elif else except exec finally for from global if in import is lambda not or pass print raise return try while with yield
- 變量名不能重復(fù),即一個(gè)變量名只對應(yīng)一個(gè)變量。
五種標(biāo)準(zhǔn)變量類型:
數(shù)字
字符串
列表
元祖
字典
可以這樣理解數(shù)據(jù)類型和字符串是基礎(chǔ)變量,數(shù)字類型主要包含兩種類型:整型(Int)和浮點(diǎn)型(float)組成,整型只能儲存整數(shù);浮點(diǎn)型能存儲小數(shù)。有了這些數(shù)字就可以進(jìn)行:
數(shù)學(xué)計(jì)算
位運(yùn)算
也可以用作判斷基因的位置信息,即序列的長短,比如:
字符串可以理解為一段文本,可以進(jìn)行文本處理和判斷。包括拼接、大小寫修改等處理… 不同的類型的數(shù)據(jù)在必要時(shí)是可以轉(zhuǎn)換的,數(shù)字也可以被認(rèn)為是字符串。
正則表達(dá)式:
這里需要穿插一個(gè)很重要的「技能」(概念),就是正則表達(dá)式,具體的規(guī)則在之前的推送中提到:
常用的速查表如下:
在python中有以下幾種使用方式:
import re
# 兩種匹配方式,re.match只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式,則匹配失敗,函數(shù)返回None;而re.search匹配整個(gè)字符串,直到找到一個(gè)匹配。輸出結(jié)果先判斷成立然后輸出:
pattern1 = re.match(r'pattern', string, flags=0)pattern2 = re.search(r'pattern' string, flags=0)
if pattern1:
print(pattern1.group())
else:
print("no match")
# 編譯正則用于match()和search(),flags為可選參數(shù)比如忽略大小寫、多行模式等
pattern3 = re.compile(r'pattern'[, flags])
m = pattern.search('str')
# 替換,repl指替換后的內(nèi)容,string指原文內(nèi)容
re.sub(r'pattern', repl, string, count=0, flags=0)
# findall()也是一種匹配方式,但是優(yōu)勢在于能夠?qū)⒔Y(jié)果返回入一個(gè)列表,因此可以直接快速輸出結(jié)果,以下為我常用的格式
pattern4 = re.findall(r'pattern',string)[0]
# 和 findall 類似,在字符串中找到正則表達(dá)式所匹配的所有子串,并把它們作為一個(gè)迭代器返回
pattern5 = re.finditer(r'pattern', string, flags=0)
# split 方法按照能夠匹配的子串將字符串分割后返回列表,它的使用形式如下
pattern6 = re.split(r'pattern', string[, maxsplit=0, flags=0])
具體的使用方法可以翻看這篇內(nèi)容:
手把手帶你學(xué) Python3 | python3 腳本小實(shí)戰(zhàn)(代碼放送)
列表、元祖和字典:
元素按順序排列時(shí)就能組成更多信息的數(shù)據(jù)類型:列表和元祖。其中的元素可以包含字符、字符串、數(shù)字、子類表(元祖)。列表使用 list = []表示;元祖使用 tuple = (obj,),具體使用和參數(shù)可以詳見這兩篇推送:
要注意的是,python中索引是從 0 開始計(jì)數(shù)的;切片和拆包都是快速處理文本好用的方法。
看似兩者相差不大,但還是有不同應(yīng)用場景的。list和tuple最大的差別就在于 Immutable上,這就帶了更多安全性及性能優(yōu)化,列表是相同類型的項(xiàng)目列表:文件,名稱,對象,元組是不同類型對象的分組。
字典就好比「新華字典」,定義字典時(shí),元素以關(guān)鍵對的形式 x:y呈現(xiàn),即一個(gè)元素需要包含關(guān)鍵字鍵(key)和值(value)兩部分。鍵在字典中是唯一不變的,而對應(yīng)的值可以是任意數(shù)據(jù)類型,同時(shí)允許相同的值存在。在生物信息操作中,字典最經(jīng)典的應(yīng)用應(yīng)是對fa文件的處理,可以以ID為鍵,序列為值,或是對調(diào)也具有相應(yīng)的場景,可以看字典的推送:
第三步函數(shù)的基本操作
基本使用方法:
函數(shù),即實(shí)現(xiàn)一個(gè)特定功能的代碼段。是python中的重要技能(工具)。
函數(shù)離我們并不遠(yuǎn),早期我們已熟練使用了一些內(nèi)置函數(shù):例如input print等;
函數(shù)可以包括:
根據(jù)使用范圍可以將函數(shù)分為兩類:
-
主函數(shù)
我們會使用這樣來表示,它和代碼一樣,全局都是使用;
01 if _name_ = '_main_':02 print('This is main.') -
子函數(shù)
除了內(nèi)置函數(shù)外,這里就是發(fā)揮你洪荒之力的地方啦;
03 def Plus(a,b):04 print(a+b)
另外,還能從實(shí)現(xiàn)不同的功能角度來區(qū)分,比如 匿名函數(shù) 以及高階函數(shù) 詳見實(shí)例說明:
在此有一個(gè)概念需要提及:
全局變量和局部變量
即整個(gè)程序都可以使用的變量,用 global g 表示。與局部變量對應(yīng),可以由下圖關(guān)系理解。
來看一個(gè)例子:
01 a = 1
02
03 def function():
04 global a
05 a += 1
06 global b
07 print (a)
08 function()
09 print (a)
10 print (b)
外部變量可以被改變,內(nèi)部變量也可以在外部使用。
自定義函數(shù)
為什么要寫函數(shù)之前的介紹道:
首先是好看,代碼更清楚;
第二是代碼容易拆分,容易debug及分工;
第三是有序,避免代碼重復(fù)(DRY),同時(shí)可以厘清思路。
寫自定義函數(shù)的時(shí)候要注意:
函數(shù)名也是變量,要遵守定義變量的規(guī)則;
參數(shù)使用注意
形參可以預(yù)先給定一個(gè)默認(rèn)值。如果調(diào)用不給實(shí)參,那么參數(shù)將使用默認(rèn)值;如果給定值,那么默認(rèn)的參數(shù)會被替換。返回return,一個(gè)完整的函數(shù)的都會有 return,返還值可為基本數(shù)據(jù)類型,同時(shí)可以返還一個(gè)表達(dá)式,如果沒有,返回 None
合理利用內(nèi)置函數(shù)(下圖)
第四部三大結(jié)構(gòu)
python語言中有三大結(jié)構(gòu):循序、分支和循環(huán)。循序就是從上往下進(jìn)行,分支和循環(huán)結(jié)構(gòu)中最重要的就是條件判斷。首先我們要熟悉python3中的判斷依據(jù)——布爾運(yùn)算。
python3中將布爾運(yùn)算的Ture (T)和 False (F)作為定義詞使用,并把0、空字符串和None看成False,其他情況為Ture。
和其他的邏輯運(yùn)算一樣,python3也包含與或非運(yùn)算,只是表示有些許不同,在python中,與運(yùn)算使用and 連接,或運(yùn)算使用or連接,非運(yùn)算使用not Ture。
還有一個(gè)要注意的是None。None是一個(gè)一個(gè)特殊空值,并不是0,因?yàn)?是有意義的。
python中有兩種循環(huán)語句,while語句和for語句,但是并沒有do… while循環(huán)。簡單來說whlie語句進(jìn)行判斷,如果TRUE,進(jìn)入循環(huán),FALSE則退出;而for循環(huán)是首要給定循環(huán)范圍,每一次循環(huán)會用一個(gè)變量存儲本次循環(huán)的值,當(dāng)超出范圍,循環(huán)結(jié)束。
用作判斷的操作符使用,這里引用@ zoe 在技能樹上的總結(jié)圖,Python 的數(shù)值運(yùn)算、邏輯運(yùn)算、判斷表達(dá)式的思維導(dǎo)圖如下:
第五步更多的應(yīng)用場景
雖然說,生物信息學(xué)的處理都與序列打交道,但是偶爾用用數(shù)據(jù)抓取,可以快速獲得很多相關(guān)信息。比如8月的2019國自然信息收集,NCBI的摘要和標(biāo)題的收錄。
這還遠(yuǎn)遠(yuǎn)沒有結(jié)束,在往期的介紹中,依舊存在多個(gè)概念和使用沒有介紹和歸整,例如 biopython, 它能夠幫助你快速解析特定文件格式(例如 json),獲取對應(yīng)位置的信息,官方文檔鏈接如下:http://biopython.org/DIST/docs/tutorial/Tutorial.html。
推薦幾個(gè)數(shù)據(jù)處理和可視化模塊(包):NumPy、Pandas、matplotlib、seaborn、pyecharts。
現(xiàn)行的一些以python編寫的流程中已經(jīng)支持調(diào)用直接作圖:
還有一個(gè)比較重要的概念,可能需要一到兩次推送去描述,學(xué)習(xí)好了會及時(shí)更新的,就是python的類與對象。
Python 有一條哲學(xué)理念是:一切皆對象。由此可見對象在 Python 中的重要性。
現(xiàn)階段還還處于一個(gè)依樣畫葫蘆的階段,有幾個(gè)小的案例的也可以查看往期推送。
參考資料: