📄 node6.html
字号:
</dl> <p> </p> <h2> <br> 4.7.2 关键字参数 </h2> <p> 呼叫函式时也可以使用关键字参数,其形式是 "<tt class="samp"><var>keyword</var> = <var>value</var></tt>" ,底下的这个函式: </p> <p> </p> <dl> <dd><pre class="verbatim">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></pre> </dd> </dl> <p> 用这些方式呼叫都是正确的: </p> <p> </p> <dl> <dd><pre class="verbatim">parrot(1000)<br>parrot(action = 'VOOOOOM', voltage = 1000000)<br>parrot('a thousand', state = 'pushing up the daisies')<br>parrot('a million', 'bereft of life', 'jump')<br></pre> </dd> </dl> <p> 但是用这些方式都是不正确的: </p> <p> </p> <dl> <dd><pre class="verbatim">parrot() # required argument missing<br>parrot(voltage=5.0, 'dead') # non-keyword argument following keyword<br>parrot(110, voltage=220) # duplicate value for argument<br>parrot(actor='John Cleese') # unknown keyword<br></pre> </dd> </dl> <p> 一般来说,一连串的参数的次序是先有非关键字参数(也可以没有)然后才是关键字参数,关键字必须是函式定义时所用的参数名称。这个定义时用的参数名称有没有预设值并不重要,但是一个传入的参数只能有一个值(预设值不算),如果你已经先用非关键字参数给了某个参数一个值,接下来你就不能再用关键字参数给它另外的值。底下的例子就违反了这个规则: </p> <p> </p> <dl> <dd><pre class="verbatim">>>> def function(a):<br>... pass<br>... <br>>>> function(0, a=0)<br>Traceback (innermost last):<br> File "<stdin>", line 1, in ?<br>TypeError: keyword parameter redefined<br></pre> </dd> </dl> <p> 当一个函式定义时参数名称是以 <code>**<var>name</var></code> 这种形式定义时,表示这个参数要接受的是一个 dictionary(译:字典,包含许多关键字以及值的对应),这个dictionary 包含许多的关键字参数,但是这些关键字不能跟其他的参数名称相同。另外参数也可以用 <code>*<var>name</var></code> 这种形式定义(下一小节会解释),这种方式定义的参数要接受的是一个 tuple(译:不可更动的list),这个 tuple 可以接受不限数目的非关键字参数( <code>*<var>name</var></code> 必须要出现在 <code>**<var>name</var></code> 之前)。下面的例子就是一个函式定义的范例: </p> <p> </p> <dl> <dd><pre class="verbatim">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></pre> </dd> </dl> <p> 要呼叫这个函式,你可以这样呼叫: </p> <p> </p> <dl> <dd><pre class="verbatim">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></pre> </dd> </dl> <p> 函式执行的结果如下: </p> <p> </p> <dl> <dd><pre class="verbatim">-- 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></pre> </dd> </dl> <p> </p> <h2> <br> 4.7.3 随意的参数串 </h2> <p> 最后,我们要介绍最不常见的形式,也就是定义一个函式可以接受任意数目的参数,这些传入的参数会被放进一个tuple里面去。在这一个任意数目的参数之前,可以定义没有或是一个或是多个普通的参数: </p> <p> </p> <dl> <dd><pre class="verbatim">def fprintf(file, format, *args):<br> file.write(format % args)<br></pre> </dd> </dl> <p> </p> <h2> <br> 4.7.4 Lambda 形式 </h2> <p> 由于众多的需求,Python里面也加入了这一个在其他功能性程式语言及Lisp里面常见的特性。你可以使用 <tt class="keyword">lambda</tt> 这个关键字来定义一些小的没有名字的函式。底下是一个传回两个参数值相加结果的例子: "<tt class="samp">lambda a, b:a+b</tt>" 。Lambda形式可以使用在任何需要函式物件(function objects)的地方。语法上限制lambda形式只能有一个expression,其功能只是方便的取代一个正常的函式定义。就像是函式里面包含函式定义一样,lambda形式不能使用(reference)外面一层函式的的变数,但是你可以使用传入预设值参数的方式来克服这个问题,像是下面的例子: </p> <p> </p> <dl> <dd><pre class="verbatim">def make_incrementor(n):<br> return lambda x, incr=n: x+incr<br></pre> </dd> </dl> <p> </p> <h2> <br> 4.7.5 注解字串 </h2> <p> 注解字串的内容及形式是有一个新的约定俗成的规范的。 </p> <p> 第一行应该是一个有关这个物件的目的的短的、简洁的摘要。因为简洁的缘故,这一行不应该包括物件的名称及型态(除非物件的的名称正好是解释物件目的的一个动词),因为物件名称及型态是可以从其他地方得知的。这一行第一个字的第一个字母应该大写,最后应该有一个句点。 </p> <p> 如果注解字串还包含其他行的话,第二行应该是空白的,这样可以让摘要及细部的解释有所区分。底下的各行应该是一个或多个段落,其目的应该是诸如解释物件的呼叫方法及其副效果(sideeffects)的解释说明。 </p> <p> 一般时候,Python的分析器(parser)并不会把多行字串的缩排拿掉,但是在注解字串中,注解字串的处理工具需要特别拿掉那些缩排。底下的一般通用准则可以用来帮助决定注解字串如何缩排:在第一行之后所遇到的第一个非空白行决定了整个注解字串的缩排大小,(我们不能用第一行,因为第一行一定要跟着引号在一起,所以其缩排是不明显的)。在这之后的与这个缩排相等的空白,都会被整个拿掉。如果某行的前面有空白但缩排的空白不足(这是不应该发生的),这些缩排也会被整个拿掉。空白的解释是把tab展开后(一般为八个空白)的方式来解释的。 </p> <p> 这里示范了如何使用多行的注解字串: </p> <p> </p> <dl> <dd><pre class="verbatim">>>> def my_function():<br>... """Do nothing, but document it.<br>... <br>... No, really, it doesn't do anything.<br>... """<br>... pass<br>... <br>>>> print my_function.__doc__<br>Do nothing, but document it.<br><br> No, really, it doesn't do anything.<br></pre> </dd> </dl> <p> <br> </p> <hr> <h4>注脚</h4> <dl> <dt><a name="foot1251">... 物件本身的值。</a><a name="foot1251" href="node6.html#tex2html2"><sup>4.1</sup></a> </dt> <dd> 事实上是,较洽当的说法是以其物件参考传入的( <i>call by objectreference</i> ),因为如果一个不可改变的物件传入之后,呼叫这个函式的地方仍然可以看到这个函式对这个物件的改变(例如在list之中插入一个物件)。 </dd> </dl> <div class="navigation"> <table align="Center" width="100%" cellpadding="0" cellspacing="2"> <tbody> <tr> <td><a href="node5.html"><img src="../icons/previous.gif" border="0" height="32" alt="Previous Page" width="32"></a></td> <td><a href="tut.html"><img src="../icons/up.gif" border="0" height="32" alt="Up One Level" width="32"></a></td> <td><a href="node7.html"><img src="../icons/next.gif" border="0" height="32" alt="Next Page" width="32"></a></td> <td align="Center" width="100%">Python 教学文件</td> <td><a href="node2.html"><img src="../icons/contents.gif" border="0" height="32" alt="Contents" width="32"></a></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> <td><img src="../icons/blank.gif" border="0" height="32" alt="" width="32"></td> </tr> </tbody> </table> <b class="navlabel">Previous:</b> <a class="sectref" href="node5.html">3.非正式的Python介绍</a> <b class="navlabel">Up:</b> <a class="sectref" href="tut.html">Python 教学文件</a> <b class="navlabel">Next:</b> <a class="sectref" href="node7.html">5. 资料结构</a> <br> <hr></div> <!--End of Navigation Panel--> <address> </address> <hr>请看<i><a href="about.html">关于此文件…</a></i> 里面有关如何给我们建议的说明。 </body> </html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -