微信公众号:数据分析与统计学习
如有问题或建议,请公众号留言
最近更新时间: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的类。敬请期待…….
下面的是我的公众号二维码图片,欢迎关注我。
领取专属 10元无门槛券
私享最新 技术干货