我沒學過python,經過網上和一些圖書資料,自學而且記下筆記。python
不少細節留做之後本身作項目時再研究,這樣能更高效一些。編程
python基礎自學筆記數據結構
1、基本輸入和輸出app
pthon3.0用input提示用戶輸入,用print提示用戶輸出,格式爲print("...")函數
若是格式化輸出,那麼格式爲print("%d" %(變量名)), %d能夠替換爲%s等其餘格式符,spa
之後用到什麼格式本身查,這樣學起來高效。3d
簡單的例子:code
#-*-coding:utf-8-*- name = input("What's your name ? >") age = input("How old are you ? >") print ("your name is %s, your age is %d" %(name, int(age))) print ("你的名字是 %s, 你的年齡是 %d" %(name,int(age)))
運行結果:對象
2、基本數據結構blog
1 列表
列表和C++裏邊的list差很少
插入方式爲: list.insert(1,‘小草’);
1爲要插入元素放在下標爲1的位置,‘小草’爲要插入的元素
移除元素的方式爲:list.pop(3);
指定取出下標爲3的元素
list中元素是按照從下標爲0開始計算的。
若是要計算列表中元素個數能夠經過len(list)計算。
下面是個小例子:
animals = ["大象","猴子","螞蟻","豪豬"] print ("動物園有這些動物:", animals) lion = "獅子" print ("新來了", lion) animals.insert(1,lion) print ("動物園有這些動物:", animals) animals.pop(3) print ("螞蟻滅絕了") print ("動物園有這些動物:", animals) print ("老虎和獅子交配生了兩個小寶寶") babies = ["小寶寶1號", "小寶寶2號"] animals.insert(2,babies); print ("動物園有這些動物:", animals) print("飼養員給兩個小寶寶取了名字") animals[2][0]="小毛" animals[2][1]="大毛" print ("動物園有這些動物:",animals) print("列表中有%d個元素" %len(animals)) print("第三個元素包含%d個元素" %len(animals[2]))
試着用python 運行上面這個程序
2 tuple(元組)
tuple定義以後不可修改,理解爲不可修改的列表就好了
試着運行下面這個程序,看看結果:
#-*-coding:utf-8-*- nums = (0,1) print("nums are", nums) another = (0,1,[3,4]) print("nums are", another) another[2][0] = 5 print("nums are", another);
爲何another能被修改?由於another[2]指向的是list,接着將list的第一個元素,
下表爲0的元素賦值爲5,這是容許的。
3 dict(字典)
字典和C++map很類似,可是不徹底相同,字典dict能夠包含不一樣類型的key和value
字典的插入方式很簡單d['韓梅梅']=23
d爲字典定義的變量名,key爲‘韓梅梅’, value爲23
當字典d中沒有‘韓梅梅’這個key,那麼就會將key和value插入d
若是調用d[‘韓梅梅’]=22,那麼‘韓梅梅’對應的value就爲22了
若是字典d中沒有‘李磊’這個key,那麼調用print(d['李磊'])就會提示出錯。
因此取元素的時候要記得判斷字典中是否有該key對應的value
能夠經過get和in判斷,下邊代碼有使用方法。
字典一樣調用pop移除元素
d.pop('韓梅梅')
下面這段代碼綜合了dict使用方式
infos = {"李明":23, "豆豆":22,"老李":55} print("李明的年齡爲%d" %(infos["李明"])) infos["王立冬"]=32 print (infos) #print (infos["梁田"]) if not ("梁田" in infos): print("梁田不在記錄") print(infos.get("梁田")) print(infos.get("梁田","梁田不在記錄")) infos.pop("王立冬") print (infos)
用python調用上邊代碼,看看效果。
4 set(集合)
集合中容許存在多個重複的值
集合添加元素用add,刪除用remove操做
下邊的代碼爲集合操做
numset = set([1,3,5,7,9]) print(numset) numset.add(4) print(numset) numset.add(4) print(numset) numset.remove(3) print(numset) numset2 = set([2,4,6,8,10]) print(numset&numset2) print(numset|numset2)
3、循環和控制
這部分和C++差很少,就是基本寫法不同
nums = (0,100,34,50,179,130,27,22) print("nums are:", nums) bigernums =[] smallnums = [] for num in nums: if num > 50: bigernums.append(num) print("大於50的數字有:", bigernums) for num in nums: if num < 50: smallnums.append(num) print("小於50的數字有:", smallnums) print(range(5)) print(list(range(5))) #1~10數字求和 sum = 0 for num in list(range(11)): sum += num print("1到10數字求和結果爲:%d" %sum) #錯誤輸出 #print("1到10數字求和結果爲:%d", sum) #換一種方式求和,while循環注意別寫成死循環 i = 0 sum = 0 while i < 11: sum += i i=i+1#i++不行,習慣了C++ print("1到10數字求和結果爲:%d" %sum)
python經過縮進和:控制模塊。
4、函數
1 定義函數
#函數的定義 def judgeint(x): if not isinstance(x,(int)): raise TypeError('類型不匹配') else: return x
是經過def 函數名(參數):方式來定義函數。上面這個函數定義在func.py文件中,
我再寫一個文件使用這個函數
from func import judgeint numlist = [1,3,5] strlist =['1','2','3'] for i in numlist: print(judgeint(i)) for j in strlist: print(strlist(j))
結果爲:
可見strlist中字符串類型被函數識別並終止程序運行了。
想用到某個.py文件的函數能夠用
from 文件名(不包含.py) import 函數名
若是想用文件中全部的接口
from 文件名(不包含.py) import *
其餘的引用方式我也不會,之後遇到了再去查。
也能夠去寫一個空函數
#空函數 def emptyfun(x): pass
pass表示什麼都不作。
固然函數能夠返回許多值,這些值實際上是經過tuple返回的
定義函數
#多個返回值 def getposition(x,y): return x, y
調用這個函數
from func import * num1 = 0; num2 = 0 num1, num2 = getposition(1,3) print('num1 is %d, num2 is %d' %(num1,num2)) print('result is: ', getposition(1,3) )
結果爲:
2 函數參數分類和使用
1 位置參數
位置參數是普通的參數
以下:
def power(x): return x*x
2 默認參數
默認參數提供了參數的默認賦值
#默認參數 def power(x,n = 2): imul =1 while(n > 0): imul = x*imul n = n-1 return imul
值得注意的是默認參數要指向不可變對象,不然函數重複調用默認參數會被修改
def getList(L=[]): L.append("end") return L
重複調用看看結果如何:
#-*-coding:utf-8-*- from func import * L=[] print(getList(L)) print(getList(L))
結果
能夠看出默認參數隨着函數調用被修改了,因此儘可能不要讓默認參數指向可變對象,
list就是可變對象。
3 可變參數
可變參數使用和定義都很是方便
定義:
def calsum(*nums): sum = 0 for i in nums: sum = sum+ i return sum
使用:
#-*-coding:utf-8-*- from func import * L=[1,3,5,7,9] print(calsum(*L)) print(calsum(*range(0,101)))
定義可變參數前邊加*,使用時能夠傳入list,tuple等,實參前也加*便可。
4 關鍵字參數
其實和可變參數相似,關鍵字參數能夠直接傳入字典
定義:
def getinfo2(name, age, **info): print("姓名:", name, "年齡:", age, "其餘信息:", info) def getinfo3(name,age,**info): if 'city' in info: print("有城市信息") if 'job' in info: print("有工做記錄") print("姓名:", name, "年齡:", age, "其餘信息:", info)
定義關鍵字參數在形參前邊加**
使用:在實參前加**表示取出字典中全部內容依次傳遞給函數
from func import * info ={'性別':'女','job':'學生','city':'上海'} info2 ={'性別':'男','job':'工人','city':'北京'} getinfo2('韓梅梅', 23, **info) getinfo3('李雷',25,**info2)
結果
5 命名關鍵字參數
命名關鍵字參數就是傳入命名的關鍵字,如指定傳入的關鍵字參數的key爲‘city’,‘type’等等。
舉例:
def getinfo8(name, age, *,city, job): print("姓名:", name, "年齡:", age, "城市:", city, "工做:", job) def getinfo7(name, age, *infolist, city, job): print("姓名:", name, "年齡:", age, "城市:", city, "工做:", job, "其餘信息:", infolist)
能夠看出命名關鍵字參數格式爲(*,指定名稱1,指定名稱2...)的格式
當明明關鍵字參數以前的參數爲可變參數時,那麼不須要*,只需指明指定的幾個名成便可
格式爲:(*可變參數,指定名稱1,指定名稱2...)
試着寫個代碼用一下:
from func import * info ={'性別':'女','job':'學生','city':'上海'} info2 ={'性別':'男','job':'工人','city':'北京'} getinfo2('韓梅梅', 23, **info) getinfo3('李雷',25,**info2) getinfo8('王麻子',70, city ='南京', job = '裁縫') infolist = ['有犯罪記錄','酗酒'] getinfo7('張三',50,*infolist,city ='翰林',job ='無業遊民')
讀者本身打印下,看看結果
固然命名關鍵字參數能夠提供默認值
def getinfo4(name, age,*,city='瀋陽',job): print("姓名:", name, "年齡:", age, "城市:", city, "工做:", job)
6 參數混合使用
當參數列表包含位置參數,默認參數,可變參數,關鍵字參數和明明關鍵字參數時,
從左到右的順序爲
位置參數,默認參數,可變參數,命名關鍵字參數,關鍵字參數
讀者能夠本身考慮下爲何這麼規定
下面定義兩個函數:
def getinfo5(name,age,city='瀋陽',**info): print("姓名:", name, "年齡:", age, "城市:", city, "其餘信息:", info) def getinfo6(name,age,city='瀋陽',*infolist ,health = '良好', job,**otherinfo): print("姓名:", name, "年齡:", age, "城市:", city, '工做信息:',job,'\n', "身體情況", health, "我的備註",infolist,'\n', "其餘信息:", otherinfo)
使用這一系列定義的函數
info5 ={'性別':'男','job':'工人','興趣':'修自行車'} baselist=('Linkn',28,'上海','喜歡喝冰啤酒','愛打麻將') getinfo6(*baselist,**info5) getinfo5('Linkn',28,'上海',**info5);
函數調用傳入實參均可以經過*arg,**dict格式,提升了開發效率
7 遞歸函數
遞歸函數和C++同樣,先實現一個階乘的函數
#遞歸計算階乘函數 def imul2(num=1): if num ==1: return num else: return num * imul2(num-1)
print(imul2(3)) 看看結果
一樣去實現漢諾塔
編寫move(n, a, b, c)
函數,它接收參數n
,表示3個柱子A、B、C中第1個柱子A的盤子數量,
而後打印出把全部盤子從A藉助B移動到C的方法,計算n==3時,移動方法
讀者試着本身完成,我是這樣實現的
def move(n,A,B,C): if n==1: print("%s --> %s" %(A,C)) return else: move(n-1,A,C,B) move(1,A,B,C) move(n-1,B,A,C)
調用
move(3,'A','B','C')
結果爲
用遞歸很簡單實現了複雜的邏輯,可是遞歸有一個問題就是當遞歸次數過大容易形成棧溢出。
基礎先記到這裏,下一篇會記錄python的特性和函數編程。
個人公衆號,謝謝關注: