Python函数使用过程中的几个疑点。
1.返回值与函数类型
通常情况下我们都认为Python函数可以返回多个对象,其实Python返回的是一个元组。看一下下面的例子:
test.py:
def bar():
return "123","abs","vbn"
testy = bar()
print testy
x,y,z = bar()
print x,y,z
运行结果:("123","abc","vbn") 123 abs vbn
testy直接获得了函数隐式返回的整个元组,x,y,z则分别获得了与之对应的返回值。在Python函数中,当没有显式 的返回元素或者None时,Python会返回一个None,那么调用者接收的就是Python返回的那个对象,而且对象的类型不变。如果函数返回多个对象,Python把它们聚集起来以一个元组返回。尽管我们 声称Python比C那种只返回一个元素的语言灵活的多,但它也遵循相同的传统,只是让程序员误以为可以返回多个对象
许多静态语言主张函数的类型就是返回值的类型,但Python是动态类型语言,Python动态的确定类型而且能返回不同类型的值,所以Python的函数没有类型
2.函数参数
在很多地方看到这样的函数func(*agr, **kwargs),一开始不明白这样的参数表示什么意思,原来*agr表示的是传入的参数是元组,**kwargs表示传入的是字典,也就是Python允许程序员执行没有显式定义参数的函数。
from operator import add,sub
def testy(*arg, **kwargs):
print arg, kwargs
print kwargs[+"](arg[1], arg[2])
print kwargs["-"](arg[3], arg(0))
argsT = [1,2,3,4]
argsD = {"+":add, "-":sub}
testy(*argsT, **argsD)
运行结果:(1, 2, 3, 4) {'+': <built-in function add>, '-': <built-in function sub>}
5
3
3.函数闭包和装饰器
当一个内部函数调用外部函数定义的对象的时候,这个函数就成为闭包。装饰器的语法是以@开头,接着是装饰器的函数名字和可选参数,紧跟着装饰器的是被修饰的函数的名字和装饰函数的可选参数,装饰器看起来是这样的:
@decorator(dec_opt_args)
def func2Bdecorated(func_opt_args):
pass
使用多个装饰器的例子:
@decor1
@decor2
def func(args): pass
这种用法相当于:decor2(decor1(func)) 。装饰器的作用就是修饰一个函数然后返回另外一个函数对象
4.匿名函数与lambda
lambda [arg1,[, arg2,...,argn]] : expression
lambda表达式返回一个可调用的函数对象
>>>a = lambda x,y: x+y
>>>a(3,4)
7
>>>b = lambda *z : z
>>> b(23,"asd")
(23, "asd")
>>> b(23)
(23,)