python自學筆記(一)

我沒學過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的特性和函數編程。

個人公衆號,謝謝關注:

相關文章
相關標籤/搜索