函数
关键字def引入一个函数定义,其后必须跟有函数名和形式参数的圆括号。
函数体第一行可以是一个字符串值,这个字符串值叫做该函数的文档字符串(docstring),如:
def fib(n):
"""这里是文档字符串"""
..........
..........
执行函数时会为局部变量引入一个符号表。所有的局部变量都存储在这个局部符号表中。引用参数时会先从局部符号表中查找,然后是全局符号表,然后是内置命名表。因此全局参数虽然可以被引用,但是不能在函数中直接赋值,除非他们使用global语句命名。
函数引用的实际参数在函数调用时引入局部符号表。因此参数总是传值调用,这里的值总是一个对象的引用而不是该对象的值。
一个函数被另一个函数调用时,一个新的局部符号表在调用的过程中被创建。
函数名可以赋值给一个变量,使其能够作为一个函数来使用。这就像一个重命名机制:
例如: f= fib
f(100)
return语句从函数中返回一个值,不带表达式的return会返回None,过程结束也会返回None
可变参数函数的定义和调用:
1.可以对函数的1个或多个参数设定默认值,这样创建的参数可以用较少的参数来调用。
如:
def fun(parm1,parm2=4,parm3="hello"):
result = test(parm1)
if result in ('y','ys','yes') : return true #in关键字可以监测一个序列中是否包含了指定的值
可以如下调用
例1 fun('test')
fun('test',2)
例2 def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
输出
[1]
[1,2]
[1,2,3]
2.函数可以通过关键字参数方式调用,如key=value
例如:
def fun(p1,p2='test',p3='param')
................
调用如下:
fun(100)
fun(100,p3='test')
但是不能用如下:
fun() #如果有的形参没有默认值则不能这样调用
fun(p1=1,2) #在使用关键字参数后,后面的参数必须都是关键字参数
fun(100,p1=100) #重复赋值,没有关键字的参数赋值给第一个形式参数
还可以引入一个形如**name的参数,它接收一个词典,该词典包含了所有未出现在形式参数列表中的关键字参数。还可以包含一个*name的参数,它接收一个元组,包含了所有未出现在形式参数列表中的参数值。*name必须出现在**name之前。
如:
def test(pam1,*arguments,**keywords):
print(pam1)
print('-'*40)
for arg in arguments : print(arg)
print('-'*40)
keys = keywords.keys()
for kw in keys : print(kw,':',keywords[kw])
调用:
test('test1','test2','test3',test4='test4',test5='test5')
输出:
test1
----------------------------------------
test2
test3
----------------------------------------
test5 : test5
test4 : test4
3.可变参数列表
一个不常用的选择是让函数调用可变个数的参数。这些参数被包进一个元组。在这些可变个数的参数之前可以有零到多个普通参数。
例如:
def fprint(file,format,*args)
file.write(format % args) #(教程中的例子)
参数列表的分拆:
当传递的参数是一个列表但是调用的函数确需要一个个分开的参数值,这个时候需要把参数列表拆开来,可以使用操作符*
如:
args=[3,6]
range(*args) #相当于range(3,6)
>>>[3,4,5]
以同样的方式,可以使用**将关键词参数分拆为词典
如:
def parrot(voltage, state='a stiff', action='voom'):
d = {"voltage":"voltage","state":"state","action":"action"}
parrot(**d) #相当于parrot(voltage='voltage',state='state',action='action')
lambda关键字:
通过lambda关键字可以创建一个短小的匿名函数
例如:
def testlambda(parm1):
return lambda x:x+parm1 #结果返回
使用 f = testlambda(10) #f为一个函数而不是
f(1)
输出 11
关于文档字符串
如果文档字符串有多行,则第二行应该空出来。
如:
def test():
"""Do nothing
This is a document.
"""
pass
调用:
print(test.__doc__)
输出:
Do nothing
This is a document.