首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python进阶系列(三)-序列

每天读一篇一线开发者原创好文

前面两篇我们分别介绍了python中的装饰器和多继承,了解了一些平时容易踩到的坑以及没能深入理解原理的常见语法。本节我们来介绍一个更基础也更加频繁使用的内容:python的序列。

所谓序列,就是指有序队列(sequence),是程序设计中常用到的数据存储方式。python常用的序列数据类型主要有三种:字符串(string)、元组(tuple)、列表(list),大家在python编码过程中肯定经常接触。但是最基础的内容往往容易被忽略,序列这几个最基础的数据类型中有一些特性需要我们注意,本节主要结合我自己在工作过程中遇到过的问题,来给大家提个醒,避免以后犯类似的错误。

1.索引

序列可以根据变量的下标来定位元素,这是最基础的知识。python所不同的是,支持从序列尾部来进行索引。

从代码中可以看出,我们将函数foo作为对象赋值给变量b,此时变量b也可以作为一个新的函数来调用。

在python中,所有的对象都包含三个最基本的元素:标识(id)、类型(type)、值(value,即对象本身),我们可以通过打印这三个要素来分析某一个对象的具体内容。

我们知道对于一个函数来讲,他的入参和出参必须是一个对象,既然python中一切皆为对象,那我们就可以用另一个函数来作为某个函数的参数,也可以为一个函数返回另一个函数。可能听起来有点晕,没关系,我们来看下面这个例子。

简单起见,我将fuu这个函数作为变量传递给foo()调用,foo再将fuu作为返回值返回给变量a。此时变量a可以当做函数来直接调用。我们先暂时记住python中这种将函数作为对象的相关操作,后面我们还会看到。

2.函数闭包

在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是指引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。python是支持函数闭包的语言之一,我们结合下面这个例子来了解到底什么是闭包函数。

这就是一个函数闭包的例子,我们把函数addNum称作闭包函数。

3.装饰器

现在我们考虑这样一个场景,你的某个项目中用到了日志打印模块,这个模块包括了头信息(时间戳、代码位置、日志级别等)和尾部信息(签名、处理时长等),而你会多处调用这个日志打印函数,每次调用都会在头信息和尾部信息之间执行本体调用函数的操作。刚刚我们有了解了函数出入参和闭包概念,那我们可以这么来设计这个模块。

我们利用logger这个函数,将所需要用到日志模块的其他函数再次封装成一个新的函数,然后再调用,这样一来日志模块就独立出来,其他调用模块也就无需处处维护头信息和尾部信息了。其中 f1 = logger(fun1)这句赋值语句,就是python语法中的装饰器。说到这里,大家可能会有疑问,为何这里讲到的装饰器和我们平时的不一样呢?别急,我们接着往下看。

这个例子中将装饰过的新函数命名和原来的一致,对调用者来讲看不到区别,此时就是一个完全的装饰器实现。由于这种写法不够优雅,python专门定义了新的语法规则来表明一个装饰过得函数,即使用@字符来提示一个装饰过的类。

这就是我们在python见到过的装饰器,他仅仅是一个语法糖,等价于函数定义完成后利用装饰器类的再次定义函数。

4.python内置装饰器

通常来讲,我们定义自己需要的装饰器来满足不同的需求。但是python本身也内置了三个装饰器,分别是@staticmethod、@classmethod、@property。这三个装饰器应用比较广泛,分别是将函数声明为静态方法、类方法、属性方法。本篇就不再细述这几个装饰器的作用,后继再来讲述。

5.小结

装饰器,本质就是一个函数,用来装饰其他函数,为其他函数添加附加功能。实现装饰器时要求不能修改被装饰函数的源代码,也不能修改被装饰函数的调用方法。有了装饰器,我们可以抽离出大量与函数本身无关的重复代码,减轻开发和维护的成本,也可以在不改变已有函数结构的基础上对已实现的功能做扩展。

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券