学习Python(2)——函数

本文详细介绍了Python函数的各种特性,包括Fibonacci数列的生成、函数的定义与调用、默认参数、带关键字的参数、Lambda函数等内容。
先写一个例子——生成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、付费专栏及课程。

余额充值