Python 語法總結
原文鏈接:www.jianshu.com
Python 簡明語法總結
!!! 只針對有經驗開發人員
簡單輸入輸出
- 輸出print 10 , 十
- 輸入
name = raw_input()
python基礎
- 數據類型和變數
1、常規類型:整形、浮點型、字元串(以 或者 " 括起來)、布爾值(True, False 奇怪為什麼用大寫)。
2、轉義使用3、多行請用...表示4、布爾運算符:and or not5、空值:None
6、python並無實質常量,只有約定常量,全大寫表示(個人覺得使用objective-c的k開頭表示法也不錯。比如kServerAddress)
- 字元串和編碼
在日常編寫中似乎用不太到字元編碼互轉的功能
1、字元串格式化: hello , %@ % world!使用%s佔位符, 使用 % 表示需要格式化字元串,後跟tuple變數
- 使用list和tuple
1、list其實就是數組,定義:[1, hello]
2、使用len(list)計算數組元素個數
3、使用(1, 2, 3)定義tuple,其實就是不可變的數組。
- 條件判斷和循環
1、
if condition : block elif condition: block else : block
代碼段落需要嚴格縮進,不需要大括弧。2、for item in list: block
3、range(number)可以生成從0 到 number-1的lis4、while condition : block
5、可以使用int(string)或者float(string)獲取對應值
- 使用dict和set
1、字典類型:dict = {key : value}
2、使用dict[key]直接取值會報錯,方法是使用 dict.get(key),如果沒有值會返回None3、使用pop(key)刪除一個item4、set可以看成是在幫你管理一個不可重複元素的列表,並提供一些高級功能,比如聯合()、交(&)、差(-)和對稱差集(^)
函數
- 定義函數
- 空函數:pass
- 類型檢查,python是類型不安全的,所以我們可以通過isinstance(var, (type1, type2))來檢查類型
- 返回多個值,使用tuple。不過可以省略括弧,類似
x, y = 3, 4
- 默認值:
def method(arg1 = arg1)
,注意默認參數只能放到最後 - 可變參數:
def method(*var_arg):
,其中var_arg是一個tuple,可以使用for in
來遍歷 - 關鍵字參數:
def method(**key):
,關鍵字參數不限制傳入的參數個數和類型,會在函數內部組合成一個dict - 參數組合:當定義為
def func(a, b, c=0, *args, **kw):
可以這樣調用:func(*args, **kw)
其中,args為tuple, kw為字典 - 遞歸函數,注意遞歸函數的溢出崩潰問題。python並沒有為尾遞歸做優化,所以還是會崩潰的。
高級特性
- 切片
- array[0:3]:表示從第0個元素開始,取3個
- array[-3:-1]:表示取倒數第三,第二個元素,-1表示最後一個。
- array[::5]:表示每5個取一個元素
- 字元串也可以切片
- 迭代即使用:
for item in array
,array既可以是數組,也可以是字典或者字元串 - 判斷是否可以迭代,
isinstance(object, Iterable)
,判斷對象是否實現了Iterable介面 - 迭代dict:
for key in dict
遍歷key。for value in dict.itervalues()
遍歷value。for k, v in dict.iteritems()
遍歷key和value
- 列表生成使用
range(start, end)
函數 - 混合生成使用簡寫for in 迭代。
[x * x for x in range(1, 10) if x % 2 == 0]
- 也可以使用兩層循環,
[x * y for x in range(1, 10) for y in range(20, 30)]
- 如果你需要一組序列,但是太大,佔用內存過多。那麼可以使用生成器,它是實時計算的列表。
- 將列表生成表達式的
[]
變為()
即可。 - 可以將一個函數變成一個生成器,只需要添加
yield item
語句即可,生成器會在遇到yield的時候返回對應結果,下次next從上次yield之後開始執行。
函數式編程
- 高階函數
- 函數可以賦值給變數,可以當成參數傳遞給函數
- map:對每個列表中得元素作用一個函數,並返回。
- reduce:將結果和下個元素傳給函數,最終返回一個結果。
- filter:過濾器,使用方法跟map差不多,是返回結果為true的元素
- sorted:排序,跟map差不多
- 可以在函數中定義函數,並返回。就像一個變數一樣。
- 閉包:返回的函數可以使用定義函數內部的變數
- 匿名函數即lamdba表達式:lamdba 參數 : 表達式
- 概念:即在函數執行前後加一些邏輯不想管的代碼,比如log
- 實現
def log(func):
@functools.wraps(func)
def wrapper(*args, **kw):
print call %s(): % func.__name__
return func(*args, **kw)
return wrapper
@log
def now():
print 2013-12-25
- 偏函數
- 簡單的講就是創建具有特定模式的函數別名,這個特定模式大概指的是設定好某些參數(默認參數),來達到簡寫的目的。
int2 = functools.partial(int, base=2)
這樣就創建了一個專門轉化二進位的函數了。因為我們設定了默認參數base = 2
- 當參數太多需要簡化的時候就是用偏函數
模塊
- 模塊 一個py文件就是一個模塊,目錄就是包名
- 使用模塊這是一個標準的模塊模板
#!/usr/bin/env python
# -*- coding: utf-8 -*-
a test module
__author__ = Michael Liao
import sys
def test():
args = sys.argv
if len(args)==1:
print Hello, world!
elif len(args)==2:
print Hello, %s! % args[1]
else:
print Too many arguments!
if __name__==__main__:
test()
模塊內部的私有變數和函數一律使用
_
開頭,且不要在外部進行引用。
- 安裝第三方模塊
pip install 模塊名稱
- 使用
__future__
future可以把下個版本的新功能添加到當前版本
面向對象編程
- 類和實例定義類
class ClassName(SuperClass):
pass
構造方法def __init__(self,args)`
- 訪問限制
- 使用
__
雙下劃線開頭可以讓變數成為私有,外部無法訪問。也可以通過添加getter、setter來控制訪問操作。 - 繼承和多態
- 繼承就在定義的時候寫上父類的名稱,多態就覆蓋父類的方法。
- 獲取對象信息
- 使用
type()
判斷類型信息 - 使用isinstance()判斷繼承關係
- 使用dir()獲取對象的所有方法和屬性
面向對象高級編程
- 使用slots
- 動態添加屬性:
instance.pro = 10
- 動態添加方法:
instance.newmethod = MethodType(method_name, instance, class_name)
- 為了防止胡亂添加屬性可以使用
__slots__ = (被允許的屬性)
@property
def score(self):
return self._score
@score.setter
def score(self, value):
if not isinstance(value, int):
raise ValueError(score must be an integer!)
if value < 0 or value > 100:
raise ValueError(score must between 0 ~ 100!)
self._score = value
- 多重繼承
- 最好不要用多重繼承,用mixin
- mixin其中概念,用類來提供一組相似功能。類似實現過的介面。
- 使用類似slots 來定製一個類的行為。
- str 列印類時的信息
- repr直接寫列印出來的信息
- iter 用於
for ... in
迭代,__iter__
返回下一個迭代對象,next()
用於拿到循環的下一個值 - getitem 提供下標訪問
- getattr 當找不到這個屬性的時候會調用這個方法
- call 當使用
instance()
這樣來把對象實例當成方法調用的時候,其實調用的就是__call__
。 - 可以使用
callable(thing)
來判斷一個東西是否可以被當成方法調用
- types():使用它來動態構建類,方法是
types(ClassName, (SuperClass, ), dict(methodName = method))
錯誤、調試和測試
- 錯誤
try...except...finally...
- 錯誤基類是
BaseException
常見的錯誤類型