分类: Python/Ruby
2010-12-16 13:50:34
>>>>>> def Foo(a, b= 1, c = 2):
print "a=%s, b=%s, c=%s"%(a, b ,c)
>>>>>> Foo(0, 0 ,7)
a=0, b=0, c=7
>>>>>> Foo(0, 0)
a=0, b=0, c=2
>>>>>> Foo(7)
a=7, b=1, c=2
>>>>>> Foo(c = 3, a = 4)
a=4, b=1, c=3
>>>>>>Python 支持类似 Object Pascal 那样的全局函数,也就说我们可以用结构化方式写一些小程序。
>>>>>> def Foo(s):
print s
>>>>>> Foo("Hello Python!")
Hello Python!
>>>>>>
Python 函数的参数也采取引用拷贝的方式,也就是说对参数变量赋值,并不会影响外部对象。
>>>>>> def Fun(i):
print id(i)
i = 10
>>>>>> a = 100
>>>>>> id(a)
11229556
>>>>>> Fun(a)
11229556
>>>>>> a
100Python 还支持类似 C# params 那样的可变参数数组。
>>>>>> def MyFun1(*i):
print type(i)
for n in i: print n
>>>>>> MyFun1(1,2,3,4)
<type 'tuple'>
1
2
3
4
>>>>>> def MyFun2(**i):
print type(i)
for(m, n) in i.items():
print m, "=", n
>>>>>> MyFun2(a=1, b=2, c=3)
<type 'dict'>
a = 1
c = 3
b = 2
Python 提供了一个内置函数 apply() 来简化函数调用。
>>>>>> def Fun(a, b, c):
print a, b, c
>>>>>> a = ("l", "M", "n")
>>>>>> Fun(a[0], a[1], a[2])
l M n
>>>>>> apply(Fun, a)
l M nLambda 是个非常实用的语法,可以写出更简练的代码。
>>>>>> def Do(fun, nums):
for i in range(len(nums)):
nums[i] = fun(nums[i])
print nums
>>>>>> def Fun(i):
return i*10
>>>>>> Do(Fun, [1, 2, 3])
[10, 20, 30]
>>>>>> Do(lambda i: i*10, [1, 2, 3]) # 使用 lambda
[10, 20, 30]还有一点比较有意思,由于 Python 函数无需定义返回值,因此我们可以很容易地返回多个结果。这种方式也可以从一定程度上替代 ref/out 的功能。
>>>>>> def Fun():
return 1, 2, 3
>>>>>> a = Fun()
>>>>>> type(a)
<type 'tuple'>
>>>>>> a
(1, 2, 3)(1, 2, 3)当然,函数参数和原变量同时指向同一对象,我们是可以改变该对象成员的。
>>>>>> class Data:
def __init__(self):
self.i = 10
>>>>>> def Fun(d):
d.i = 100
>>>>>> d = Data()
>>>>>> d.i
10
>>>>>> Fun(d)
>>>>>> d.i
100我们可以使用 global 关键词来实现类似 C# ref/out 的功能。
>>>>>> def Foo():
global i
i = 100
>>>>>> i = 10
>>>>>> Foo()
>>>>>> i
100Python 不支持方法重载,但支持缺省参数和一些特殊的调用方式。