Python常忘的基礎知識
0.目錄
1.進位制
- 1.1 各進位制的表示
1.2 各進位制的轉換
2.字元
- 2.1 轉義字元
2.2 原始字串
3.型別
- 3.1 基本資料型別
3.2 type()
4.變數與運算子
- 4.1 值型別與引用型別
- 4.2 列表的可變與元組的不可變
4.3 運算子
5.包與模組
- 5.1 Python專案的組織結構
- 5.2 匯入模組
- 5.3 __init__.py的用法
- 5.4 模組內建變數
- 5.5 入口檔案
- 5.6 __name__的經典應用
5.7 相對匯入和絕對匯入
6.函式
- 6.1 認識函式
- 6.2 序列解包與鏈式賦值
- 6.3 必須引數、關鍵字引數、預設引數
- 6.4 可變引數、關鍵字可變引數
6.5 global關鍵字
1.進位制
1.1 各進位制的表示
0b(零b)表示二進位制
0o(零o)表示八進位制
0x(零x)表示十六進位制
1.2 各進位制的轉換
bin() 將其他進位制數轉化為二進位制
int() 將其他進位制數轉化為十進位制
hex() 將其他進位制數轉化為十六進位制
oct() 將其他進位制數轉化為八進位制
2.字元
2.1 轉義字元
轉義字元:
- 特殊的字元
- 無法“看見”的字元
- 與語言本身語法有衝突的字元
- \n 換行
- \r 回車
- ' 單引號
\t 橫向製表符
2.2 原始字串
用 r'字串' 或 R'字串' 表示原始字串
3.型別
3.1 基本資料型別
有序(序列):- 列表 list
元組 tuple
無序:
- 集合 set
- 字典 dict
序列共有的操作:
- len() 求序列的長度
- max() 求最大元素
- min() 求最小元素
- ord() 求ASCII碼值
集合的操作:
{1,2,3,4,5,6} - {3,4} 為 {1,2,5,6}
{1,2,3,4,5,6} & {3,4} 為 {3,4}
{1,2,3,4,5,6} | {3,4,7} 為 {1,2,3,4,5,6,7}
字典的規則:
- 不能有相同的key
- key的取值:必須是不可變型別,如int str tuple
value的取值:str int float list set dict
3.2 type()
type((1)) 是 int
type((1,)) 是 tuple
type(('hello')) 是 str
type([1]) 是 list
定義空元組:type(())
定義空集合:type(set())
定義空字典:type({})
4.變數與運算子
4.1 值型別與引用型別
值型別:int str tuple(不可變)
引用型別:list set dict(可變)
id()函式顯示變數在記憶體中的地址
4.2 列表的可變與元組的不可變
列表可改變
元組不可改變
4.3 運算子
1.算術運算子:加減乘除、取餘%、乘方
2.賦值運算子
3.比較(關係)運算子
不只是數字才能做比較運算:
4.邏輯運算子:and(與)、 or(或)、 not(非)
5.成員運算子:in、not in
6.身份運算子:is、not is
如何判斷變數的值、身份與型別?**
- 用 == 比較值是否相等
- 用 is 比較身份是否相等,即比較兩個變數的記憶體地址是否相等,可以用 id() 檢視變數的記憶體地址
- 用 isinstance() 比較型別是否相等,不推薦使用 type(a) == int 這種方法,而是使用 isinstance(a, str) 這種方法。而且還可以使用 isinstance(a, (int, str, float)) 判斷a是不是int, str, float中的任意一種。最重要的是type不能判斷變數的子類是否屬於某種型別,但是isinstance可以
ps:物件的三個特徵:id、value、type(分別用is、==、isinstance)
7.位運算子(把數字當做二進位制數進行運算):
&(按位與)
|(按位或)
^(按位異或)
~(按位取反)
<<(左移動)
>>(右移動)
5.包與模組
5.1 Python專案的組織結構
包 → 模組 → 類 → 函式、變數
包相當於資料夾
名稱空間:包名.模組名
如何讓普通資料夾成為包?——必須包含__init__.py檔案
__init__.py檔案本身也是一個模組
包下__init__.py的模組名就是包名
5.2 匯入模組
import匯入模組:
- import 模組名 as xxx
- import 包名.模組名 as xxx——print(包名.模組名.變數名)
from import 匯入模組
- from 包名.模組名 import 變數名
- from 包名 import 模組名
- from 包名.模組名 import *
在模組中設定 __all__ = ['a', 'c'] 可以控制 from 包名.模組名 import * 匯入的變數為a和c
5.3 __init__.py的用法
**匯入包時會自動執行 __init__.py 檔案**
在 __init__.py 檔案使用 __all__ = ['c1'] 可以控制匯入的模組為 c1.py
包與模組的幾個常見錯誤:
- 包和模組是不會被重複匯入的
- 避免迴圈匯入
匯入模組時Python會自動執行匯入模組裡面的所有程式碼
5.4 模組內建變數
dir()函式返回當前模組所有的變數:
內建變數:
- name 是模組的完整名稱(包括名稱空間)
- package 是包名
- doc 是模組的註釋
file 是當前模組在系統裡面的物理路徑
不同的執行:
5.5 入口檔案
入口檔案會導致內建變數的不同
- 如果一個普通的.py檔案被當作應用程式的入口,那麼它的變數 **__name__** 就不再是本身模組的名稱,而是會被強制更改為 **__main__**
如果一個普通的.py檔案被當作應用程式的入口,那麼它的頂級是不會再有包的如果一個普通的.py檔案被當作應用程式的入口,那麼它的變數 **__file__** 不再是絕對路徑,而是和執行python命名所在目錄有關
5.6 __name__的經典應用
使用dir()函式檢視模組或類相關的變數:
Make a script both importable and executable
if __name__ == "__main__":
Python指令碼既可以作為一個普通的模組提供給其它應用程式來呼叫,也可以讓它自己成為一個可執行的檔案。
__name__的經典應用:
使用 python -m 命令將一個可執行檔案當作一個普通的模組:
ps:普通的模組必須要有包
5.7 相對匯入和絕對匯入
決定頂級包的是可執行檔案
絕對匯入(絕對路徑):
- import 頂級包...中間包...模組名
- 絕對引入一定要從頂級包開始
相對引入:
- . 表示當前目錄
- .. 表示上一級目錄
在入口檔案中不能進行相對匯入:
相對路徑之所以能夠找到對應的模組,在於根據內建變數 __name__ 來定位。但是由於 main.py 是入口檔案, __name__ 被強行改成 __main__ ,但是 __main__ 這個模組不存在,所以在入口檔案中不可以使用相對路徑來匯入模組
6.函式
6.1 認識函式
round()函式用於保留幾位小數(自動四捨五入):
如何限制函式遞迴層數:
import sys
sys.setrecursionlimit(1000)
如何讓函式返回多個結果:
- 返回元組
序列解包
6.2 序列解包與鏈式賦值
序列解包(數量要相等):
鏈式賦值:
將a, b, c = 1, 1, 1
改為a=b=c=1
6.3 必須引數、關鍵字引數、預設引數
1.必須引數——形參、實參
形參:
實參:
2.關鍵字引數
不用按必須引數的順序傳遞,隨意順序
3.預設引數
6.4 可變引數、關鍵字可變引數
1.可變引數
必須引數必須放在可變引數前面
可以把預設引數放在可變引數後面,然後利用關鍵字引數傳值
使用*a來解包元組:
2.關鍵字可變引數
傳入任意個數的關鍵字可變的引數:
遍歷字典:items
使用**a來解包字典:
ps:什麼引數都不傳,param 將為空字典
6.5 global關鍵字
global關鍵字:宣告全域性變數