白云岛资源网 Design By www.pvray.com

本文实例讲述了Python装饰器用法与知识点。分享给大家供大家参考,具体如下:

(1)装饰器含参数,被装饰函数不含(含)参数

实例代码如下:

import time
# 装饰器函数
def wrapper(func):
  def done(*args,**kwargs):
    start_time = time.time()
    func(*args,**kwargs)
    stop_time = time.time()
    print('the func run time is %s' % (stop_time - start_time))
  return done
# 被装饰函数1
@wrapper
def test1():
  time.sleep(1)
  print("in the test1")
# 被装饰函数2
@wrapper
def test2(name):  #1.test2===>wrapper(test2)  2.test2(name)==dome(name)
  time.sleep(2)
  print("in the test2,the arg is %s"%name)
# 调用
test1()
test2("Hello World")

(2)装饰器含有参数,被装饰函数含(不含)参数

import time
user,passwd = 'admin','admin'
def auth(auth_type):
  print("auth func:",auth_type)
  def outer_wrapper(func):
    def wrapper(*args, **kwargs):
      print("wrapper func args:", *args, **kwargs)
      if auth_type == "local":
        username = input("Username:").strip()
        password = input("Password:").strip()
        if user == username and passwd == password:
          print("\033[32;1mUser has passed authentication\033[0m")
          res = func(*args, **kwargs) # from home
          print("---after authenticaion ")
          return res
        else:
          exit("\033[31;1mInvalid username or password\033[0m")
      elif auth_type == "ldap":
        print("ldap链接")
    return wrapper
  return outer_wrapper
@auth(auth_type="local") # home = wrapper()
def home():
  print("welcome to home page")
  return "from home"
@auth(auth_type="ldap")
def bbs():
  print("welcome to bbs page"
print(home()) #wrapper()
bbs()

总结:

(1)装饰器实质为函数内嵌,返回函数地址。

(2)装饰器带参数与不带参数相比装饰器带参数的多了一层函数定义用于接收装饰器中传递的参数,其余基本相同。

(3)先验证装饰器中的参数,在验证普通函数的参数

小知识:

列表生产式:[i for i in range(5)]---->[0,1,2,3,4,5]

生成器与迭代器:

第一种方式通过括号的方式生成

生成器:()---(i for i in range(5))  ==>generator

这种一边循环一边计算的机制,称为生成器:generator。

生成器只有在调用时才会生成相应的数据,只记录当前位置。

只有一个__next__()方法

第二种方式通过yield生成

在函数中使用yield即可将一个函数变为一个生成器

迭代器:

直接作用于for循环的数据类型:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象

from collections import Iterable
 isinstance([], Iterable)=========true

*可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可以使用isinstance()判断一个对象是否是Iterator对象:

> from collections import Iterator
> isinstance((x for x in range(10)), Iterator)
======>True

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

把list、dict、str等Iterable变成Iterator可以使用iter()函数:

例如:iter([])<====迭代器

Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结:

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

白云岛资源网 Design By www.pvray.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
白云岛资源网 Design By www.pvray.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。