[Python 学习笔记] 8: Function
2009-10-13 00:00:00 来源:WEB开发网Python 支持类似 Object Pascal 那样的全局函数,也就说我们可以用结构化方式写一些小程序。
>>> def test(s):
print s
>>> test("Hello, World!")
Hello, World!
Python 函数的参数也采取引用拷贝的方式,也就是说对参数变量赋值,并不会影响外部对象。
>>> def fun(i):
print id(i)
i = 10
>>> a = 100
>>> id(a)
11229364
>>> fun(a)
11229364
>>> a
100
当然,函数参数和原变量同时指向同一对象,我们是可以改变该对象成员的。
>>> class Data:
def __init__(self):
self.i = 0
>>> def fun(d):
d.i = 100
>>> d = Data()
>>> d.i
0
>>> fun(d)
>>> d.i
100
我们可以使用 global 关键词来实现类似 C# ref/out 的功能。
>>> def test():
global i
i = 100
>>> i = 10
>>> test()
>>> i
100
Python 不支持方法重载,但支持缺省参数和一些特殊的调用方式。
>>> def test(a, b = 1, c = 2):
print "a=%s, b=%s, c=%s" % (a, b, c)
>>> test(0, 1, 2)
a=0, b=1, c=2
>>> test(0, 1)
a=0, b=1, c=2
>>> test(0)
a=0, b=1, c=2
>>> test(c=3, a=2)
a=2, b=1, c=3
Python 还支持类似 C# params 那样的可变参数数组。
>>> def fun1(*i):
print type(i)
for n in i: print n
>>> fun1(1, 2, 3, 4)
<type 'tuple'>
1
2
3
4
>>> def fun2(**d):
print type(d)
for (k, v) in d.items():
print k, "=", v
>>> fun2(a=1, b=2, c=3)
<type 'dict'>
a = 1
c = 3
b = 2
Python 提供了一个内置函数 apply() 来简化函数调用。
>>> a = (1, 2, 3)
>>> def fun(a, b, c):
print a
print b
print c
>>> fun(a[0], a[1], a[2])
1
2
3
>>> apply(fun, a)
1
2
3
Lambda 是个非常实用的语法,可以写出更简练的代码。
>>> def do(fun, nums):
for i in range(len(nums)):
nums[i] = fun(nums[i])
print nums
>>> def fun(i):
return i + 1
>>> do(fun, [1, 2, 3])
[2, 3, 4]
>>> do(lambda i: i + 1, [1, 2, 3])
[2, 3, 4]
>>>
还有一点比较有意思,由于 Python 函数无需定义返回值,因此我们可以很容易地返回多个结果。这种方式也可以从一定程度上替代 ref/out 的功能。
>>> def fun():
return 1, 2, 3
>>> a = fun()
>>> type(a)
<type 'tuple'>
>>> a[2]
3
更多精彩
赞助商链接