這是個人學習筆記,非教程,内容會有些混亂
極簡教程
資料類型
我們可以使用
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']
,建立清單的一種簡易方法:
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]):
pass
def say_hello():
print('hello python!')
# python3.5之後,定義函數時可以添加類型說明
# 這裡隻是提供一個說明文檔而非強制類型限制
def type_instruction(num:int)->int:
return num
定義
多傳回值# 多傳回值函數,傳回一個tuple對象
def multi_returns():
return 0,1
内置函數
Python中有許多
:
- dir
函數來檢視對象都含有哪些成員:dir()
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 | ||
Classes | CapWords | _CapWords |
Exceptions | ||
Functions | lower_with_under() | _lower_with_under() |
Global/Class Constants | CAPS_WITH_UNDER | _CAPS_WITH_UNDER |
Global/Class Variables | ||
Instance Variables | _lower_with_under (protected) or __lower_with_under (private) | |
Method Names | _lower_with_under() (protected) or __lower_with_under() (private) | |
Function/Method Parameters | ||
Local Variables |
包與子產品
- 子產品 包含Python語句或定義的檔案就是一個子產品,檔案名就是子產品名。在一個子產品中,子產品名是全局變量
的值。__name__
- 包 包含
檔案的檔案夾即可視為一個包,包用于管理子產品,可以防止子產品命名沖突。如:__init__.py
A.C
,分别表示A包中的C子產品和B包中的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-8
import codecs
class 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-8
import unittest
class 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]記憶體管理](
https://chenrudan.github.io/blog/2016/04/23/pythonmemorycontrol.html) Python進階 Python 入門指南 Python 3.7.0 documentation