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