学习Python(2)——函数

先写一个例子——生成n以内的Fibonacci数:
def  fib(n):
    a,b
= 0, 1
    
while  b < n:
        
print  b,
        a,b
= b,a + b
def指出了接下来的部分是一个函数。Python和C语言类似,并不区分过程(无返回值)和函数(有返回值)。像上面那样严格的说就是一个过程(Procedure)。
对于一个项目而言,在不同的模块的代码中插入一段简洁明了的说明文字是很有必要的。Python支持类似Java-Doc的语法。例如:
def  fib(n ):
    
""" Print a Fibonacci series up to n. """
    a,b
= 0, 1
    
while  b < n:
        
print  b,
        a,b
= b,a + b
将说明文字放在一对“”“(三个又引号)之间,一些文档生成工具就会将这些文字提取出来,生成HTML或是LaTeX等文档。写这些文字费不了多少时间,养成这种习惯绝对是大有好处的。
函数的调用也非常简单,对于上面的而言,只需直接用fib(100),就会产生相应的输出:
1 1 2 3 5 8 13 21 34 55 89
函数本身也可以被引用。对于已经定义好的fib来说,如果有一句:f=fib,就意味着f引用了fib这个函数。现在这两个名字所指的就是同一个东西。于是就可以这样使用:
>>>f(100)
输出结果和上面的是一样的。可以比照着C语言中的”函数指针“来理解一下。
虽然Python的函数可以不显式地写出return语句,实际上这种函数也会返回一个特殊的值None。例如有一个什么都不干的函数:
def  fun():
    
pass
可以通过在解释器中用print来显示一下它的值:
>>>print fun()
None
现在可以将上面的fib函数改造一下,让它不再直接产生输出,而是产生一个Fibonacci数列的List:
def  fib2(n):
    
""" Print a Finonacci series up to n. """
    a,b
= 0, 1
    result
= []
    
while  b < n:
        result.append(b)
        a,b
= b,a + b
    
return  result
append是List类的一个方法,即向一个List后添加元素。这个函数的效果如下:
>>>print fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
默认参数
Python函数支持默认参数。你可以定义一个两个参数的函数,但在调用的时候可以只告诉其中一个参数或是一个都不告诉——只要你在定义的时候指定了参数的默认值。这很像是从C++中学来的。
def  ask_ok(prompt,retries = 4 ,complaint = ' Yes or no, please! ' ):
    
while  True:
        ok
= raw_input(prompt)
        
if  ok  in  ( ' y ' , ' ye ' , ' yes ' ):  return  True
        
if  ok  in  ( ' n ' , ' no ' , ' nop ' , ' nope ' ):  return  False
        retries
= retries - 1
        
if  retries < 0:  raise  IOError,  ' refusenik user '
        
print  complaint
这样就有了多种调用方式:
>>>ask_ok('Do you really want to quit?')
>>>ask_ok('Do you really want to quit?',2)
>>>ask_ok('Do you really want to quilt?',3,'What do you want to do?')
参数的默认值是在定义的时在函数的入口处确定下来的。这可以通过一个实验来说明:
=   5
def  f(arg = i):
    
print  arg
=   6
f()
发现输出的是5而不是6,因为后来的i改变根本不会对函数里的arg造成影响。
要注意的是,函数的默认参数部分只会被计算一次。这样如果默认参数是某种复合类型(List,String,Class),可能会产生一种”积累效应“:
def  f(a,L = []):
    L.append(a)
    
return  L
如果调用三次:
>>> print f(1)
[1]
>>> print f(2)
[1, 2]
>>> print f(3)
[1, 2, 3]
要避免这种情况,就需要在定义的参数列表中显式地将L的默认值指定为None:
def  f(a,L = None):
    
if  L  is  None:
        L
= []
    L.append(a)
    
return  L
带关键字的参数
关键字可以理解为函数头部参数的名字。通过在调用函数的时候指定关键字,可以不按照参数定义的顺序来传递参数的值。
def  parrot(voltage, state = ' a stiff ' , action = ' voom ' , type = ' Norwegian Blue ' ):
    
print   " -- This parrot wouldn't " , action,
    
print   " if you put " , voltage,  " volts through it. "
    
print   " -- Lovely plumage, the " , type
    
print   " -- It's " , state,  " ! "
带关键字调用:
parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')
下面的几种调用方式是错的:
parrot() # 缺少指定参数
parrot(voltage=5.0, 'dead') # 没有指出关键字
parrot(110, voltage=220) # 传递重复参数
parrot(actor='John Cleese') # 不存在的关键字
更为灵活的是,可以通过在函数定义时用*name或**name的方式代表不确定的参数或带有关键字的参数(Dictionary)。这个用例子说明会容易理解一下:
def  cheeseshop(kind,  * arguments,  ** keywords):
    
print   " -- Do you have any " , kind,  ' ? '
    
print   " -- I'm sorry, we're all out of " , kind
    
for  arg  in  arguments:  print  arg
    
print   ' - ' * 40
    keys 
=  keywords.keys()
    keys.sort()
    
for  kw  in  keys:  print  kw,  ' : ' , keywords[kw]
可以这样调用:
cheeseshop('Limburger', "It's very runny, sir.","It's really very, VERY runny, sir.",client='John Cleese', shopkeeper='Michael Palin',sketch='Cheese Shop Sketch')
结果是:
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch
传递多个参数时还可以通过List来进行。List中的元素会被分离开,称为Unpack,这是Python解释器在幕后完成的。例如range函数可以指定两个参数,可以把这两个参数构成一个List,再将这个List传入:
>>> args = [3, 6]
>>> range(*args) # call with arguments unpacked from a list
[3, 4, 5]
类似地,可以使用**操作符来传递一个字典,对应于带关键字传递参数的方式。
>>> def parrot(voltage, state='a stiff', action='voom'):
...         print "-- This parrot wouldn't", action,
...         print "if you put", voltage, "volts through it.",
...         print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
用心领悟一下

Lambda函数
Python从函数语言中学来了这一功能。Lambda函数是一种匿名函数,功能有些像函数的模板,通过它可能方便地生成其他函数。感觉Lambda函数更加需要领悟,只里仅仅记几个例子:
>>> def make_incrementor(n):
...         return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值