函数
函数定义:
def 函数名 (参数列表):
函数内容
值得注意的是,函数中变量默认是 local 的,如果要访问全局变量,那么需要在函数中声明其为 global 的,如:
bar = 0
def foo ():
global bar
bar = bar + 1
print str(bar)
python 具备和 C++ 相同的两种参数列表结构,就是 (var1, var2) 和 (var1, var2=default value) 这两种,但除此之外呢,和 C/C++ 的 … 类似,python 还有两种针对不定参数个数的独门武功,举例说明:
def foo (*params):
if len(params) == 0:
print 'no parameter' # 如果调用方式为 foo() 则进入这里
else
print params # 如果调用方式为 foo(1, 2, 3, 4),则这里输出为 (1, 2, 3, 4),params 是一个 tuple
def bar (**params):
if len(params) == 0:
print 'no parameter' # bar()
else
print params # bar(name='ddh', age=32),则这里输出为 {'name' : 'ddh', 'age' : 32},params 是一个 dict。
对于 ** 这种方式,调用函数的时候,必须指定参数的名称和值,名称不需要带引号,但进入函数以后,自然成为同名的字符串,如上可见。
Python 所有的变量(不仅仅是传参)都是基于引用的,但是 python 的对象分为两种,一种叫 immutable,还有一种叫 mutable,区别在哪里呢?后者具有方法来改变自己,比如 list.append() 等,而 str 就是 immutable 的,也即,所有的 str 方法都不能改变自己(比如 str.replace() 是返回一个被替换过的 str,原来的 str 不变)。这样的话,我们这么来看:
def foo (s):
s = '456'
name = '123'
foo(name)
首先,name本身不是对象,它是对一个str且内容为 '123' 的str对象的引用。其次,在 foo 函数中, s 是对同一个对象的,引用,而不是对 name 的引用。那么可以断定:
1.对 s 的改变无法影响到 name,因为 name 并未被引用进来。
2.s = '456' 只是把 s 换成了对另一个内容为 '456' 的 str 对象的引用,无法改变之前那个 '123' 的 str 对象。
3.因为 str 不提供改变自己的方法,所以,foo 函数无法改变 name 所指向的对象的值。
这么来看的话,immutable 对象创建出来之后就不能变了,比如:
s = '123'
s = '456'
这里第一句,s 指向一个内容为 '123' 的 str 对象,第二句,s 指向一个内容为 '456' 的 str 对象。第一句中的对象,没有被任何人引用了,之后会被 “废料收集” 程序废掉,但我们不能改变它的内容。另:参见附录一 《对 python 中引用问题的再思考》。
除此之外,函数就没什么神奇的地方了,比如可以通过 return 返回一个值等等。
TRY...EXCEPT
对于出现 traceback 的错误来讲,可以通过 try...except 来挽救。比如:
def safeint(sval):
try:
return int(sval)
except:
return -1
这样,safeint('xxxx') 就不会出现 traceback 了,因为 int('xxx') 会被 except 捕获,正常返回 -1。