基於廖雪峰的python零基礎學習後,自我總結。適用於有一定基礎的編程人員,對我而言,則是基於.net已有方面,通過學習,記錄自我覺得有用的地方,便於後續回顧。 主要以快速定位內容,通過直觀代碼輸入輸出結果,展示獨有的特性,更直觀表現,而不拘禁於理論描述。待以後使用中遇到坑,再來詳細闡述。 本章包含 ...
基於廖雪峰的python零基礎學習後,自我總結。適用於有一定基礎的編程人員,對我而言,則是基於.net已有方面,通過學習,記錄自我覺得有用的地方,便於後續回顧。
主要以快速定位內容,通過直觀代碼輸入輸出結果,展示獨有的特性,更直觀表現,而不拘禁於理論描述。待以後使用中遇到坑,再來詳細闡述。
本章包含,Python基礎、函數、高級特性、函數式編程、模塊
一、Python基礎
Python程式大小寫敏感,個人使用sublime編寫程式,註意規範使用tab縮進或者空格,否則程式運行會報unexpected error
字元串轉義:用r''
表示''
內部的字元串預設不轉義
>>> print(r'\\\t\\') \\\t\\
用'''...'''
的格式表示多行內容
>>> print('''line1 ... line2 ... line3''') line1 line2 line3
Encode & Decode
>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87'
>>> b'ABC'.decode('ascii') 'ABC' >>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') '中文' >>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore') '中'
長度:len(str)
格式化: %s 字元串; %d 整數; %f 浮點數;%x 十六進位整數;%%=>%
>>> print('%2d-%02d' % (3, 1)) 3-01 >>> print('%.2f' % 3.1415926) 3.14、
布爾值:True,False
空值:None
集合list 和 元組 tuple
classmates = ['Michael', 'Bob', 'Tracy'] 集合list append 添加,pop 刪除
classmates = ('Michael', 'Bob', 'Tracy')
>>> classmates[-3] 'Michael'
#只有一個元素tuple 定義加上逗號 ,
>>> t = (1,)
>>> t
(1,)
#“可變的”tuple 內部list改變,實際指向list位置未變
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
條件判斷
age = 20 if age >= 6: print('teenager') elif age >= 18: print('adult') else: print('kid')
dic 字典 和 set
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85} >>> d['Michael'] 95
#設定預設值
>>> d.get('Thomas', -1)
-1
#刪除
>>> d.pop('Bob')
75
#重覆元素在set中自動被過濾: add(key) remove(key)
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
二、函數
函數定義
def my_abs(x): if x >= 0: return x else: return -x
#返回多個值 return a,b,c
函數參數
#預設參數必須指向不變對象!
def add_end(L=None): if L is None: L = [] L.append('END') return L
# *args 可變參數 **關鍵字參數
def f1(a, b, c=0, *args, **kw): print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
# *,d 命名關鍵字參數
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
#對於任意函數,都可以通過類似func(*args, **kw)
的形式調用它,無論它的參數是如何定義的
三、高級特性
切片 substring
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack'] >>> L[1:3] # L[1] L[2] ['Sarah', 'Tracy']
>>> L = list(range(100))
>>> L[-10:] # L[-10:100] 後10個
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>> L[:10:2] # L[0:10:2] 前10個數,每兩個取一個
[0, 2, 4, 6, 8]
>>> L[:] # L[0:100:1] copy 複製
[0, 1, 2, 3, ..., 99]
>>> L[::-1] #相當於 L[-1:-101:-1] if s<0 then L[-1:-len(L)-1:-1]
[99, 98, 97, ..., 0]
迭代 for
>>> from collections import Iterable >>> isinstance('abc', Iterable) # str是否可迭代 True >>> isinstance([1,2,3], Iterable) # list是否可迭代 True >>> isinstance(123, Iterable) # 整數是否可迭代 False
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
列表生成式
>>> [x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100]
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']
生成器 yield
>>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x1022ef630>
# 使用next(g) or for n in g 可迭代對象g #斐波拉契數
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'
迭代器
>>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False #Iterable。 for 迴圈迭代 #Iterator。 next 迭代器 # Iterable 轉換 Iterator >>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True
四、函數式編程
高階函數 map/reduce/filter/sorted
#map 傳入函數依次作用到序列每個元素,返回Iterator結果集 >>> def f(x): ... return x * x ... >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> list(r) [1, 4, 9, 16, 25, 36, 49, 64, 81] # r 為Iterator惰性序列,list() 是整個序列返回 #reduce reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4) >>> from functools import reduce >>> def add(x, y): ... return x + y ... >>> reduce(add, [1, 3, 5, 7, 9]) 25 #map reduce 結合使用 from functools import reduce DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} def char2num(s): return DIGITS[s] def str2int(s): return reduce(lambda x, y: x * 10 + y, map(char2num, s))
#filter filter()把傳入的函數依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄 def not_empty(s): return s and s.strip() list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])) # 結果: ['A', 'B', 'C']
#sorted sorted()函數對list進行排序 >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True) ['Zoo', 'Credit', 'bob', 'about']
函數返回值 和 閉包
def lazy_sum(*args): def sum(): ax = 0 for n in args: ax = ax + n return ax return sum >>> f = lazy_sum(1, 3, 5, 7, 9) >>> f <function lazy_sum.<locals>.sum at 0x101c6ed90> >>> f() 25
#典型閉包錯誤 def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() >>> f1() 9 >>> f2() 9 >> f3()
9
##返回閉包時牢記一點:返回函數不要引用任何迴圈變數,或者後續會發生變化的變數
修改後:
def count():
def f(j):
def g():
return j*j
return g
fs = []
for i in range(1, 4):
fs.append(f(i)) # f(i)立刻被執行,因此i的當前值被傳入f()
return fs
匿名函數 lambda
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])) [1, 4, 9, 16, 25, 36, 49, 64, 81]
#lambda 不包含return,返回即使return結果
裝飾器
import functools def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print('%s %s():' % (text, func.__name__)) return func(*args, **kw) return wrapper return decorator @log('execute') def now(): print('2018-8-13') >>> now() execute now(): 2018-8-13
偏函數
>>> import functools >>> int2 = functools.partial(int, base=2) >>> int2('1000000') 64 #相當於下麵這樣調用 kw = { 'base': 2 } int('10010', **kw)
五、模塊