Head First Python 學習心得(1-6章)

寫在前面:
「吾嘗終日而思矣,不如須臾之所學也;吾嘗跂而望矣,不如登高之博見也。登高而招,臂非加長也,而見者遠;順風而呼,聲非加疾也,而聞者彰。假輿馬者,非利足也,而致千里;假舟楫者,非能水也,而絕江河。君子生非異也,善假於物也。」
十幾年的默默學習,而今但願更可能是對本身知識的一個總結反思積累,可以探討進步更是夢寐以求。雖然如今coding能力有限,但所幸站在巨人肩膀上,可總有一天,我也能成爲巨人。
一篇簡單python入門學習開始,做爲本身千里之行第一步,sf.gg平臺的第一次嘗試。python

第一章 對於列表的理解


python中的列表能夠實現對各類數據的組織:
movies=['The Holy Grail','The life of brain','The meaning of life',2017,['dog','cat','duck']]
包括數字,字符串和列表,但數字和字符的組合只能包含在字符串之中。
列表中數據項的調用:
print(movies[1]) 顯示"The life of brain"
下面列出一些關於list類列表的BIF:
len(movies)
輸出列表中的數據項個數。
movies.append('')
在列表末尾添加單個數據項。
movies.extend(['',''])
在列表末尾增長一個數據項集合。
movies.pop(n)
在指定位置刪除並返回這個數據項,注意這裏是有返回項的。
movies.remove('')
移除某一個特定數據項。
insert('')
在特定位置增長一個數據項。
isinstance(name,list)
檢查某個標識符(name)是否屬於某種類型(例如list)。
list()
產生一個空列表的工廠函數。
range()
根據須要生成一個範圍的數字,經常使用於循環次數
int()
將一個字符串或一個數字轉換爲整數app

----本身入門必定是從點到面的,所以這裏並非很全面的總結,但願之後更加完善。函數

關於python中的邏輯

迭代語句:學習

for each_file in movies:
    print(each_file)

其中 each_file 是咱們本身爲列表中的數據項定義的名字。url

count = 0
while count < len(movies):
    print(movies[1])
    count = count + 1

這裏建議只要是能用for語句儘可能用for語句。spa

判斷語句:code

if isinstance(each_item,list):
    print(each_item)
else:
   print('none')

這裏與c語言並沒有明顯區別,多重判斷加入elif。blog

建立自定義函數

def print_lol(the_list):
    xxxx
    xxxxx

自定義函數還有較多注意地方,在後續內容中有所說起。圖片

第二章 發佈並上傳代碼到pypi

在查閱大量資料發佈和上傳pypi還有不少附屬文件須要編寫和上傳以確保模塊可以正常發佈和更新。這裏只寫了文中提到的可以保證發佈和上傳的最必要的幾個步驟,將來可能會專門寫一篇關於發佈詳細文章。ip

發佈

1.爲模塊傳建一個與模塊文件(.py)相同名字的文件夾(例如:cat),並把文件放進去。
2.建立setup.py文件

from distutils.core import setup

setup(
    name = 'cat', 
    version = '1.0.0',  
    py_modules = ['cat'], 
    author = 'davystokess',  
    author_email = 'xxxxx', 
    url = 'http://www.xxxx.com', 
    description = 'A simple example'
      )

setup文件是爲你的模塊作出說明

3.發佈 在此文件夾空白處 shift+右鍵 打開命令窗口輸入:
圖片描述
4.安裝到本地文件:
圖片描述
5.嘗試導入並使用模塊:

import cat

cat.print_lol(xxx)

其中cat.print_lol涉及命名空間,若是使用

from cat import print_lol
print_lol(xx)

則print_lol能夠直接使用。

上傳到pypi

書中的方法在我使用的3.6.2版本已經沒法使用(僅限本人)。這裏使用官方推薦方式:

py -m pip install twine   # 安裝twine,必須有py -m 前綴不然沒法使用,具體啥意思我也不知道(待改)

py -m twine upload dist/*  #利用twine上傳

小體會:
(不保證徹底正確)

  1. 上傳的模塊名字不能與已經上傳的名字相同,不然會上傳失敗
  2. 上傳本人沒法創建有效的.pypirc文件 所以每次上傳都須要輸入帳號密碼(待學習)
  3. 再上傳更新版本的時候須要模塊從新發布。但須要刪除dist文件夾的上一個版本的xxx.tar 文件不然會顯示上傳已經存在
  4. 註釋有兩種(1)是 # 註釋一整行 (2)'''xxx'''註釋一段
  5. 對於函數使用具備缺省值的參數例如 def print_lol(the_list,level=0)
  6. end=' '做爲print函數參數能夠關閉默認的自動換行
  7. 列表項目

第三章 文件與異常

文件

文件的打開:
data = open(sketch.text,'wb')
sketch.text是某一個文件,方式有'r''rb''w''wb''w+''a'分別表明讀,二進制讀,寫二進制寫,讀和寫,追加寫入。注意data並非一個列表,w會清空現有文件再寫入,沒有文件則會建立一個文件。

顯示python當前工做文件夾,更改工做文件夾:

import os
os.getcwd()
os chdir(F:\code\python)

xxx.split(','n)
將xxx(一個數據項,或者一個列表等)中的數據依據','分爲一個個數據項,n爲分隔的個數,n=1則意味着在第一個,處將數據分爲兩半;不設置則有x個,分爲x+1項的列表
xxx.readline()
讀取xxx一個數據行(待改)
xxx.find('n')
尋找xxx數據中是否存在n 是返回參數:個數如10;否返回參數-1
xxx.seek()
用來是文件恢復到初始位置
not
將所得結果取反
xxx.close()
將文件關閉

處理異常

舉例:

man=[]
other=[]
try:
    data=open('sketch.txt')
    for each_line in data:
        try:
            (role,line_spoken)=each_line.split(':',1)
            line_spoken= line_spoken.strip
            if role=='Man':
                man.append(line_spoken)
            elif role=='Other Man':
                other.append(line_spoken)
        except ValueError:
            pass
    data.close()
except IOError:
    print('The data file is missing!')
try:
    man_file=open('man_data.txt','w')
    other_file=open('other_data.txt','w')

    print(man,file=man_file)
    print(other,file=other_file)
except IOError as err:
    print('File error:'+str(err)) #經過這種方式能夠將問題反饋給咱們,用來分析錯誤類型
finally:
    man_file.close()
    other_file.close()

try語句用來執行正常模塊處理功能,except語句用來處理可能出現的錯誤:例如找不到指定文件或者數據類型不對等等;finally語句用來處理必定要執行語句。

第四章 將數據保存到文件

print('',file = file_name)
將數據寫入文件

try:
    with open('man_data.txt','w') as man_file:   #注意形式
        print_lol(man,fh=man_file)
    with open('other_data.txt','w') as other_file:
        print_lol(other,fh=other_file) 
except IOError as err:
    print('File error:'+str(err))

使用with open() as xxx:語句能夠妥善文件的開關

import pickle
try:
    with open('man_data.txt','wb') as man_file,open('other_data.txt','wb') as other_file:
    #注意建立儲存的文件是xxxx.pickle或xxx.txt格式均可以
        pickle.dump(man,man_file)
        pickle.dump(other,other_file)
except IOError as err:
    print('file error:'+str(err))
except pickle.PickleError as perr:
    print('Pickleing error:'+ste(perr))

new_man=[]


with open('man_data.txt','rb') as man_file:
    new_man=pickle.load(man_file)
print_lol(new_man)

呵呵 使用pickle.dump(數據,文件名)能夠將數據壓縮保存;使用pickle.load(數據名)能夠將數據提取出來。注意寫,讀打開方式是wb和rb 。

第五章 處理數據

def get_coach_data(filename):
    with open(filename) as f:
        data=f.readline()
        return(data.strip().split(','))  
#方法串鏈 從左往右讀 特色以點爲分隔,()中無包含關係

對於第五章的數據(只有計時數據)進行處理 打開-讀取(變爲列表但只有一項?)-去空格-以','爲分隔變爲多個數據項的列表返回。

def sanitize(time_string):
    if '-' in time_string:
        splitter='-'
    elif ':' in time_string:
        splitter=':'
    else:
        return(time_string)
    (mins,secs)= time_string.split(splitter)
    return(mins+'.'+secs)

自定義sanitize函數用於將數據中的'-'':'都變爲'.'。

print(sorted(set([sanitize(t) for t in james]))[0:3])
包含函數串鏈,特色是()中包含函數。一種寫代碼的方式:列表推導 自行體會。但其中的set()函數是將數據(不管是導入的仍是列表數據)轉換爲一個集合,這樣就能夠去除數據中的重複項。

第六章 打包代碼和數據

當數據發生改變(增長或者減小類型)時,使用 字典 使用字典會很是方便:

def get_coach_data(filename):
    with open(filename) as f:
        data=f.readline().strip().split(',')
        data1={}
        data1['name']=data.pop(0)
        data1['DOB'] =data.pop(0)
        data1['Times']=str(sorted(set([sanitize(t) for t in data]))[0:3])
    return(data1)
sarah = get_coach_data('sarah2.txt')
print(sarah['name']+"'s fastest time are:"+sarah['Times'])
# 對字典的調用例如sarah['name'],方式簡單實用。

這裏面get_coach_data()函數建立並處理數據追中返回一個字典,對字典的調用。

但將數據與代碼打包在一塊兒是更好的,函數與數據關聯纔有意義,所以引入類的使用:

class Athlete:
    def __init__(self,a_name,a_dob=None,a_times= [ ]): 
    #  __init__這裏必定要注意 兩個短橫線 
        self.name =a_name
        self.dob = a_dob
        self.times=a_times
    def top3(self):
        return(sorted(set([sanitize(t) for t in self.times]))[0:3])
    def add_time(self,time_value):
        self.times.append(time_value)
    def add_times(self,list_of_times):
        self.times.extend(list_of_times)

這裏涉及了‘定製類’的建立例子,注意其中的賦值與擴展方法。

def sanitize(time_string):
    if '-' in time_string:
        splitter='-'
    elif ':' in time_string:
        splitter=':'
    else:
        return(time_string)
    (mins,secs)= time_string.split(splitter)
    return(mins+'.'+secs)
#此處是重點  注意觀察必定製類的不一樣
class Athletelist(list):
# 注意()中的是你將派生的類的類型
    def __init__(self,a_name,a_dob=None,a_times= []):
        list.__init__([])
        self.name =a_name
        self.dob = a_dob
        self.extend(a_times)
    def top3(self):
        return(sorted(set([sanitize(t) for t in self]))[0:3])

        
def get_coach_data(filename):
    with open(filename) as f:
        data = f.readline().strip().split(',')
    return(Athletelist(data.pop(0),data.pop(0),data))
    #注意觀察類的調用方式
        
sarah = get_coach_data('sarah2.txt')
print(sarah.name+"'s fastest time are:"+str(sarah.top3()))

vera= Athletelist('vera vi')
vera.extend(['1.31','1-21','2:22'])

print(vera.top3())

這裏涉及了子類的建立方法,不只包含編寫的功能,還包含list自己的功能。

小結:小小入門。

相關文章
相關標籤/搜索