Python/函数

维基教科书,自由的教学读本
跳到导航 跳到搜索

Python函数定义的通常格式为:

def 函数名(参数列表):
    #函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
    函数体
    #return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

Python中,对象有类型;变量仅仅是对象的一个引用,变量没有类型。 string、tuple和 numbers 是不可更改的类型(immutable type),给它们的变量赋值其实是指向了新的对象;而 list,dict 等则是可以修改的类型(mutable type)。Python函数的参数传递

  • 不可变类型:类似 C语言的值传递。在函数内部“修改”参数的值,只是引用到另一个对象,不影响实参本身。
  • 可变类型:类似C++的引用传递,修改后函数外部的实参也会受影响

Python的函数参数可以使用:位置参数、不定长参数(使用元组表示)、命名实参。

  • 一个星号*为前缀的形参名字,对应于额外的位置参数组成的一个元组。“*”或者“*argu”右侧只能是关键字形参与关键字实参。
  • 两个星号*为前缀的形参名字,对应于额外的关键字参数组成的一个有序的字典。
  • 带缺省值的参数,其右侧直至*的参数都必须有缺省值。参数的缺省值在函数定义时从左至右求值。

嵌套函数(nested function),需要注意:

  • 内部函数可以读写访问外部函数的可变(mutable)变量
  • 内部函数可以访问外部函数的不可变(immutable)变量
  • 内部函数使用nonlocal关键字,可以读写访问直接外部函数的不可变(immutable)变量
  • 内部函数访问的外部函数的变量,可以定义在内部函数之后。

函数调用时,首先匹配所有位置参数,即使关键字参数更靠左也会稍后才处理。额外的未匹配的位置参数组成一个元组与*argus形参匹配。通常,不在一个函数同时使用*argus与**arugss,以免混淆。

闭包是指嵌套函数作为外部函数的返回值。因为函数是头等对象,所以函数对象可以作为实参、返回值。嵌套函数可以使用外部函数的变量,即使外部函数已经运行结束了。例如

def adder(outer_argument): # outer function
  def adder_inner(inner_argument): # inner function, nested function
    return outer_argument + inner_argument # Notice outer_argument
  return adder_inner
add5 = adder(5) # a function that adds 5 to its argument
add7 = adder(7) # a function that adds 7 to its argument
print add5(3) # prints 8
print add7(3) # prints 10

匿名函数的语法如下:

 lambda 可选的形参表:expression

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。