Python 基础知识——函数(二)

微信公众号:数据分析与统计学习

如有问题或建议,请公众号留言

最近更新时间:2018-6-28

一、前言

Python的系列文章主要介绍python语言的基础语法知识。按照核心内建数据类型、语句、函数、类、异常、标准模块的顺序对相关的语法知识进行讲解。

python函数知识的介绍主要分为两块:第一部分讲解函数的基础知识,包括函数的定义、参数、作用域;第二部分介绍函数的高级特性,包括函数设计概念,迭代器、生成器、匿名函数lambda,递归函数和装饰器以及常见的函数工具。

上期小编介绍了函数的基础知识,本期继续讲解函数的知识——高级特性。

二、函数设计概念

1、耦合性:对于输入使用参数并且对于输出使用Return语句。尽量让函数独立于外部的东西。

2、耦合性:只有真正必要的情况下使用全局变量。尽量避免使用全局变量进行函数间的通信,否则容易导致程序难以维护和修改。

3、耦合性:不要改变可变类型的参数,除非调用者希望这样做

4、聚合性:每一个函数都应该有一个单一的、统一的目标,就是只做一件事。

5、大小:每一个函数都应该相对较小,不应该过长、过深嵌套函数

6、耦合:避免直接改变在另一个模块文件的变量。

尽最大努力使函数和其他程序组件中的外部依赖性最小化,这样函数的自包含性越好,它越容易被理解、复用和修改。

三、递归函数

递归函数就是可以直接或者间接地调用自身以进行循环的函数。递归函数可以遍历拥有任意的、不可预知的数据结构。

直接调用

简接调用

遍历任意的数据结构

因为列表L不能线性迭代,简单循环语句不能用。嵌套循环语句也不能用,不知道列表可以嵌套任意的深度。

四、匿名函数lambda

创建一个函数对象但没有将函数对象赋值给一个变量。

匿名函数lambda是表达式而不是语句

五、函数的属性和注解

函数作为一种Python对象,其可以赋值给其他变量、作为参数传递给其他函数、嵌入到列表、字典等数据结构、作为一个函数的返回对象。

函数可以通过help, dir等函数显示其属性,也可以自定义属性

函数注解的形式:

函数注解编写在def头部行。对于参数,注解放在参数名之后的冒号之后,默认值前;返回值,注解编写与参数列表之后的一个"->"之后。

注解是直接附加到函数对象的__annotations__属性以字典的形式供其他用户使用。

六、迭代器

可迭代对象:指的是支持__iter__方法的一个对象。该对象能够被Python中所有从左至右扫描对象的的迭代工具所遍历。迭代工具包括for循环,列表解析、字典解析、集合解析、in成员关系测试以及map、filter、reduce、zip等内置函数。

迭代器:带有__next__方法的可迭代对象或者可迭代对象可以直接作为内置函数next()的参数被调用。next()函数可以不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

对于是可迭代对象不是迭代器的对象转变为迭代器可以借助iter()函数,函数iter()调用可迭代对象直接返回一个迭代器。

可以使用isinstance()判断一个对象是否是iterable对象(可迭代对象)

可以使用isinstance()判断一个对象是否是iterator对象(迭代器)

列表、字典、字符串、内置range函数都是Iterable(可迭代对象),却不是Iterator(迭代器),它们可以借助iter()函数,变成迭代器,从而可以调用next()。这些对象支持多次打开迭代器,属于多个迭代器。

文件、生成器、map、zip、filter都自带有__next__方法属于自身迭代器,可以直接调用next(),不支持多个迭代器,属于单个迭代器

迭代工具如何自动实现对可迭代对象的遍历(以for循环为例):

对于不是迭代器的可迭代对象,可迭代对象作为参数传递给内置iter()函数,该函数返回一个迭代器,然后调用next()函数,一次产生一个结果并前进到下一个结果,直到产生StopTteration异常并被捕获。

对于是迭代器的可迭代对象,直接调用next()函数或者__next()__方法,一次产生一个结果并前进到下一个结果,直到产生StopTteration异常并被捕获。

所有迭代工具内部工作原理都是在每次迭代中调用__next__方法或者next()函数,并且捕捉StopTteration异常来确定何时离开。迭代工具都是自动调用iter和next函数。

迭代器不必一次性产生所有的结果,返回的是一个对象,从而相对于节省内存。

列表解析、字典解析、集合解析都是接受迭代对象作为表达式一部分,然后收集所有产生的迭代结果返回新的对象。这种表达式效率更高,更加简明,更加方便。

七、生成器

生成器在需要的时候产生结果,而不是立即产生全部结果。

生成器函数:常规def语句中包含了yield语句,将使得def语句特别编译,在调用def语句(函数)时返回一个生成器对象——一个自动支持迭代协议(含有__next__方法)在迭代环境中提供结果的迭代;使用yield语句一次返还一个结果,在每个结果之间挂起和继续它们的状态。

生成器表达式:和列表解析相似,但用括号包含的表达式,返还按需产生结果的对象,而不是构建一个列表。(x**2 for x in range(4))

与return语句不一样,return语句立即返还单个结果给调用者,而yield语句并不是立即返还所有结果,而是一次返还一个结果,遇到yield语句返还值并将函数挂起,之后下次迭代从挂起处继续执行,从而随着时间产生一系列值。

八、装饰器

等同于F= decorator(F)。

装饰器本质是一个高阶函数,它接收一个函数名作为参数,然后返回一个函数对象,同时把返回的函数对象赋给之前作为参数的函数名。

九、后记

写到这里,本期内容讲解完了,不知道读者的你有什么不明白的地方,欢迎各位留言反馈。小编尽最大的努力让理解我所介绍的内容。。

下期,小编主要介绍python的类。敬请期待…….

下面的是我的公众号二维码图片,欢迎关注我。

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

扫码关注云+社区

领取腾讯云代金券