如果你學習 python 一段時間之后,會經常碰到命名空間,作用域 這兩個名詞,接下來咱們就從這兩個名詞開始入手,展開這篇博客,
命名空間與作用域
命名空間是指物件所處的位置,命名二字一般指的是變數名,舉一個例子,例如在某個函式內,如果使用了 a = 100 這行代碼,遵循的規則是在這個命名空間內,如果之前沒有變數 a,那此時定義 a 并且對 a 賦值,如果之前存在 a,那對之前的賦值進行覆寫,這個函式內部,就是變數 a 的命名空間,
作用域指的是某個物件的有效作用范圍,這個作用范圍又由命名空間決定,所以在一定程度上,作用域和命名空間可以看成一回事情,只是作用域包含的概念更多一些,里面有物件,查找范圍,查找規則,是一個大的定義,
一般將 Python 的作用域分為 3 類
內建作用域:定義內置函式與內置型別的作用域;全域作用域:最頂層的作用域;區域作用域:一般在函式內部,如果在函式內部在嵌套一個函式,會出現嵌套作用域,
作用域測驗案例:
num1 = 1
num2 = 2
def func():
# 區域作用域
num1 = 5
print(num1, num2) # 5,2
func()
# 全域作用域
print(num1, num2) # 1 2
在函式內部 num1 與 num2 輸出 5 1,在全域作用域下輸出 1 2,
在 func 函式中,num1 被重新賦值,所以函式內部作用域范圍內,num1=5,num2 由于在函式內沒有被賦值,所以會遵循變數作用域查找范圍,從更高級的 全域作用域 中獲取值,得到 num2=2,
相應的在全域作用域下,num1 與 num2 依舊保留原值,因函式內的 num1 是重新定義,與全域作用域中的 num1 不是同一變數,這句話需要反復理解,
再談例外
在 python 中存在兩種錯誤,第一種是運行前錯誤,比較常見的就是語法錯誤,第二種是運行時錯誤,只有當程式運行起來,才會發現錯誤,例如串列索引溢位 BUG,
我們已經非常熟悉通過 try... except... 去捕獲例外了,其中 except 可以多次重復出現,即捕獲不同例外內容,
第一個要回顧的知識點就是處理例外的格式:
except:接受所有例外;except 例外類:僅接受例外類;except 例外類 as 變數:僅接受例外類,并獲取例外類的物件;else:無例外時進行的操作;finally:最終執行代碼,
例外出現紅字之后,關注最下方的一行,就比較容易掌握錯誤的內容,
常見的例外與例外原因:
SyntaxError:語法錯誤,重點排查代碼書寫問題,丟失括號,丟失引號,縮進不對等,比較容易排查;Exception:運行時例外:NameError:找不到變數名就會出現;AttributeError:呼叫不存在的物件屬性時,出現的 BUG;TypeError:型別錯誤,例如數字與字串相加;IndexError:索引錯誤,索引超出就會引發錯誤;KeyError:字典找不到鍵;ImportError:模塊匯入錯誤;UnicodeDecodeError:解碼錯誤;UnicodeEncodeError:編碼錯誤;
python 標準庫
安裝好 python 之后,會自動的的安裝一些標準庫,這些庫可以幫助我們更好的開發程式,
接下來摘錄部分需要初學階段就掌握的標準庫,
日期庫
日期庫主要就是 datetime 和 time,這部分在滾雪球第二季中已經進行了說明:https://dream.blog.csdn.net/article/details/114413866
正則庫
正則運算式不是 python 里面的知識點,而是全編程體系下的知識點,在 python 中重點學習的是 re 庫,該知識點在第二季中也有涉及,請查閱:https://dream.blog.csdn.net/article/details/114648366,
數學函式庫
一些常用的數學函式,例如三角函式,對數等內容在 math 模塊中,這個模塊在之前的系列中沒有進行過多的說明,本篇博客進行適當補充,
math 中的常量
math.pi:常量 π;math.e:常量 e;
math 中的函式
在列清單之前,先通過 dir 進行整體查閱:
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh',
'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp',
'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p',
'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
sin:正弦;cos:余弦;tan:正切;pow:乘方;sqrt:平方根;radians:獲取弧度;degree:獲取角度;log:獲取自然對數,
以上函式都在特定場景下有用,不做案例展開,
urllib 模塊
該模塊用于請求網路資料,由于日常寫爬蟲程式使用第三方 requests 模塊比較多,一直忽略該模塊,今天將其補齊,
urllib.request.urlretrieve 函式
使用該函式可以從指定 url 獲取檔案,
from urllib import request
from urllib import parse
request.urlretrieve("https://www.baidu.com/", "./baidu.html")
request.urlopen 函式
通過該函式可以獲取網路資料,獲取的物件,通過呼叫 read 或者 readlines 讀取相應的網路資料,
如果網路請求需要引數,可以通過 parse.urlencode 函式對引數進行 URL 編碼,例如下述代碼:
from urllib import parse
data = parse.urlencode({"q": "爬蟲100例"})
該引數適用于 POST 請求型別,如果為 GET 請求型別,使用如下代碼:
from urllib import request
from urllib import parse
data = parse.quote("爬蟲100例")
res = request.urlopen(f"https://so.csdn.net/so/search?q={data}")
print(res.read())
此處涉及的函式如下:
quote:對字串進行 URL 編碼;unquote:對字串進行 URL 解碼;quote_plus:與quote一致,增加對空白字符的處理;unquote_plus:解碼,
data1 = parse.quote("爬蟲 100 例")
data2 = parse.quote_plus("爬蟲 100 例") # 將空格轉換為 `+`
print(data1, data2)
持久化與序列化
將記憶體中的物件寫入檔案,終止程式之后依然可以繼續使用,這個程序叫做物件持久化,字串可以直接寫入檔案,但是字典或者串列不具備此功能,因為針對這類物件,就出現了序列化相關的概念,將物件轉換成按順序排列的字串形式,就叫做序列化,
將字典持久化
使用 shelve 模塊可以將字典內容存盤到檔案中,shelve物件通過下述代碼實作:
import shelve
d = shelve.open("my_dict")
d.update({"name":"橡皮擦","age":19})
d.close()
運行代碼會在當前檔案夾下生成 3 個檔案,擴展名忽略即可,

讀取 shelve 物件也比較簡單,
import shelve
d = shelve.open("my_dict")
items = d.items()
print(list(items))
將物件 pickle 化
pickle 模塊,也是一個可以將 python 物件進行持久化與序列化的模塊,該模塊常用的 2 個函式如下:
dump:將持久化物件寫入檔案;load:從檔案讀取 pickle 化的物件,
寫在后面
以上內容就是本文的全部內容,希望對學習路上的你有所幫助~
今天是持續寫作的第 227 / 365 天,
期待 關注,點贊、評論、收藏,
更多精彩
- 滾雪球學 Python(完結)
- 滾雪球學 Python 第二輪(完結)
- 滾雪球學 Python 第三輪
- 滾雪球學 Python 番外篇(完結)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/302791.html
標籤:python
