1. 程式人生 > >Python 學習筆記(四)[函式進階]

Python 學習筆記(四)[函式進階]

異常

異常捕獲

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')