Python 學習筆記(四)[函式進階]
阿新 • • 發佈:2018-11-27
異常
異常捕獲
try:
myfile = open('1.txt')
except Exception:
print('開啟檔案錯誤')
else:
print('開啟檔案')
myfile.close()
finally:
print('開啟檔案結束')
- 自定義異常
class MyError(Exception):
print('自定義錯誤')
def func():
raise MyError('錯誤')
func()
- 斷言
assert 1 == 0
- with…as…(自動做收尾工作)
with open('1.txt') as myfile:
for var in myfile:
print(var)
pickle 模組
- 記憶體
import pickle
mylist = [1,2,3]
# 把資料轉化為二進位制
obj = pickle.dumps(mylist)
# 二進位制轉化為資料
obj2 = pickle.loads(obj)
# [1,2,3]
print(obj2)
- 檔案
import pickle # 寫 mylist = [1,2,3] myfile = open('1.txt','wb+') pickle.dump(mylist,myfile) myfile.close() # 讀 myfile = open('1.txt','rb') obj = pickle.load(myfile) # [1,2,3] print(obj)
閉包
- 目的:內部函式繼承外部函式中的變數,維持資料的狀態,延長變數的生命週期,變數私有化
def outfunc(num):
def infunc(num1):
print(num + num1)
# 閉包:返回內部函式
return infunc
func = outfunc(10)
func(20)
func(30)
func1 = outfunc(10)
func1(40)
func1(50)
裝飾器
- 原理:閉包函式
- 目的:在不修改函式的情況下,為函式擴充功能
- 裝飾函式模型
def _func(func): def _func1(): return func() return _func1
- 無引數
# 定義裝飾器
def func1(func):
# 閉包:變數 → 函式
def add_func():
print('新增的功能')
return func()
return add_func
# 用 func1 裝飾 func2
@func1
def func2():
print('hello')
# 新增的功能
# hello
# func1(func2)()
func2()
- 裝飾帶引數的方法
# 定義一個裝飾器
def func1(func):
def func2(x,y):
x = 1
y = 2
# 呼叫外部方法的引數方法,返回
return func(x,y)
# 返回內部方法
return func2
# 使用裝飾器修飾方法
@func1
def func(x,y):
print(x + y)
# 3
func(10,20)
- 帶引數的裝飾器
def arg_func(arg):
def _func(func):
def _func1():
if arg == 'good':
print('出去玩')
if arg == 'bad':
print('在家睡覺')
return func()
return _func1
return _func
@arg_func('good')
def func1():
print('good day')
@arg_func('bad')
def func2():
print('bad day')
# arg_func:裝飾器只能接收函式作為引數
# arg_func → _func:接收裝飾器的引數
# _func → _func1:閉包函式,新增功能
# _func1 → func:執行功能,執行被裝飾的函式
爬蟲
from urllib.request import *
import re
# 地址
url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E6%98%9F%E7%A9%BA&oq=xingk&rsp=0'
# 開啟一個網頁
html = urlopen(url)
# 獲取 html 程式碼
obj = html.read().decode()
# 正則匹配:. → 任意字元、* → 任意次、? → 非貪婪(每個地址作為整體)
urls = re.findall(r'"objURL":"(.*?)"',obj)
# 下載
index = 0
for var in urls:
try:
print('downloading...%d' % index)
if re.search('.jpg$',var):
urlretrieve(var,'pic' + str(index) + '.jpg')
index += 1
if re.search('.png$',var):
urlretrieve(var,'pic' + str(index) + '.png')
index += 1
if re.search('.gif$',var):
urlretrieve(var,'pic' + str(index) + '.gif')
index += 1
except Exception:
print('download error...%d' % index)
finally:
print('download complete')