Python
It's personal python note
引言
有兩種方式構(gòu)建軟件設(shè)計(jì):
一種是把軟件做的很簡(jiǎn)單以至于明顯找不到缺陷;
另一種是把它做得很復(fù)雜以至于找不到明顯的缺陷.
--by C.A.R Hoare
標(biāo)識(shí)符
- 第一個(gè)字符必須是字母或下劃線
- 大小寫(xiě)敏感
list []
- python內(nèi)置的一種數(shù)據(jù)類型
- 有序
- append()追加、insert()插入、pop()剃尾或刪除
- list里數(shù)據(jù)類型可不同
- list還可以嵌套使用
tuple ()
- 與list類似,但一旦被初始化則不可以改變
- 在定義中若只有一個(gè)元素時(shí),需在后面追加逗號(hào)。tuple(1,)
控制語(yǔ)句
- if 判斷
- for...in 循環(huán)
- while 循環(huán)
dict {}
- 字典,相當(dāng)于map
- dict的key必須是不可變對(duì)象
set ([])
- 一組key的集合,但不存儲(chǔ)value,key不重復(fù)
函數(shù) def
- 函數(shù)的返回值用return語(yǔ)句返回
- 空函數(shù)
如果想定義一個(gè)什么事也不做的空函數(shù),可以用pass語(yǔ)句. - 參數(shù)檢查
數(shù)據(jù)類型檢查可以用內(nèi)置函數(shù)isinstance()實(shí)現(xiàn)
def my_abs(x):
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x >= 0:
return x
else:
return -x
- 返回多值
Python的函數(shù)返回多值其實(shí)就是返回一個(gè)tuple,但寫(xiě)起來(lái)更方便。 - 默認(rèn)參數(shù)
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
注意必選參數(shù)在前,默認(rèn)參數(shù)在后
默認(rèn)參數(shù)必須指向不變對(duì)象
- 可變參數(shù)
在Python函數(shù)中,還可以定義可變參數(shù)。顧名思義,可變參數(shù)就是傳入的參數(shù)個(gè)數(shù)是可變的,可以是1個(gè)、2個(gè)到任意個(gè),還可以是0個(gè)。
例:給定一組數(shù)字a,b,c……,請(qǐng)計(jì)算a2 + b2 + c2 + ……
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
>>> calc(1, 2, 3)
14
>>> calc()
0
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
- 關(guān)鍵字參數(shù)
關(guān)鍵字參數(shù)允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
關(guān)鍵字作用是擴(kuò)展函數(shù)。
- 命名關(guān)鍵字檢查
def person(name, age, **kw):
if 'city' in kw:
# 有city參數(shù)
pass
if 'job' in kw:
# 有job參數(shù)
pass
print('name:', name, 'age:', age, 'other:', kw)
如果要限制關(guān)鍵字參數(shù)的名字,就可以用命名關(guān)鍵字參數(shù),例如,只接收city和job作為關(guān)鍵字參數(shù)。這種方式定義的函數(shù)如下:
def person(name, age, *, city, job):
print(name, age, city, job)
- 參數(shù)組合
在Python中定義函數(shù),可以用必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)和命名關(guān)鍵字參數(shù),這5種參數(shù)都可以組合使用,除了可變參數(shù)無(wú)法和命名關(guān)鍵字參數(shù)混合。但是請(qǐng)注意,參數(shù)定義的順序必須是:必選參數(shù)、默認(rèn)參數(shù)、可變參數(shù)/命名關(guān)鍵字參數(shù)和關(guān)鍵字參數(shù)。
遞歸函數(shù)
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
- 使用遞歸函數(shù)需要注意防止棧溢出。
- 解決遞歸調(diào)用棧溢出的方法是通過(guò)尾遞歸優(yōu)化。尾遞歸是指,在函數(shù)返回的時(shí)候,調(diào)用自身本身,并且,return語(yǔ)句不能包含表達(dá)式。這樣,編譯器或者解釋器就可以把尾遞歸做優(yōu)化,使遞歸本身無(wú)論調(diào)用多少次,都只占用一個(gè)棧幀,不會(huì)出現(xiàn)棧溢出的情況。
def fact(n):
return fact_iter(n, 1)
def fact_iter(num, product):
if num == 1:
return product
return fact_iter(num - 1, num * product)
高級(jí)特性
- 切片
取一個(gè)list或者tuple或者字符串的部分元素的操作。
>>> L[0:3]
>>> (0, 1, 2, 3, 4, 5)[:3]
>>> 'ABCDEFG'[:3]
- 迭代
- 列表生成式
列表生成式即List Comprehensions,是Python內(nèi)置的非常簡(jiǎn)單卻強(qiáng)大的可以用來(lái)創(chuàng)建list的生成式。 - 生成器 generator
- 迭代器