前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python-装饰器&生成器&迭代器&推

python-装饰器&生成器&迭代器&推

作者头像
py3study
发布2020-01-16 17:26:35
3130
发布2020-01-16 17:26:35
举报
文章被收录于专栏:python3python3

 一:普通装饰器

概念:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能,为已存在的对象添加某个功能

代码语言:javascript
复制
def 外层函数(参数)
    def 内层函数(*args,**kwargs) 
        #函数执行之前
        data= 参数(*args,**kwags)
        #函数执行之后
        return data
    return 内层函数

用法示例:  

代码语言:javascript
复制
def func(arg):
    def inner():
        v = arg()
         return v
      return inner

# 第一步:执行func函数并将下面的函数当做参数进行传递,  相当于:func(index)
# 第二步: 将func返回的值重新赋值给下面的函数名   index = func(index)

 @func   #@装饰器的语法
  def index():
        print(123)
        return 666
  print(index)
 

应用示例

代码语言:javascript
复制
#示例:计算函数执行时间
import time
def base(func):
    def inner():
        start_time = time.time()  --->#函数执行之前
        v= func()
        end_tme = time.time()  ---->#函数执行之后
        print(end_time-start_time)
        return v
    return inner

@base
def func1():
    time.sleep(2)  # 函数执行延缓2秒
    print(123)
    
@base
def func2():
    time.sleep(1)
    print(456)
 
 

 关于返回值

代码语言:javascript
复制
def base(func):
    def inner(*args,**kwargs):
        data = func(*args,**kwargs)
        return data
    return inner 
                       
@x1
def index():
    print(123)
    return 666
v1 =index()
print(v1)
#func函数带括号,执行index函数,先打印'123',先将666返回给data,data再返回给v1   
 

 关于前后

代码语言:javascript
复制
def base(func):
    def inner(*args,**kwargs)
        print('函数调用之前')
        data = func(*args,**kwargs)   #执行原函数并获取返回值
        print('调用原函数之后')
        return data
    return inner
@base
def index()
    print(123)
index()

 二:带参数的装饰器

基本格式

代码语言:javascript
复制
def base(counter):
    def wrapper(func):
        def inner(*args,**kwargs):
            data = func(*args,**kwargs) # 执行原函数并获取返回值
            return data
        return inner 
    return wrapper 
@base(9)   
def index():
    pass

 #先执行base函数,然后将返回值wrapper返回,变成不带参数的装饰器 
 

 用法示例

代码语言:javascript
复制
#写一个带参数的函,实现:参数是多少,被装饰的函数就要执行多少次,返回最后一次执行的结果

def base(counter):
    def wrapper(func):
        def inner(*args,**kwargs):
            for i in range(counter):
                data = func(*args,**kwargs) # 执行原函数并获取返回值
            return data
        return inner
    return wrapper

@base(5)
def index():
    return 好难啊
v = index()
print(v) 
 

 三:生成器 (函数的变异)

概念:函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数,会返回一个生成器,生成器只有被for循环时,生成器内部代码才会执行,每次循环都会获取yield返回的值

 生成器函数 : 内部是否包含yield

代码语言:javascript
复制
def func():
    print('F1')
    yield 1
    print('F2')
    yield 2
    print('F3')
#函数内部代码不会执行,返回一个生成器对象
v1 = func()
#生成器可以被for 循环,一旦开始循环函数内部代码就开始执行
for item in v1:
    print(item)
#  F1  1  F2  2  F3  

 特殊的迭代对象

代码语言:javascript
复制
def func():
    yield 1

v = func()
result = v.__iter__()
print(result) 
 
 

 四:迭代器

概念:对某种对象(str/lsit/tuple/dict/set类创建的对象)中的元素进行逐一获取,表象:具有__nest__方法且每次调用都获取可迭代对象中的元素

列表转换成迭代器

v1 = iter([1,2,3,4])

v2 = [1,2,3,4].__iter__()

迭代器想要获取每个元素 : 反复调用val = v1.__next__()

代码语言:javascript
复制
v1 = "alex"
v2 = iter(v1)
while True:
     try:
        val = v2.__next__()
        print(val)
     except Exception as e:
        break

 直到报错:stoplteration错误,表示迭代已经完毕

如何判断一个对象是否是迭代器 : 内部是否有__next__方法

 for 循环

代码语言:javascript
复制
v1 = [11,22,33,44]

# 1.内部会将v1转换成迭代器
# 2.内部反复执行 迭代器.__next__()
# 3.取完不报错
for item in v1:
    print(item) 
 

 可迭代对象

内部具有_iter__方法且返回一个迭代器

可以被for 循环

 五;推导式

列表推导式(也叫列表生成式)

基本格式

代码语言:javascript
复制
v1 = [i for i in 可迭代对象]
v2 = [i for i in 可迭代对象 if 条件]   #条件为true才进行append
代码语言:javascript
复制
#示例
v1 = [99 if i>5 else 66  for i in range(10)]  

v2 = [lambda : 100 for i in range(10)]
result = v5[9]()  # 100

v3 = [lambda :i for i in range(10)]
result = v7[5]()  # 9

v4 = [lambda x:x*i for i in range(10)] 
# 1.请问 v4 是什么?
函数地址 
# 2.请问 v4[0](2) 的结果是什么?
18

def num():
    return [lambda x:i*x for i in range(4)]
# num() -> [函数,函数,函数,函数]
print([ m(2) for m in num() ])   # [6,6,6,6]
  
#####筛选#####
v = [i for i in range(10) if i > 5]

 集合推导式

代码语言:javascript
复制
v1 = { i for i in 'alex' } 

 字典推导式

代码语言:javascript
复制
v1 = { 'k'+str(i):i for i in range(10) } 

 生成器推导器

代码语言:javascript
复制
def func():
    for i in range(10):
    yield i
v2 = func()

#或者
v2 = (i for i in range(10))   # 生成器推导式(不是元组推导式),创建了一个生成器,内部循环为执行。
for item in v2:
    print(item)
  
 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •  一:普通装饰器
  •  二:带参数的装饰器
  •  三:生成器 (函数的变异)
  •  四:迭代器
  •  五;推导式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档