龜家天天看老鼠廢片, 大概老天覺得太廢的關係, 突然發現家裡有一本良葛格 (RIP) python3.5 技術手冊, 就順便讀一讀複習下, 那個時空連 vscode 都沒有 ROFL ~
ch1 ch2
環境變數關鍵字
安裝完以後重要資料夾 Lib
Scripts
Tools
如果選加入環境變數則 Scripts
也會被包含進去
我自己用 anaconda3 列出來會長這樣, 原版不曉得長怎樣 @. @
1 | import sys |
用 help() 函數以後輸入 keywords
可以列出關鍵字
1 | help> keywords |
可以用 dir(__builtins__)
取得常用函數跟類別
1 | dir(__builtins__) |
配合 loop 又可以做出 打字練習 的殭屍字典 XD
1 | for word in dir(__builtins__): |
最後新建 python 檔案用 UTF8 檔首無 BOM 就對了! 不然會噴亂碼, 其他一律 ban ~
套件
資料夾中一定要有一個 __init__.py
才會被視為一個套件, 套件名稱為資料夾名稱
1 | cow |
假如要從 lasai 呼叫 cow 裡面的 xx.py
要這樣用
1 | import cow.xx |
import
as 這最常看到的用法應該是 numpy 這類的東東
1 | import numpy as np |
也可以用 from 這種懶人用法
1 | from sys import argv |
用逗點隔開可以一次處理多個, 也可以用 *
不過不建議會有名稱衝突的問題
1 | from sys import argv, path |
也可以從套件匯入模組
1 | from lasai import gg |
ch3
數值均為 int
沒有 long
複數, 希望不要用到 XD
1 | >>> type(3.14) |
字串會有 escape 的問題, 如果不要 escape 可以在前面加上 r
1 | print('c:\xx') |
跟 c# 一樣要換行需要用三個引號
1 | print("""ooooooo |
可以用 str
來做到 c# 的 Convert.ToString
功能
1 | str(123) |
可以用 {}
做出 c# template string 效果
1 | print('name={} , age={}'.format('qq', 18)) |
後來發現 3.6 也可以跟 js c# 一樣直接把變數放裡面就好了,不過要多加個 f
在前面就是, 不用多搞個 format
1 | age = 18 |
可以用 []
來當作索引取得某個 char, 並且可以用 in
來判斷是否這個 char 在 string 裡, 搭配切片可以取感興趣的區塊 ROI
1 | >>> name = '曹休蔣幹華雄曹爽' |
另外他的步進值也可以用負的, 所以可以拿來反轉 array
1 | text = '12345' |
Tuple
只要在數值後面加上逗號就可以做出來
1 | >>> 10, |
可以用 Tuple 拿來做這種噁心的交換
1 | >>> x = 10 |
Set 可以用這種噁心的符號做出 sql 常用的效果 & 可以交集 intersect
| 聯集 union
- 則可以做出 except minus
^ 互斥
1 | a = {1,2,3} |
練習1 做出下面效果
1 | python .\exercisel.py qq gg no go yy |
sys.argv[0] 為檔案名稱
1 | import sys |
練習2 做出下面效果
1 | python .\excercise2.py gg oo gg gg |
書上提示用 count 可以算出次數
1 | import sys |
問 AI 還可以用 Counter 這咚咚
1 | import sys |
ch4
while
while 迴圈有 else 這啥鬼語法, 而且非用 break
跳出的話都會執行 else
1 | while False: |
這邊因為是用 break 跳出, 所以不會直營 else
書上建議直接把 while else ban 了 XD
1 | num = 0 |
for
一般常見程式語言如 js for 迴圈會長這樣
1 | var list = [1,2,3] |
python 卻特別噁心要搞個 range, 如果想要輸出 index 的話需要這樣操作, 而且 for 也有 for in else 語法不過一樣被 ban
1 | my_list = [1,2,3] |
不然就要用 enumerate
1 | my_list = [1,2,3] |
並且注意到 range
的第二個參數為終止條件, 所以輸出 0 ~ 9 要這樣寫
1 | for i in range(0,10): |
另外 python 還有噁心的 for comprehension
而且只要給他相應的符號他就會建立想要的東東
- [] list
- {} dict
- () generator
1 | nums = [1, 2, 3, 4] |
def 定義函數
python 也有 local function, 這個在 js 最常用應該是有遞迴呼叫這種情況希望裡面多包一層, 不過要注意需要先定義才呼叫, 像這樣寫會掛點
1 | def qq(): |
這樣寫就過了 ooxx.. 被 js 荼毒的下場
1 | def qq(): |
python 沒有 overload (到底什麼垃圾語言 怒 ~), 這樣寫第二函數個會覆蓋第一個函數
1 | def greet(name): |
常用的替代方案是加上 * or **
*
表示 tuple
1 | def sum(*numbers): |
**
表示 字典 dict
1 | def show_info(**kwargs): |
他們也可以搭配一起用, 好噁心
1 | def some(*arg1, **arg2): |
ch5
import
一個 .py
就是一個模組, 可以用 dir
來看模組裡面的東東
1 | import numpy |
可以定義模組然後 import 來用
mygame.py
1 | def gg(): |
1 | import mygame |
也可以用懶人用法法呼叫 mygame 裡面的 gg
1 | from mygame import gg |
也可以用 from xxx import *
不過會發生命名衝突, 所以就忘了它吧! 他會把所有不含底線公開的內容都給匯入
類別
可以用以下這種方法定義類別, __init__
是建構子, 第一個參數約定俗成為 self
, __str__
則跟 c# 的 ToString 差不多, 兩個底線表示魔術方法
1 | class Person: |
如果需要把參數設定為私有要這樣寫, 不過還是可以訪問他的私有變數只不過要改寫這樣 p._Person__name
1 | class Person: |
如果想搞出 c# getter 需要加上 @property
標註即可
1 | class Person: |
如果想要 getter 與 setter 則這樣寫, 怎麼覺得 getter setter 在 python 變得好囉嗦
1 | class Person: |
ch6
繼承的時候只要把父類別放在子類別的建構子即可 class Groundhog(Marmot)
1 | # 土撥鼠 |
這裡一樣不管型別是啥, 只要方法對了就可以用傳遞函數的方式呼叫
1 | import marmot |
可以用 isinstance 來判斷型別
1 | def dig(x): |
如果想要基於父類的功能來使用 function 的話, 可以用 super()
1 | class Groundhog(Marmot): |
1 | import marmot |
抽象方法需要加入 abc 模組, 剛開始看到還以為在寫幹話 XD, 不過書上是用 ABCMeta
好像比較舊版的用法
只需要標示 @abstractmethod
就可以搞出抽象方法
1 | from abc import ABC, abstractmethod |
想要用 enum 則是需要用以下這種方式
1 | from enum import IntEnum |
另外 python 竟然支援多重繼承 -. -“
印象以前學 c++ 這個功能不是臭掉了嗎 XD
這裡就利用多重繼承來建立一隻機甲土撥鼠
這裡一樣可以在建構子這樣寫 super().__init__
省略一些麻煩
這裡萬一方法名稱重複的話需要注意下, 會先找子類, 接著由左往右找父類
1 | # 機器土撥鼠 |
用法也沒兩樣
1 | m = marmot.MechaMarmot('qq',120,'abc') |
最後還有 Rich comparison 方法, 有 __lt__()
__le__()
__eq__()
__ne__()
__gt__()
__ge__()
等, 用到再說 XD
ch7
可以用 try except
來做出例外處理的效果
1 | total = 0 |
要小心以下寫法, 會跳不出迴圈, 所有例外都是 BaseException 的子類, 當使用 except 沒指定例外型態時, 就是比對 BaseException
1 | while True: |
如果指定了 Exception 就可以透過 ctrl + c 跳出
1 | while True: |
python 的 raise 等同於 c# 的 throw
1 | def health(hp): |
另外還有這樣的語法可以使用, 如果沒錯就跑 else 那段, 最後則一定跑 finally
1 | try: |
此外還有類似 c# using 的語法, with as 會自己在 finally 幫你關閉釋放資源
1 | import sys |
在 fastapi 也可以看到這樣的寫法
1 | def get_db(): |