16 函数基础

表16-1总结了与函数相关的主要语句和表达式。其中包含了函数调用语句、两种声明函数的方式(def 和lambda)、两种管理作用域的方式(global 和nonlocal),以及两种传回返回值的方式(return 和yield)。

在这里插入图片描述

1 为何使用函数

2 编写函数

下面是关于Python函数背后的一些主要概念的简要介绍。

  • def是可执行的代码:Python 的函数是由一条新语句编写的,即def。与C这样的编译语言不同,def是一个可执行的语句——在 Python运行def之前,函数并不存在。事实上,在if语句、while循环甚至其他的def中嵌套def语句是合法的(甚至在某些场合还很有效)。在典型的做法下,def语句编写在模块文件中,并自然而然地在模块文件第一次被导入时生成定义的函数。
  • def创建了一个对象并将其赋值给某一变量名: 当Python运行到def语句时,将生成一个新的函数对象并将其赋值给这个函数名。和所有的赋值一样,函数名变成了一个函数对象的引用。函数名其实并不神奇,就像你将看到的那样,函数对象也可以赋值给其他的变量名,或是保存在列表之中等。函数对象也可以携带任意的用户定义的属性,从而记录数据。
  • lambda创建一个对象并将其作为结果返回:你也可以用lambda表达式创建函数,这一功能允许我们把函数定义内联到在语法上def语句不能工作的地方。这是一个更加高级的概念,在19章进行介绍。
  • return将一个结果对象传回给调用者:当函数被调用时,其调用者将暂停运行,直到这个函数完成了它的工作,之后函数才将控制权还给调用者。函数是通过一条return 语句将计算得到的值传回给调用者的,即返回值成为函数调用的结果。没有返回值的return语句则直接将控制权交还给调用者(并返回默认值None)
  • yield向调用者发回一个结果对象,但是会记住它离开的位置:像生成器这样的函数也可以通过yield语句来返回值,并挂起它们的状态以便稍后能恢复。这是本书之后要介绍的另一个高级话题。

在这里插入图片描述

2.1 def语句

def语句会创建一个函数对象并将其赋值给一个变量名。def语句一般的格式如下所示:

def name(arg1,arg2,...,argN):
	statements

与所有的多行Python语句一样,def包含了头部和一段紧随其后的代码块,这个代码块通常都会缩进(或者是在冒号后边加一条简单语句)。而这个代码块就成为了函数的函数体——也就是每次调用函数时Python所执行的语句。

def的头部定义了被赋值函数对象的函数名,并在圆括号中包含了0个或以上的参数(有时候称为形式参数,简称形参)。在函数调用的时候,括号中的传人对象将赋值给头部的形式参数。

函数体通常包含-一条return语句:

def name(arg1,arg2,...,argN):
	...
	return value

Python的return语句可以在函数体中的任何地方出现。当return被调用的时候,它将结束函数调用并把结果返回至函数调用处。return 语句包含一个对象表达式,这个对象给出函数的结果。如果return后面的值默认了,那么它将返回一个None对象。

return语句自身也是可选的。如果它没有出现,那么函数将在控制流执行完函数体时结束。事实上,一个没有返回值的函数自动返回了None对象,但这个值往往会被调用者忽略掉。

函数也可以使用yield语句,它被设计用来随着时间的推移产生一系列的值,我们将在第20章研究函数高级主题时讨论它。

2.2 def语句执行于运行时

Python的def语句是一-条真正可执行的语句:当它运行的时候,会创建一个新的函数对象并将其赋值给一个变量名。(请记住, Python 中的一切都存在于运行时,没有像独立的编译时这样的过程。)因为def是一条语句,所以它可以出现在所有语句可以出现的地方——甚至嵌套在其他的语句中。例如,尽管def通常包含在模块文件中,并在模块被导入时运行,函数同样可以通过嵌套在if语句中来实现在不同的函数定义之间的选择,这也是完全合法的:

if test:
	def func():
		....
else
	def func():
		....

....
func()

与C这样的编译语言不同,Python函数在程序运行之前并不需要被全部定义。通常,def在运行到的时候才进行计算,而在def之中的代码也只在函数被调用后才会计算。

因为函数是在运行时才定义的,所以函数名并没有什么特别之处。关键在于函数名所引用的那个对象:

othername=func
othername()

这里,函数被赋值给-个不同的变量名,并通过新的变量名进行了调用。与Python中其他一切一样,函数只不过是对象,它们在程序运行时被明确地记录在内存中。实际上,除了调用以外,函数允许将任意属性附加到其中以供之后使用:

def func():...
func()
func.attr=value

3 第一个示例:定义和调用

函数主要包括了两个方面:定义(def创建了一个函数)以及调用(表达式告诉Python去运行函数体)。

3.1 定义

待补充 505

3.2 调用
3.3 Python中的多态

4 第二个示例:寻找序列的交集

4.1 定义
4.2 调用
4.3 重访多态
4.4 局部变量

501

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值