掌握这些知识,你的Python水平能更上一层楼

今天讲一些python中的高级用法,有助于大家更好的使用python这门语言。今天讲的这些知识是层层递进的关系,前面是后面的铺垫。

函数可变参数*args和**kwargs

python支持固定参数,默认参数,也和很多其他语言一样支持可变参数,只不过python支持的可变参数分为两种,*args是tuple,里面可以有任意多个element(包括0个)。**kwargs则是当你需要指定keyword时需要用到的参数类型。

先考虑*args的情况,先看函数定义:

再看参数提取:

下面看看为什么需要**kwargs,对于上面的print_args,下面这种添加了keyword的调用方式会出错,所以就有了**kwargs的用武之地:

**kwargs的本质其实是dict,如下所示:

通常再使用的时候都是二者合起来使用,如下所示:

上面的知识大家差不多应该都知道,下面这种Unpacking的用法很多人都不太了解:

unpack使用kwargs,记住keyword要和函数声明时的变量名一致才行,否则会报错

lambdafunction

在python中所有的东西都是object,不管是int也好,list也好都是object。函数也是object。这个概念很重要。

上面的g和f所指向的object是同一个object

下面思考这样一个问题,如果numbers=["10","3","40","14","5"],让你找出最大值怎么找?

>>>max(numbers)

'5'

这显然不对,因为max默认按照字母顺序排序了,所以需要额外提供排序信息:

再举一个例子,下面是几个人的年龄,性别,地址,请找出年纪最大的人:

对比一下我还是更喜欢lambdafunction的定义,简洁明了

Decorator装饰器

最长见的decorator的usercase是什么?答:retry。比如网络restfulrequest碰到不稳定的server或者说server给你返回了5XX,你要不要retry。

一开始可能你的code长这样:

importrequests

URL="https://example.com/api"

defget_items():

returnrequests.get(URL+"/items")

当然你还会有很多getfunction,比如get_apple,get_banana,get_orange,...

实际部署之后发现server不稳定,不定期返回500,你就要加retry

如果只有一个get_items,你可能会这么写:

可是每一个fucntion都要改,是不是很累。。。

下面decorator隆重登场,decorator的本质是一个function。这个function的parameter有且仅有一个就是一个functionobject,返回值则是另一个不同的function

下面举一个decorator的例子,loggingdecorator

如上所示,logfuncname就是一个decorator,它的input是func,return了一个wrapperfunction。

下面我们回到一开始retry那个例子:

然后get_apple,get_banana,get_orange什么的上面加上@retry就可以了

接下来问题来了,如果有另一个decorator也想用上怎么办?

decorator是可以叠加的,比如下面的例子,注意上下顺序就是decorator从左到右的顺序

如果想要改变retry的次数怎么办,比如get_apple想要retry3次,但是get_banana想要retry5次怎么办?

这里其实用到了一个closure的概念,就是外层函数的参数在里层函数里是可见的,而里层函数的参数在外层不可见(当然这里也不需要)。

Decorator在flask中的实现原理

下面我们来看看flask中decorator是怎么实现的,简而言之:

更多测试文章,请前往51Testing软件测试网掌握哦~

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180314A0HH1W00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券