闭包函数
1.闭包函数必须在函数内部定义
2.闭包函数可以引用外层函数的名字
闭包函数是 函数嵌套、函数对象、名称空间与作用域 结合体。
直接调用
# def func(x):
# print(x)
# func(1010)
通过闭包函数传参
# def outer(number):
# print(number)
# def inner():
# print(number)
# return inner
#
# func = outer(100)
# func()
直接传入地址,爬取小哥哥的博客
# import requests
# def spider_func(url):
# response = requests.get(url)
# if response.status_code == 200:
# print(len(response.text))
# print(response.text)
# url = 'https://www.cnblogs.com/zhulipeng-1998/'
# spider_func(url)
通过闭包传入地址,爬取小哥哥博客
# import time
# import requests
# def spider_outer(url):
# def spider_inner():
# start_time = time.time()
# response = requests.get(url)
# end_time = time.time()
# if response.status_code == 200:
# print(f'爬取需要的时间{end_time - start_time}')
# print(len(response.text))
# print(response.text)
# return spider_inner
# spider_jingdong = spider_outer('https://www.cnblogs.com/zhulipeng-1998/')
# spider_jingdong()
试着让用户输入网址爬出内容,没有成功
import time
import requests
def spider_outer(url):
def spider_inner():
start_time = time.time()
response = requests.get(url)
end_time = time.time()
if response.status_code == 200:
print(f'爬取需要的时间{end_time - start_time}')
print(len(response.text))
print(response.text)
return spider_inner
chioce = input('请输入爬取网址:')
spider_chioce = spider_outer('chioce')
spider_chioce()
装饰器:
不修改被装饰对象的源代码
不修改被装饰对象的调用方式
闭包传入,添加计时功能
# import time
#
# def time_record(func):
# start_time = time.time()
# func()
# end_time = time.time()
# print(f'下载电影消耗的时间{end_time - start_time}')
# return '苍天老师的大片'
# def download_movie():
# print('开始下载电影....')
# time.sleep(5)
# print('电影下载成功...')
# return
# res = time_record(download_movie)
# for i in res:
# print(i)
初级装饰器,无返回值
# import time
# def download_movie(name):
# print('开始下载电影.....')
# time.sleep(3)
# print('电影下载成功.....')
# return f'{name}救援队高清无码.mp4'
#
# def time_record(func):
# def inner(*args, **kwargs):
# start_time = time.time()
# res = func(*args, **kwargs)
# end_time = time.time()
# print(f'下载消耗时间{end_time - start_time}')
# return res
# return inner
# download_movie = time_record(download_movie)
# download_movie(name='nick')
有返回值,但是没有接收到,打印了res,不知道对不对
# import time
# def download_movie():
# print('开始下载电影.....')
# time.sleep(3)
# print('电影下载成功.....')
# return '救援队高清无码.mp4'
#
# def time_record(func):
# def inner(*args, **kwargs):
# start_time = time.time()
# res = func(*args, **kwargs)
# print(res)
# end_time = time.time()
# print(f'下载消耗时间{end_time - start_time}')
# return res
# return inner
#
# download_movie = time_record(download_movie)
# download_movie()
最终版本
# def wrapper(func):
# def inner(*args,**kwargs):
# username = input('请输入名字')
# if username == 'dsb':
# res = func(*args,**kwargs)
# return res
#
# else:
# print('用户权限不足')
# return inner
#
# def func1():
# pass
#
# func1 = wrapper(func1)
# func1()
### def wrapper(func):
def inner(*args,**kwargs):
res = func(*args,**kwargs)
return res
return inner
魔法糖
import time
'''def wrapper(func):
def inner(*args,**kwargs):
res = func(*args, **kwargs)
return res
return inner
@wrapper
def func1():
pass
def func2():
pass
func1()'''