1.函数
1.函数可以作为参数进行传递
2.函数可以作为返回值进行返回
3.函数名称可以当成变量一样进行赋值操作
#1.函数可以作为参数进行传递
def force_fn(fn): #其中参数fn为函数
fn() #执行此函数
#2.函数可以作为返回值进行返回
def func():
def inner():
print('123')
return inner
ret = func() #其中ret为函数inner
ret() #执行ret函数
#3.函数名称可以当成变量一样进行赋值操作
def func1():
print('函数1')
def func():
print('函数2')
func1 = func2
func1() #此时输出 函数2
2.装饰器
作用:在不改变原有函数调用的情况下,给函数增加新的功能
即可以在函数前面增加新的功能,但不改变原来的代码
#通用装饰器的写法:
def wrapper(fn): #wrapper:装饰器, fn:目标函数
def inner(*args,**kwargs):
#在目标函数执行之前添加代码...
ret = fn(*args,**kwargs) #执行目标函数
#在目标函数执行之后添加代码...
return ret
return inner
#使用装饰器
@wrapper
def target():
pass
注:一个函数可以使用多个装饰器
@wrapper1
@wrapper2
def target():
pass
执行顺序(嵌套规则): wrapper1 wrapper2 target wrapper1 wrapper2
3.迭代器
可迭代的数据类型都会提供迭代器,即可以使⽤for来循环遍历的对象就是可迭代对象。
什么是迭代器?
import collections
a = [1,2,3]
b1 = iter(a)
b2 = a.__iter__()
#b1,b2为迭代器
#将列表转为迭代器
c1 = list(b1)
c2 = list(b2)
#c1,c2为列表
import collections
print(isinstance(b1, collections.Iterator)) 判断是否迭代器
print(isinstance(a, collections.Iterable)) 判断是否可迭代对象
迭代器一定是可迭代对象,可迭代对象不一定是迭代器
迭代器优点:
1.只能向前,不能反复
2.特别节省内存,一次次迭代出数据
3.惰性机制,调用一次next,出来一个数据
获取迭代器的两种方案:
1.iter()内置函数
2.__iter__() 特殊方法
从迭代器中拿到数据:
1.next() 内置函数
2.__next__() 特殊方法
a = '123'
b1 = iter(a)
b2 = a.__iter__()
#b1,b2为迭代器
#迭代器只能单向迭代,不可循环迭代
print(next(b1))
print(next(b1))
print(next(b1))
print(b2.__next__())
print(b2.__next__())
print(b2.__next__())
4.生成器
生成器的本质就是迭代器
创建生成器的两种方案:
1. 生成器函数
2. 生成器表达式
1.生成器函数
生成器函数中有一个关键字yield
生成器函数执行的时候, 并不会执行函数, 得到的是生成器.
yield: 只要函数中出现了yield. 它就是一个生成器函数
作用: 1. 可以返回数据文章来源:https://www.toymoban.com/news/detail-734030.html
2. 可以分段的执行函数中的内容, 通过__next__()可以执行到下一个yield位置 文章来源地址https://www.toymoban.com/news/detail-734030.html
#生成器函数
def order():
lst = []
for i in range(10000):
lst.append(f"衣服{i}")
if len(lst) == 50:
yield lst #相当于return,但是他返回的数据需要使用迭代器__next__()读取
# 下一次拿数据
lst = []
gen = order()
print(gen.__next__())
print(gen.__next__())
#生成器表达式
gen = (i**2 for i in range(10))
for item in gen:
print(item)
lst = list(gen) #此时为空列表,应为生成器中的东西被拿完了
print(lst)
到了这里,关于python中函数,装饰器,迭代器,生成器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!