python語(yǔ)言特性
- python是動(dòng)態(tài)強(qiáng)類型語(yǔ)言
- 靜態(tài)類型語(yǔ)言是指在編譯時(shí)變量的數(shù)據(jù)類型即可確定的語(yǔ)言横漏,多數(shù)靜態(tài)類型語(yǔ)言要求在使用變量之前必須聲明數(shù)據(jù)類型集晚,某些具有類型推導(dǎo)能力的現(xiàn)代語(yǔ)言可能能夠部分減輕這個(gè)要求.
- 動(dòng)態(tài)類型語(yǔ)言是在運(yùn)行時(shí)確定數(shù)據(jù)類型的語(yǔ)言晌砾。變量使用之前不需要類型聲明攀甚,通常變量的類型是被賦值的那個(gè)值的類型吞瞪。
- 強(qiáng)類型語(yǔ)言是一旦變量的類型被確定馁启,就不能轉(zhuǎn)化的語(yǔ)言。實(shí)際上所謂的貌似轉(zhuǎn)化尸饺,都是通過(guò)中間變量來(lái)達(dá)到进统,原本的變量的類型肯定是沒(méi)有變化的。
弱類型語(yǔ)言則反之浪听,一個(gè)變量的類型是由其應(yīng)用上下文確定的螟碎。比如語(yǔ)言直接支持字符串和整數(shù)可以直接用 + 號(hào)搞定。當(dāng)然迹栓,在支持運(yùn)算符重載的強(qiáng)類型語(yǔ)言中也能通過(guò)外部實(shí)現(xiàn)的方式在形式上做到這一點(diǎn)掉分,不過(guò)這個(gè)是完全不一樣的內(nèi)涵 - 通常的說(shuō),java/python都算是強(qiáng)類型的克伊,而VB/Perl/C都是弱類型的.
不過(guò)相比于動(dòng)態(tài)/靜態(tài)語(yǔ)言的分類酥郭,強(qiáng)類型/弱類型更多的是一個(gè)相對(duì)的概念。
python作為后端語(yǔ)言優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
- 膠水語(yǔ)言愿吹, 輪子多不从,應(yīng)用廣泛(爬蟲,網(wǎng)站后端犁跪,數(shù)據(jù)分析椿息,量化投資,機(jī)器學(xué)習(xí))
- 語(yǔ)言靈活坷衍,生產(chǎn)力高
缺點(diǎn)
- 性能問(wèn)題寝优,代碼維護(hù)問(wèn)題(動(dòng)態(tài)語(yǔ)言一時(shí)爽,代碼重構(gòu)火葬場(chǎng))枫耳,python2/3兼容問(wèn)題
鴨子類型
- 關(guān)注點(diǎn)在對(duì)象的行為乏矾,而不是類型(duck typing)
- 比如 file, StringIO, socket對(duì)象都支持read/write方法(file like object)
- 再比如定義了
__iter__
魔術(shù)方法的對(duì)象可以用for迭代 - 鴨子類型更關(guān)注接口而不是類型
monkey patch
- monkey patch(猴子補(bǔ)丁) 就是運(yùn)行時(shí)替換
- 比如gevent 庫(kù)需要修改內(nèi)置的 socket
from gevent import monkey; monkey.patch_socket()
將內(nèi)置的阻塞的socket替換成非阻塞的socket
import time
print(time.time())
def _time():
return 1234
time.time = _time
print(time.time())
自省 Introspection
- 運(yùn)行時(shí)判斷一個(gè)對(duì)象的類型的能力
- Python一切皆對(duì)象, 用 type, id, isinstance 獲取對(duì)象類型信息
- Inspect 模塊提供了更多獲取對(duì)象信息的函數(shù)
列表和字典推導(dǎo)
- 列表推導(dǎo)時(shí)
[i for i in range(10) if i%2 == 0]
字典推導(dǎo)式:
a = ['a', 'b', 'c']
b = [1, 2, 3]
# d = {'a': 1, 'b': 2, 'c': 3}
d = {}
for i in range(len(a)):
d[a[i]] = b[i]
print(d)
- 字典推導(dǎo)式
d = {k: v for k, v in zip(a, b)}
print(d)
- 生成器推導(dǎo)式,可節(jié)省內(nèi)存
l = (i for i in range(10) if i%2 == 0)
for i in l:print(i)
Python之禪
- Time Peters 編寫的關(guān)于Python編程的準(zhǔn)則
- import this
Python可變對(duì)象和不可變對(duì)象
- 不可變對(duì)象: bool、int钻心、float凄硼、tuple、str捷沸、frozenset
- 可變對(duì)象:list帆喇、set、dict
Python *args, **kwargs
含義:都是用來(lái)處理可變參數(shù)
*args 被打包成tuple
def args(*args):
print(type(args), args)
for idx,i in enumerate(args):
print(idx,i)
args(1,2,3)
# 第二種調(diào)用方法
args(*[1,2,3])
out:<class 'tuple'> (1, 2, 3) 0 1 1 2 2 3
- **kwargs被打包成dict
def print_kwargs(**kwargs):
print(type(kwargs), kwargs)
for k, v in kwargs.items():
print(k,v)
print_kwargs(a=1, b=2)
# 第二種調(diào)用方法
print_kwargs(**dict(a=1, b=2))
out:<class 'dict'> {'a': 1, 'b': 2} a 1 b 2
def print_all(a, *args, **kwargs):
print(a)
if args:
print(args)
if kwargs:
print(kwargs)
print_all('hello', 'one', name='meto')
生成器 Generator
- 生成器就是可以生成值的函數(shù)
- 當(dāng)一個(gè)函數(shù)里有了yield關(guān)鍵字就成了生成器
- 生成器可以掛起執(zhí)行并且保持當(dāng)前執(zhí)行的狀態(tài)
單元測(cè)試相關(guān)的庫(kù)
- nose/pytest 較為常用
- mock 模塊用來(lái)模擬替換網(wǎng)絡(luò)請(qǐng)求等
- coverage 統(tǒng)計(jì)測(cè)試覆蓋率