一、闭包函数
简单来说闭包函数是传参的另外一种方式,将参数+函数包在一起返回出去。
1.两种为函数传参的方式
# 1.使用参数的形式 def func(x): print(x) func(1) func(1) # 2.包给函数 def outter(x): def inner(): print(x) return inner f = outter(1) f() f()
2.闭包函数的应用
闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。
应用领域:延迟计算(原来我们是传参,现在我们是包起来)、爬虫领域。
import requests def outter(url): def inner(): response = requests.get(url) print(f"done: {url}") return inner baidu = outter('www.baidu.com') python = outter('https://www.python.org') baidu() baidu() python() python()
二、装饰器
装饰器本质就是一个函数a,装饰的对象也是一个函数b,用一个函数a去装饰一个函数b
装饰器的实现必须遵循两大原则:
- 不修改被装饰对象的源代码
- 不改变被装饰对象的调用方式
# 装饰器模板 def deco(func): def wrapper(*args, **kwargs): # 逻辑代码 res = func(*args, **kwargs) return res return wrapper # 装饰器具体使用 import time def time_count(func): def wrapper(*args, **kwargs): start = time.time() res = func(*args, **kwargs) end = time.time print(f'{func} run time is {end - start}') return res return wrapper # 装饰器使用方式1 def index(): print('index hahahahahahahahahahahhahaha') time.sleep(1) index = time_count(index) index() # 此处index() = wrapper() # 装饰器使用方式2 @time_count def index(): print('index hahahahahahahahahahahhahaha') time.sleep(1) # 理解函数对象之后能更好的理解装饰器 # 这里的index即作为函数的参数传递给了time_count,又作为函数wrapper的返回值,返回给了index
三、迭代器
迭代器:更新换代,重复,基于上一次的结果推出下一次的结果
# 可迭代对象 (具有__iter__方法) x = 1 # 不可迭代对象 s = 'nick' # 可迭代对象 lt = [1, 2, 3] # 可迭代对象 dic = {'a': 1, 'b': 2} # 可迭代对象 tup = (1,) # 元组只有一个元素必须得加逗号# 可迭代对象 se = {1, 2, 3} # 可迭代对象 f = open('time.py') # 可迭代对象 def func(): # 不可迭代对象 pass # 有__iter__()方法的对象就是可迭代对象,然后除了数字类型和函数都是可迭代对象 # 可迭代对象通过__next__()方法依次取值 # 迭代器对象:具有__iter__以及__next__方法的叫做迭代器对象 s = 'nick' # 可迭代对象,不属于迭代器对象 lt = [1, 2, 3] # 可迭代对象,不属于迭代器对象 dic = {'a': 1, 'b': 2} # 可迭代对象,不属于迭代器对象 tup = (1,) # 元组只有一个元素必须得加逗号# 可迭代对象,不属于迭代器对象 se = {1, 2, 3} # 可迭代对象,不属于迭代器对象 f = open('time.py') # 可迭代对象,迭代器对象 # 只有文件是迭代器对象 # for循环原理(迭代循环) lt = [1, 2, 3] lt_iter = lt.__iter__() while True: try: print(lt_iter.__next__()) except StopIteration: break for i in lt: # 可迭代对象;迭代器对象 不依赖索引取值,而是迭代取值. print(i) # 1.首先使用iter把lt变成迭代器对象;对于文件也要使用iter方法把文件再一次iter下 # 2.然后使用next方法进行迭代取值 # 3.判断StopIteration异常,遇到异常终止 # 可迭代对象:具有__iter__方法的对象就是可迭代对象,除了数字类型和函数都是可迭代对象。 # 迭代器对象:具有__iter__和__next__方法的都是迭代器对象,只有文件时迭代器对象. # 迭代器对象一定是可迭代对象;可迭代对象不一定是迭代器对象.