這是個人學習筆記,非教程,內容會有些混亂
極簡教程
資料類型
我們可以使用type()
函數類擷取對象的類型,Python3中內建資料類型包括:None,int,float,complex,str,list,dict,tuple,set,frozenset,range
等,Python2中還有long
類型,Python中並沒有內建數群組類型。
dict,list,set
這些是可變類型(使用者自訂類型也可變),可以改變類型對象的值;數值和字串類型則是不可變的。
str
與js一樣,python中字串即可用單引號也可用雙引號表示
numbers
Python3中數實值型別有:int
和float
兩種
list
字面量表示:[1,1.0,False,'list']
列表推導式,建立列表的一種簡易方法:
tuple
字面量表示:(1,1.0,False,'tuple')
range
list、tuple、range均屬於序列類型(Sequence Types)
dict
set/frozenset
集合是不包含重複元素的資料集,frozenset是不可變的,set是可變的,可以使用字面量構建一個集合{1,2,2,4,5}
會輸出{1,2,4,5}
類型轉換
Python中類型轉換隻需調用相關函數即可
函數
# 函數定義模板def func_name([self,][args]): passdef say_hello(): print('hello python!')# python3.5之後,定義函數時可以添加類型說明# 這裡只是提供一個說明文檔而非強制類型約束def type_instruction(num:int)->int: return num
定義多傳回值函數
# 多傳回值函數,返回一個tuple對象def multi_returns(): return 0,1
內建函數
Python中有許多內建函數:
lambda
Python中使用lambda
關鍵字即可建立lambda運算式:
*args 與 **kvargs
*args
和**kvargs
都用於函數中接收多個參數,這裡args
和kvargs
只是約定俗成的寫法,可以換成其它的名稱,但*
和**
則是必須的。
*args
和**kvargs
的區別是,*args
用於接受普通參數,**kvargs
用於接受索引值對參數。
三元運算子
物件導向
Python中一切皆對象(這句話理解起來並不是那麼容易),包括函數(C#,JAVA中函數不能獨立存在)。這裡貼一篇以前寫的文章:Python中的類、對象、繼承
Python按引用傳遞對象,對於不可變對象在修改時會產生新的對象;而對於可變對象,所有的修改都會反映在原有對象上。
魔術方法是Python物件模型的重要部分。
可以動態給對象/類型添加屬性,若給類型添加屬性,則該屬性在已產生的執行個體上也是可見的:
異常與錯誤
Python中異常與錯誤類間關係如下:
自訂異常只需繼承Exception
或各種Error
類即可
異常處理
try: raise IOError('使用raise語句拋出異常')except IOError as err: print(err)else: print('未發生異常則執行')finally: pass
捕獲多個異常類型:
try: raise IOError()except (IOError,TypeError): pass
with語句
with...as...
語句等價於try...finally...
,與C#中的using
語句類似
命名規範
module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, instance_var_name, function_parameter_name, local_var_name.
應該避免的名稱
- 單字元名稱, 除了計數器和迭代器.
- 包/模組名中的連字號(-)
- 雙底線開頭並結尾的名稱(Python保留, 例如init)
命名規範
- 所謂”內部(Internal)”表示僅模組內可用, 或者, 在類內是保護或私人的.
- 用單底線(_)開頭表示模組變數或函數是protected的(使用import * from時不會包含).
- 用雙底線(__)開頭的執行個體變數或方法表示類內私人.
- 將相關的類和頂級函數放在同一個模組裡. 不像Java, 沒必要限制一個類一個模組.
- 對類名使用大寫字母開頭的單詞(如CapWords, 即Pascal風格), 但是模組名應該用小寫加底線的方式(如lower_with_under.py). 儘管已經有很多現存的模組使用類似於CapWords.py這樣的命名, 但現在已經不鼓勵這樣做, 因為如果模組名碰巧和類名一致, 這會讓人困擾.
Python之父Guido推薦的規範
Type |
Public |
Internal |
Modules |
lower_with_under |
_lower_with_under |
Packages |
lower_with_under |
|
Classes |
CapWords |
_CapWords |
Exceptions |
CapWords |
|
Functions |
lower_with_under() |
_lower_with_under() |
Global/Class Constants |
CAPS_WITH_UNDER |
_CAPS_WITH_UNDER |
Global/Class Variables |
lower_with_under |
_lower_with_under |
Instance Variables |
lower_with_under |
_lower_with_under (protected) or __lower_with_under (private) |
Method Names |
lower_with_under() |
_lower_with_under() (protected) or __lower_with_under() (private) |
Function/Method Parameters |
lower_with_under |
|
Local Variables |
lower_with_under |
|
包與模組
模組
包含Python語句或定義的檔案就是一個模組,檔案名稱就是模組名。在一個模組中,模組名是全域變數__name__
的值。
包
包含__init__.py
檔案的檔案夾即可視為一個包,包用於管理模組,可以防止模組命名衝突。如:A.C
和B.C
,分別表示A包中的C模組和B包中的C模組。
匯入模組:
import a
、import a as alias
、from a import *
、from a import b,c
Python解譯器會先從內建模組中尋找匯入的模組,然後從sys.path
中指定的模組搜尋路徑尋找模組
測試
編寫一個檔案操作類,檔案名稱為file_operator.py
:
# coding=utf-8import codecsclass FileOperator: def save_file(self, file_path, content, encoding="utf-8"): with codecs.open(file_path, "w", encoding) as f: f.write(content)
編寫測試案例,檔案名稱為test_file_operator.py
:
# coding=utf-8import unittestclass TestFileOperator(unittest.TestCase): def test_save_file(self): content = "file content \r\n 常值內容" opt = file.FileOperator() opt.save_file("1.txt", content)if __name__ == "__main__": unittest.main()
工具推薦
小結
以上是自己近期學習Python的一些總結,全文的主要關注點在Python語言本身。掌握以上內容後,便可以用Python寫些指令碼,輔以其他第三方包或架構就可以幹更多更複雜的事了。如,爬蟲、資料分析、後端開發以及現在比較熱的人工智慧(其實,我是不建議追熱點的)。
用了一段時間的Python後,會覺著Python挺有意思的。
最後附上一張,個人總結的語言學習套路:
推薦閱讀
人生苦短,為什麼我要用Python?
Python風格規範
Python語言規範
[Python]記憶體管理
Python進階
Python 入門指南
Python 3.7.0 documentation