第11章 函数和函数式编程(1)

11.1 什么是函数?

11.1.2 返回值和函数类型

把过程看待成函数的语言通常对于“什么都不返回”的函数设定了特殊的类型或者值的名字。这些函数在c中默认为"void"的返回类型,意思是没有值返回。在Python中,对应的返回对象类型是None。

当没有显式地返回元素或者如果返回None时,Python会返回一个None。那么调用者接收的就是Python返回的那个对象,且对象的类型仍然相同。如果函数返回多个对象,Python把他们聚集起来并以一个元组返回。

许多静态类型的语言主张一个函数的类型就是其返回值的类型。在Python中,由于Python是动态地确定类型而且函数能返回不同类型的值,所以没有进行直接的类型关联。因为重载并不是语言特性,程序员需要使用type()这个内建函数作为代理,来处理有着不同参数类型的函数的多重声明以模拟类C语言的函数重载。

11.2 调用函数

11.2.2 关键字参数

关键字参数的概念仅仅针对函数调用。这种观念是让调用者通过函数调用中参数名字来区分参数。这样规范允许参数缺失或者不按顺序,因为解释器能通过给出的关键字来匹配参数的值。

当参数允许“缺失”时,也可以使用关键字参数。这取决于函数的默认参数。

11.2.3 默认参数

默认参数就是声明了默认值的参数。因为给参数赋予了默认值,所以,在函数调用时,不向该参数传入值也是允许的。

11.2.4 参数组

Python同样允许程序员执行一个没有显式定义参数的函数,相应的方法是通过一个元组(非关键字参数)或字典(关键字参数)作为参数组传递给函数。可以将所有参数放进一个元组或者字典中,仅仅用这些装有参数的容器来调用一个函数,而不必显式地将它们放在函数调用中。
在Python中允许的函数调用的完整语法是:

func(positional_args, keywork_args, *tuple_grp_nonkw_args, **dict_grp_kw_args)

11.3 创建函数

11.3.1 def语句

标题行由def关键字,函数的名字以及参数列表(如果有的话)组成。def子句剩余部分包括一个虽然可选但是强烈推荐的文档字串和必须的函数体。

11.3.2 声明与定义比较

Python将这两者(声明与定义)视为一体,函数的子句由声明的标题行以及随后的定义体组成。

11.3.3 前向引用

Python不允许在函数未声明之前,对其进行引用或者调用。

11.3.4 函数属性

函数属性是Python另外一个使用了句点属性标识并拥有名称空间的领域。区别于C#,函数是有属性的。

>>> def foo():
... pass
...
>>> foo._doc_ = "The doc of foo~~~"
>>> foo.version = 1.1
>>> help(foo)
Help on function foo in module __main__:


foo()


>>> `foo._doc_`
"'The doc of foo~~~'"
>>> `foo.version`
'1.1'
>>>

注意我们是如何在函数声明外定义一个文档字串。然而我们仍然可以就像平常一样,在运行时刻访问它。然而你不能在函数声明时访问属性。

11.3.5 内部/内嵌函数

在函数体内创建另外一个函数(对象)是完全合法的,这种函数叫做内部/内嵌函数。

内部函数的整个函数体都在外部函数的作用域之内。除了在外部函数体内,任何地方都不能对其进行调用。

另外一个函数体内创建函数对象的方式是lambda。如果内部函数的定义包含了在外部函数里定义的对象的引用(这个对象甚至可以是在外部函数之外),内部函数会变成被称为闭包(closure)的特别之物。

>>> def foo():
... def nest_foo():
... pass
... pass
...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值