学习笔记(四)[函数进阶]

作者:加菲猫 2018-09-20 202 0

异常

异常捕获

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

发表评论