函数基础
- 函数就是将一些语句集合在一起的部件,不止一次地在程序中运行。还能计算出一个返回值,并能够改变作为函数输入的参数。
编写函数
函数基础
- def是可执行的代码,Python函数时由def编写的,def是一个可执行的语句,函数并不存在。直到Python运行了def后才存在。
- def创建了一个对象并将其赋值给某一变量名。当Python运行到def语句时,将会生成一个新的函数对象并将其赋值给这个函数名。就像所有的赋值一样,函数名变成了某一个函数的引用。
- return将一个结果对象发送给调用者,当函数被调用时,其调用者停止运行直到这个函数完成了工作,之后函数将控制权返回调用者,return返回值就是函数调用的结果
- yield向调用者返回一个结果对象
global声明了一个模块级的变量并被赋值,在默认情况下,所有在一个函数中被赋值的对象,是这个函数的本地变量,并且仅在这个函数运行的过程中存在。为了分配一个可以在整个模块中都可以使用的变量名,函数需要在global语句中将它列举出来。变量名需要关注它的作用域,并且是通过赋值语句将变量名绑定至作用域的 - nonlocal声明了将要赋值的一个封闭的函数变量。在Python3中添加的nonlocal语句允许一个函数来赋值一条语法封闭的def语句的作用域中已有的名称。允许封闭的函数作为保留状态的地方
- 函数时通过对象引用传递的,在Python中,参数通过赋值传递给函数。
- 参数、返回值以及变量并不是声明,在函数中并没有类型约束。可以传递任意类型的参数给函数。函数也可以返回任意类型的对象
def语句
格式
def将创建一个函数对象并将其赋值给一个变量名
def <name>(arg1,arg2,....argn):
<statements>
- def包含了首行并有一个代码块跟随在后边,这个代码块通常会缩进。这个代码块就是Python函数的执行语句
- def的首行定义了函数名,赋值给了函数对象,并在括号中包含了0个或多个参数。在函数调用的时候,在首行的参数名称赋值给了括号中传递来的对象
- 带返回值的格式
def <name>(arg1,arg2,....argN):
statement
return <value>
- return语句可以在函数主体中任何地方出现,表示函数调用的结束。并将结果返回至调用处。
- 定义的函数中,如果没有return,会默认return null
- 如果在函数中return多个对象,Python会将多个对象封装为一个元组返回,其实返回的还是一个对象
def是实时执行的
- Python的def语句实际上是一个可执行的语句:当运行时,创建一个新的函数对象并将其赋值给一个变量名,Python中的所有语句都是实时运行的,没有独立编译这样的流程。所以def语句可以出现在任一地方。还可以嵌套在其他的语句中
if test:
def func():
statement
else:
def func()
statment
statement
func()
- def在运行时简单地给一个变量名进行赋值,Python函数在程序运行之前并不需要全部定义。
- 函数的函数名并不重要,可以将函数赋值给一个不同的变量名,并通过新的变量名进行调用。
- 函数允许任意的属性附加到记录信息供随后使用
def func():....
func()
func.attr = value
示例
# 返回两个数的计算结果
>>> def times(x,y):
... return x*y
...
>>> time = time(2,3)
>>> time = times(2,3)
>>> time
6
- 函数中的参数完全取决于参数的对象类型
用户定义的函数属性
用户定义的函数具有以下属性
- f.doc 文档字符串
- f.name 函数名称
- f.dict 包含函数属性的字典
- f.code 字节编译的代码
- f.defaults 包含默认参数的元组
- f.globals 定义全局命名空间的字典
- f.closure 包含与嵌套作用域相关数据的元组
Python中的多态
同样的函数,在不同的实例下执行的结果取决于不同的实例。这种依赖行为称为多态。
- 作为函数,可以自动的适用于所有类别的对象类型。只要对象支持所预期的接口,函数就能处理
- Python中代码不应该关心特定的数据类型。
# 寻找序列的交集
>>> def intersect(seq1,seq2):
... res=[]
... for x in seq1:
... if x in seq2:
... res.append(x)
... return res
...
>>> x = [1,2,3,4,5]
>>> y = ['a',1,2,'b','c',4]
>>> resout = intersect(x,y)
>>> resout
[1, 2, 4]
- 如果我们传入了不支持这些接口的对象,Python将会自动检测出不匹配,并抛出一个异常
本地变量
在上述的代码中res是本地变量,这个变量只是在def内的函数中是可见的,并且仅在函数运行时是存在。所有的在函数内部进行赋值的变量名都默认为本地变量。
- 参数也是通过赋值被传入的,所以seq1和seq2是本地变量
- for循环将元素赋值给了变量X,所以变量X是本地变量
- 所有的本地变量都会在函数调用时出现,并在函数退出时消失。
网友评论