📄 00000003.htm
字号:
None <BR>><I>>> </I><BR> <BR>也可以写一个函数返回Fibonacci 序列的数值列表而不是显示这些值: <BR> <BR>><I>>> def fib2(n): # 返回直到n的Fibonacci 序列值 </I><BR>... result = [] <BR>... a, b = 0, 1 <BR>... while b < n: <BR>... result.append(b) # 解释见下面 <BR>... a, b = b, a+b <BR>... return result <BR>... <BR>><I>>> f100 = fib2(100) # 调用 </I><BR>><I>>> f100 # 输出结果 </I><BR>[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] <BR> <BR>><I>>> </I><BR> <BR>这个例子也演示了新的Python特色:return语句从函数中退出并返回一个值。不带返回 <BR>值的return可以从过程中间退出,运行到过程的末尾也可以退出,这两种情况下返回No <BR>ne。 <BR>语句result.append(b)调用列表对象result的一个方法。方法是“属于”一个对象的函 <BR>数,引用格式为obj.methodname,其中obj是某个对象(也允许是一个表达式), meth <BR>odname 是由该对象的类型定义的一个方法的名字。不同的不同的方法。不同类型的方法 <BR>可以使用相同的名字而不致引起误解。(可以定义自己的对象类型和方法,使用类,本 <BR>文后面会讨论这个话题)。例子中的append()方法时列表对象的方法,它在列表末尾增 <BR>加一个新元素。在本例中这等价于“result = result + [b]”,只是更有效。 <BR>4.7 函数参数 <BR> 可以定义使用可变个数参数的函数。这样的定义方法有三种,可以联合使用。 <BR>4.7.1 参数缺省值 <BR>可以为一个参数或几个参数指定缺省值。这样定义的函数在调用时实参个数可以比定义 <BR>时少。例如: <BR>def ask_ok(prompt, retries=4, complaint='Yes or no, please!'): <BR> while 1: <BR> ok = raw_input(prompt) <BR> if ok in ('y', 'ye', 'yes'): return 1 <BR> if ok in ('n', 'no', 'nop', 'nope'): return 0 <BR> retries = retries - 1 <BR> if retries < 0: raise IOError, 'refusenik user' <BR> print complaint <BR>这个函数在调用时既可以这样调用:ask_ok('Do you really want to quit?'),或者可 <BR>以这样调用:ask_ok('OK to overwrite the file?', 2)。缺省值是在函数定义时的定 <BR>义作用域中计算的,所以例如: <BR>i = 5 <BR>def f(arg = i): print arg <BR>i = 6 <BR>f() <BR>将显示5。 <BR>注意:缺省值只计算一次。当缺省值是可变对象如列表或字典时这一点是要注意的。例 <BR>如,以下函数会在以后的调用中累加它的值: <BR>def f(a, l = []): <BR> l.append(a) <BR> return l <BR>print f(1) <BR>print f(2) <BR>print f(3) <BR>This will print <BR> <BR>[1] <BR>[1, 2] <BR>[1, 2, 3] <BR>如果你不希望缺省值在连续的调用中被保留,可以象下面这样改写函数: <BR>def f(a, l = None): <BR> if l is None: <BR> l = [] <BR> l.append(a) <BR> return l <BR>4.7.2 关键字参数 <BR>函数调用时也可以象“关键字 = 值”这样指定实参,其中关键字是定义时使用的形参的 <BR>名字。例如: <BR>def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'): <BR> print "-- This parrot wouldn't", action, <BR> print "if you put", voltage, "Volts through it." <BR> print "-- Lovely plumage, the", type <BR> print "-- It's", state, "!" <BR>可以用如下几种方式调用: <BR>parrot(1000) # 缺省值 <BR>parrot(action = 'VOOOOOM', voltage = 1000000) # 关键字,缺省值,次序可变 <BR>parrot('a thousand', state = 'pushing up the daisies') # 位置参数,缺省值, <BR>关键字 <BR>parrot('a million', 'bereft of life', 'jump') # 位置参数,缺省值 <BR>但以下几种调用方式是错误的: <BR> <BR>parrot() # 非缺省的参数没有提供 <BR>parrot(voltage=5.0, 'dead') # 关键字参数后面又出现了非关键字参数 <BR>parrot(110, voltage=220) # 参数值重复提供 <BR>parrot(actor='John Cleese') # 未知关键字 <BR>一般说来,实参表中位置参数在前,关键字参数在后,关键字名字必须是形参名字。形 <BR>参有没有缺省值都可以用关键字参数的形式调用。每一形参至多只能对应一个实参,因 <BR>此,已经由位置参数传入值的形参就不能在同一调用中再作为关键字参数。 <BR>如果形参表中有一个形为**name的形参,在调用时这个形参可以接收一个字典,字典中 <BR>包含所有不与任何形参匹配的关键字参数。形参表中还可以使用一个特殊的如*name的形 <BR>参,它将接受所有不能匹配的位置参数组成的一个序表。*name只能在**name之前出现。 <BR>例如,如果定义了下面的函数: <BR>def cheeseshop(kind, *arguments, **keywords): <BR> print "-- Do you have any", kind, '?' <BR> print "-- I'm sorry, we're all out of", kind <BR> for arg in arguments: print arg <BR> print '-'*40 <BR> for kw in keywords.keys(): print kw, ':', keywords[kw] <BR>就可以象下面这样调用: <BR>cheeseshop('Limburger', "It's very runny, sir.", <BR> "It's really very, VERY runny, sir.", <BR> client='John Cleese', <BR> shopkeeper='Michael Palin', <BR> sketch='Cheese Shop Sketch') <BR>结果显示: <BR>-- Do you have any Limburger ? <BR>-- I'm sorry, we're all out of Limburger <BR>It's very runny, sir. <BR>It's really very, VERY runny, sir. <BR>---------------------------------------- <BR>client : John Cleese <BR>shopkeeper : Michael Palin <BR>sketch : Cheese Shop Sketch <BR>4.7.3 任意个数参数 <BR>在所有有名的形参的后面可以有两个特殊的形参,一个以*args的形式命名,一个以**k <BR>w 的形式命名。有了*args形式的形参后函数在调用时就可以在正常的能匹配的实参表后 <BR>面输入任意个数的参数,这些参数组成一个序表赋给args形参,不能匹配的关键字参数 <BR>组成一个字典赋给kw形参。在任意个数形参之前可以有0到多个正常的参数。例如: <BR>def fprintf(file, format, *args): <BR> file.write(format % args) <BR>4.7.4 Lambda形式 <BR>因为许多人的要求,Python中加入了一些在函数编程语言和Lisp中常见的功能。可以用 <BR>lambda 关键字来定义小的无名函数。这是一个返回其两个参数的和的函数:“lambda <BR>a, b: a+b” 。Lambda形式可以用于任何需要函数对象的地方。从句法上讲lambda形式 <BR>局限于一个表达式。从语义上讲,这只是正常的函数定义的句法甜食。像嵌套函数定义 <BR>一样,lambda形式不能访问包含其定义的作用域中的变量,但审慎地使用缺省参数之可 <BR>以绕过这个限制。例如: <BR>def make_incrementor(n): <BR> return lambda x, incr=n: x+incr <BR>4.7.5 文档字符串 <BR>关于文档字符串的内容与格式正在形成一些惯例。第一行应该为简短的对象目的概括说 <BR>明。为了简明起见,这一行不应该提及对象的名字或类型,因为这些可以通过其他途径 <BR>得知(当然如果对象名字就是一个描述函数操作的动词则当然可以提及其名字)。着以 <BR>行应该用大些字母开始,以句点结尾。如果文档字符串中有多行,第二行应该是空行, <BR>把概括说明与其它说明分开。以下的行可以是一段或几段,描述对象的调用方法,它的 <BR>副作用,等等。 <BR>Python的扫描程序不会从多行字符串中去掉缩进空白,所以处理文档的工具需要自己处 <BR>理缩进。只要遵循如下的惯例就可以有利于缩进空白的处理。在第一行之后的第一个非 <BR>空白的行决定整个文档字符串的缩进数量(我们不用第一行,因为它经常是直接跟在表 <BR>示字符串开始的引号后面)。文档字符串中除第一行以外的各行都要删除等价于此行的 <BR>缩进量的空白。对制表符将扩展为空格后再删除。 <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 smth.org·[FROM: 162.105.17.22] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -