916 lines
103 KiB
HTML
916 lines
103 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
|
||
<head>
|
||
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
|
||
|
||
<title>4. 更多控制流工具 — Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
|
||
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
|
||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||
|
||
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
|
||
<script src="../_static/jquery.js"></script>
|
||
<script src="../_static/underscore.js"></script>
|
||
<script src="../_static/doctools.js"></script>
|
||
<script src="../_static/language_data.js"></script>
|
||
<script src="../_static/translations.js"></script>
|
||
|
||
<script src="../_static/sidebar.js"></script>
|
||
|
||
<link rel="search" type="application/opensearchdescription+xml"
|
||
title="在 Python 3.8.20 文档 中搜索"
|
||
href="../_static/opensearch.xml"/>
|
||
<link rel="author" title="关于这些文档" href="../about.html" />
|
||
<link rel="index" title="索引" href="../genindex.html" />
|
||
<link rel="search" title="搜索" href="../search.html" />
|
||
<link rel="copyright" title="版权所有" href="../copyright.html" />
|
||
<link rel="next" title="5. 数据结构" href="datastructures.html" />
|
||
<link rel="prev" title="3. Python 速览" href="introduction.html" />
|
||
<link rel="canonical" href="https://docs.python.org/3/tutorial/controlflow.html" />
|
||
|
||
|
||
|
||
|
||
|
||
<style>
|
||
@media only screen {
|
||
table.full-width-table {
|
||
width: 100%;
|
||
}
|
||
}
|
||
</style>
|
||
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
|
||
<script type="text/javascript" src="../_static/copybutton.js"></script>
|
||
<script type="text/javascript" src="../_static/menu.js"></script>
|
||
|
||
</head>
|
||
<body>
|
||
<div class="mobile-nav">
|
||
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
|
||
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
|
||
<label for="menuToggler" class="toggler__label">
|
||
<span></span>
|
||
</label>
|
||
<nav class="nav-content" role="navigation">
|
||
<a href="https://www.python.org/" class="nav-logo">
|
||
<img src="../_static/py.svg" alt="Logo"/>
|
||
</a>
|
||
<div class="version_switcher_placeholder"></div>
|
||
<form role="search" class="search" action="../search.html" method="get">
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
|
||
<path fill-rule="nonzero"
|
||
d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" fill="#444"></path>
|
||
</svg>
|
||
<input type="text" name="q" aria-label="快速搜索"/>
|
||
<input type="submit" value="转向"/>
|
||
</form>
|
||
</nav>
|
||
<div class="menu-wrapper">
|
||
<nav class="menu" role="navigation" aria-label="main navigation">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<h3><a href="../contents.html">目录</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#">4. 更多控制流工具</a><ul>
|
||
<li><a class="reference internal" href="#if-statements">4.1. <code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code> 语句</a></li>
|
||
<li><a class="reference internal" href="#for-statements">4.2. <code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code> 语句</a></li>
|
||
<li><a class="reference internal" href="#the-range-function">4.3. <code class="xref py py-func docutils literal notranslate"><span class="pre">range()</span></code> 函数</a></li>
|
||
<li><a class="reference internal" href="#break-and-continue-statements-and-else-clauses-on-loops">4.4. 循环中的 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">break</span></code>、<code class="xref std std-keyword docutils literal notranslate"><span class="pre">continue</span></code> 语句及 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">else</span></code> 子句</a></li>
|
||
<li><a class="reference internal" href="#pass-statements">4.5. <code class="xref std std-keyword docutils literal notranslate"><span class="pre">pass</span></code> 语句</a></li>
|
||
<li><a class="reference internal" href="#defining-functions">4.6. 定义函数</a></li>
|
||
<li><a class="reference internal" href="#more-on-defining-functions">4.7. 函数定义详解</a><ul>
|
||
<li><a class="reference internal" href="#default-argument-values">4.7.1. 默认值参数</a></li>
|
||
<li><a class="reference internal" href="#keyword-arguments">4.7.2. 关键字参数</a></li>
|
||
<li><a class="reference internal" href="#special-parameters">4.7.3. 特殊参数</a><ul>
|
||
<li><a class="reference internal" href="#positional-or-keyword-arguments">4.7.3.1. 位置或关键字参数</a></li>
|
||
<li><a class="reference internal" href="#positional-only-parameters">4.7.3.2. 仅位置参数</a></li>
|
||
<li><a class="reference internal" href="#keyword-only-arguments">4.7.3.3. 仅限关键字参数</a></li>
|
||
<li><a class="reference internal" href="#function-examples">4.7.3.4. 函数示例</a></li>
|
||
<li><a class="reference internal" href="#recap">4.7.3.5. 小结</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#arbitrary-argument-lists">4.7.4. 任意实参列表</a></li>
|
||
<li><a class="reference internal" href="#unpacking-argument-lists">4.7.5. 解包实参列表</a></li>
|
||
<li><a class="reference internal" href="#lambda-expressions">4.7.6. Lambda 表达式</a></li>
|
||
<li><a class="reference internal" href="#documentation-strings">4.7.7. 文档字符串</a></li>
|
||
<li><a class="reference internal" href="#function-annotations">4.7.8. 函数注解</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#intermezzo-coding-style">4.8. 小插曲:编码风格</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="introduction.html"
|
||
title="上一章"><span class="section-number">3. </span>Python 速览</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="datastructures.html"
|
||
title="下一章"><span class="section-number">5. </span>数据结构</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/tutorial/controlflow.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
|
||
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
|
||
这个文档所针对的是一个已不再受支持的 Python 旧版本。
|
||
你应当升级版本,并阅读
|
||
<a href="/3/tutorial/controlflow.html"> Python 当前稳定版本的文档</a>.
|
||
</div>
|
||
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>导航</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="总目录"
|
||
accesskey="I">索引</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python 模块索引"
|
||
>模块</a> |</li>
|
||
<li class="right" >
|
||
<a href="datastructures.html" title="5. 数据结构"
|
||
accesskey="N">下一页</a> |</li>
|
||
<li class="right" >
|
||
<a href="introduction.html" title="3. Python 速览"
|
||
accesskey="P">上一页</a> |</li>
|
||
|
||
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Python 教程</a> »</li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
|
||
<div class="document">
|
||
<div class="documentwrapper">
|
||
<div class="bodywrapper">
|
||
<div class="body" role="main">
|
||
|
||
<section id="more-control-flow-tools">
|
||
<span id="tut-morecontrol"></span><h1><span class="section-number">4. </span>更多控制流工具<a class="headerlink" href="#more-control-flow-tools" title="永久链接至标题">¶</a></h1>
|
||
<p>除了上一章介绍的 <a class="reference internal" href="../reference/compound_stmts.html#while"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">while</span></code></a> 语句,Python 还支持其他语言中常见的流程控制语句,只是稍有不同。</p>
|
||
<section id="if-statements">
|
||
<span id="tut-if"></span><h2><span class="section-number">4.1. </span><code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code> 语句<a class="headerlink" href="#if-statements" title="永久链接至标题">¶</a></h2>
|
||
<p>最让人耳熟能详的语句应当是 <a class="reference internal" href="../reference/compound_stmts.html#if"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code></a> 语句:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">x</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="nb">input</span><span class="p">(</span><span class="s2">"Please enter an integer: "</span><span class="p">))</span>
|
||
<span class="go">Please enter an integer: 42</span>
|
||
<span class="gp">>>> </span><span class="k">if</span> <span class="n">x</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s1">'Negative changed to zero'</span><span class="p">)</span>
|
||
<span class="gp">... </span><span class="k">elif</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s1">'Zero'</span><span class="p">)</span>
|
||
<span class="gp">... </span><span class="k">elif</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s1">'Single'</span><span class="p">)</span>
|
||
<span class="gp">... </span><span class="k">else</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s1">'More'</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="go">More</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>可有零个或多个 <a class="reference internal" href="../reference/compound_stmts.html#elif"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">elif</span></code></a> 部分,<a class="reference internal" href="../reference/compound_stmts.html#else"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">else</span></code></a> 部分也是可选的。关键字 '<code class="xref std std-keyword docutils literal notranslate"><span class="pre">elif</span></code>' 是 'else if' 的缩写,用于避免过多的缩进。<code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code> ... <code class="xref std std-keyword docutils literal notranslate"><span class="pre">elif</span></code> ... <code class="xref std std-keyword docutils literal notranslate"><span class="pre">elif</span></code> ... 序列可以当作其它语言中 <code class="docutils literal notranslate"><span class="pre">switch</span></code> 或 <code class="docutils literal notranslate"><span class="pre">case</span></code> 语句的替代品。</p>
|
||
</section>
|
||
<section id="for-statements">
|
||
<span id="tut-for"></span><h2><span class="section-number">4.2. </span><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code> 语句<a class="headerlink" href="#for-statements" title="永久链接至标题">¶</a></h2>
|
||
<p id="index-0">Python 的 <a class="reference internal" href="../reference/compound_stmts.html#for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code></a> 语句与 C 或 Pascal 中的不同。Python 的 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code> 语句不迭代算术递增数值(如 Pascal),或是给予用户定义迭代步骤和结束条件的能力(如 C),而是在列表或字符串等任意序列的元素上迭代,按它们在序列中出现的顺序。 例如(这不是有意要暗指什么):</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="c1"># Measure some strings:</span>
|
||
<span class="gp">... </span><span class="n">words</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'cat'</span><span class="p">,</span> <span class="s1">'window'</span><span class="p">,</span> <span class="s1">'defenestrate'</span><span class="p">]</span>
|
||
<span class="gp">>>> </span><span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">words</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">w</span><span class="p">))</span>
|
||
<span class="gp">...</span>
|
||
<span class="go">cat 3</span>
|
||
<span class="go">window 6</span>
|
||
<span class="go">defenestrate 12</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>很难正确地在迭代多项集的同时修改多项集的内容。更简单的方法是迭代多项集的副本或者创建新的多项集:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Strategy: Iterate over a copy</span>
|
||
<span class="k">for</span> <span class="n">user</span><span class="p">,</span> <span class="n">status</span> <span class="ow">in</span> <span class="n">users</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||
<span class="k">if</span> <span class="n">status</span> <span class="o">==</span> <span class="s1">'inactive'</span><span class="p">:</span>
|
||
<span class="k">del</span> <span class="n">users</span><span class="p">[</span><span class="n">user</span><span class="p">]</span>
|
||
|
||
<span class="c1"># Strategy: Create a new collection</span>
|
||
<span class="n">active_users</span> <span class="o">=</span> <span class="p">{}</span>
|
||
<span class="k">for</span> <span class="n">user</span><span class="p">,</span> <span class="n">status</span> <span class="ow">in</span> <span class="n">users</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
|
||
<span class="k">if</span> <span class="n">status</span> <span class="o">==</span> <span class="s1">'active'</span><span class="p">:</span>
|
||
<span class="n">active_users</span><span class="p">[</span><span class="n">user</span><span class="p">]</span> <span class="o">=</span> <span class="n">status</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="the-range-function">
|
||
<span id="tut-range"></span><h2><span class="section-number">4.3. </span><a class="reference internal" href="../library/stdtypes.html#range" title="range"><code class="xref py py-func docutils literal notranslate"><span class="pre">range()</span></code></a> 函数<a class="headerlink" href="#the-range-function" title="永久链接至标题">¶</a></h2>
|
||
<p>内置函数 <a class="reference internal" href="../library/stdtypes.html#range" title="range"><code class="xref py py-func docutils literal notranslate"><span class="pre">range()</span></code></a> 用于生成等差数列:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="go">0</span>
|
||
<span class="go">1</span>
|
||
<span class="go">2</span>
|
||
<span class="go">3</span>
|
||
<span class="go">4</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>生成的序列绝不会包括给定的终止值;<code class="docutils literal notranslate"><span class="pre">range(10)</span></code> 生成 10 个值——长度为 10 的序列的所有合法索引。range 可以不从 0 开始,且可以按给定的步长递增(即使是负数步长):</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
|
||
<span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span>
|
||
|
||
<span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||
<span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">9</span>
|
||
|
||
<span class="nb">range</span><span class="p">(</span><span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="mi">100</span><span class="p">,</span> <span class="o">-</span><span class="mi">30</span><span class="p">)</span>
|
||
<span class="o">-</span><span class="mi">10</span><span class="p">,</span> <span class="o">-</span><span class="mi">40</span><span class="p">,</span> <span class="o">-</span><span class="mi">70</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>要按索引迭代序列,可以组合使用 <a class="reference internal" href="../library/stdtypes.html#range" title="range"><code class="xref py py-func docutils literal notranslate"><span class="pre">range()</span></code></a> 和 <a class="reference internal" href="../library/functions.html#len" title="len"><code class="xref py py-func docutils literal notranslate"><span class="pre">len()</span></code></a>:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Mary'</span><span class="p">,</span> <span class="s1">'had'</span><span class="p">,</span> <span class="s1">'a'</span><span class="p">,</span> <span class="s1">'little'</span><span class="p">,</span> <span class="s1">'lamb'</span><span class="p">]</span>
|
||
<span class="gp">>>> </span><span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)):</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
|
||
<span class="gp">...</span>
|
||
<span class="go">0 Mary</span>
|
||
<span class="go">1 had</span>
|
||
<span class="go">2 a</span>
|
||
<span class="go">3 little</span>
|
||
<span class="go">4 lamb</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>不过大多数情况下 <a class="reference internal" href="../library/functions.html#enumerate" title="enumerate"><code class="xref py py-func docutils literal notranslate"><span class="pre">enumerate()</span></code></a> 函数很方便,详见 <a class="reference internal" href="datastructures.html#tut-loopidioms"><span class="std std-ref">循环的技巧</span></a>。</p>
|
||
<p>如果直接打印一个 range 会发生意想不到的事情:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>
|
||
<span class="go">range(0, 10)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p><a class="reference internal" href="../library/stdtypes.html#range" title="range"><code class="xref py py-func docutils literal notranslate"><span class="pre">range()</span></code></a> 返回的对象在很多方面和列表的行为一样,但其实它和列表不一样。该对象只有在被迭代时才一个一个地返回所期望的列表项,并没有真正生成过一个含有全部项的列表,从而节省了空间。</p>
|
||
<p>这种对象称为可迭代对象 <a class="reference internal" href="../glossary.html#term-iterable"><span class="xref std std-term">iterable</span></a>,适合作为需要获取一系列值的函数或程序构件的参数。<a class="reference internal" href="../reference/compound_stmts.html#for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code></a> 语句就是这样的程序构件;以可迭代对象作为参数的函数例如 <a class="reference internal" href="../library/functions.html#sum" title="sum"><code class="xref py py-func docutils literal notranslate"><span class="pre">sum()</span></code></a>:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">sum</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">))</span> <span class="c1"># 0 + 1 + 2 + 3</span>
|
||
<span class="go">6</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>稍后我们将看到更多返回可迭代对象以及将可迭代对象作为参数的函数。 最后,也许你会很好奇如何从一个指定范围内获取一个列表。 以下是解决方案:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">))</span>
|
||
<span class="go">[0, 1, 2, 3]</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>在 <a class="reference internal" href="datastructures.html#tut-structures"><span class="std std-ref">数据结构</span></a> 章节中,我们将讨论 <a class="reference internal" href="../library/stdtypes.html#list" title="list"><code class="xref py py-func docutils literal notranslate"><span class="pre">list()</span></code></a> 的更多细节。</p>
|
||
</section>
|
||
<section id="break-and-continue-statements-and-else-clauses-on-loops">
|
||
<span id="tut-break"></span><h2><span class="section-number">4.4. </span>循环中的 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">break</span></code>、<code class="xref std std-keyword docutils literal notranslate"><span class="pre">continue</span></code> 语句及 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">else</span></code> 子句<a class="headerlink" href="#break-and-continue-statements-and-else-clauses-on-loops" title="永久链接至标题">¶</a></h2>
|
||
<p><a class="reference internal" href="../reference/simple_stmts.html#break"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">break</span></code></a> 语句和 C 中的类似,用于跳出最近的 <a class="reference internal" href="../reference/compound_stmts.html#for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code></a> 或 <a class="reference internal" href="../reference/compound_stmts.html#while"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">while</span></code></a> 循环。</p>
|
||
<p>循环语句支持 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">else</span></code> 子句;<a class="reference internal" href="../reference/compound_stmts.html#for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code></a> 循环中,可迭代对象中的元素全部循环完毕,或 <a class="reference internal" href="../reference/compound_stmts.html#while"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">while</span></code></a> 循环的条件为假时,执行该子句;<a class="reference internal" href="../reference/simple_stmts.html#break"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">break</span></code></a> 语句终止循环时,不执行该子句。 请看下面这个查找素数的循环示例:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">10</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">if</span> <span class="n">n</span> <span class="o">%</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="s1">'equals'</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="s1">'*'</span><span class="p">,</span> <span class="n">n</span><span class="o">//</span><span class="n">x</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="k">break</span>
|
||
<span class="gp">... </span> <span class="k">else</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="c1"># loop fell through without finding a factor</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="s1">'is a prime number'</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="go">2 is a prime number</span>
|
||
<span class="go">3 is a prime number</span>
|
||
<span class="go">4 equals 2 * 2</span>
|
||
<span class="go">5 is a prime number</span>
|
||
<span class="go">6 equals 2 * 3</span>
|
||
<span class="go">7 is a prime number</span>
|
||
<span class="go">8 equals 2 * 4</span>
|
||
<span class="go">9 equals 3 * 3</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>(没错,这段代码就是这么写。仔细看:<code class="docutils literal notranslate"><span class="pre">else</span></code> 子句属于 <a class="reference internal" href="../reference/compound_stmts.html#for"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code></a> 循环,<strong>不属于</strong> <a class="reference internal" href="../reference/compound_stmts.html#if"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code></a> 语句。)</p>
|
||
<p><code class="docutils literal notranslate"><span class="pre">else</span></code> 子句用于循环时比起 <a class="reference internal" href="../reference/compound_stmts.html#if"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code></a> 语句的 <code class="docutils literal notranslate"><span class="pre">else</span></code> 子句,更像 <a class="reference internal" href="../reference/compound_stmts.html#try"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">try</span></code></a> 语句的。<a class="reference internal" href="../reference/compound_stmts.html#try"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">try</span></code></a> 语句的 <code class="docutils literal notranslate"><span class="pre">else</span></code> 子句在未发生异常时执行,循环的 <code class="docutils literal notranslate"><span class="pre">else</span></code> 子句则在未发生 <code class="docutils literal notranslate"><span class="pre">break</span></code> 时执行。 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">try</span></code> 语句和异常详见 <a class="reference internal" href="errors.html#tut-handling"><span class="std std-ref">异常的处理</span></a>。</p>
|
||
<p><a class="reference internal" href="../reference/simple_stmts.html#continue"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">continue</span></code></a> 语句,同样借鉴自 C 语言,以执行循环的下一次迭代来继续:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">for</span> <span class="n">num</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">10</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">if</span> <span class="n">num</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Found an even number"</span><span class="p">,</span> <span class="n">num</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="k">continue</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Found an odd number"</span><span class="p">,</span> <span class="n">num</span><span class="p">)</span>
|
||
<span class="go">Found an even number 2</span>
|
||
<span class="go">Found an odd number 3</span>
|
||
<span class="go">Found an even number 4</span>
|
||
<span class="go">Found an odd number 5</span>
|
||
<span class="go">Found an even number 6</span>
|
||
<span class="go">Found an odd number 7</span>
|
||
<span class="go">Found an even number 8</span>
|
||
<span class="go">Found an odd number 9</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="pass-statements">
|
||
<span id="tut-pass"></span><h2><span class="section-number">4.5. </span><code class="xref std std-keyword docutils literal notranslate"><span class="pre">pass</span></code> 语句<a class="headerlink" href="#pass-statements" title="永久链接至标题">¶</a></h2>
|
||
<p><a class="reference internal" href="../reference/simple_stmts.html#pass"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">pass</span></code></a> 语句不执行任何动作。语法上需要一个语句,但程序毋需执行任何动作时,可以使用该语句。例如:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="k">pass</span> <span class="c1"># Busy-wait for keyboard interrupt (Ctrl+C)</span>
|
||
<span class="gp">...</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>这常用于创建一个最小的类:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">class</span> <span class="nc">MyEmptyClass</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="k">pass</span>
|
||
<span class="gp">...</span>
|
||
</pre></div>
|
||
</div>
|
||
<p><a class="reference internal" href="../reference/simple_stmts.html#pass"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">pass</span></code></a> 还可用作函数或条件语句体的占位符,让你保持在更抽象的层次进行思考。<code class="xref std std-keyword docutils literal notranslate"><span class="pre">pass</span></code> 会被默默地忽略:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">initlog</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">pass</span> <span class="c1"># Remember to implement this!</span>
|
||
<span class="gp">...</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="defining-functions">
|
||
<span id="tut-functions"></span><h2><span class="section-number">4.6. </span>定义函数<a class="headerlink" href="#defining-functions" title="永久链接至标题">¶</a></h2>
|
||
<p>下列代码创建一个可以输出限定数值内的斐波那契数列函数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="c1"># write Fibonacci series up to n</span>
|
||
<span class="gp">... </span><span class="w"> </span><span class="sd">"""Print a Fibonacci series up to n."""</span>
|
||
<span class="gp">... </span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="k">while</span> <span class="n">a</span> <span class="o"><</span> <span class="n">n</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="o">+</span><span class="n">b</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">()</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="c1"># Now call the function we just defined:</span>
|
||
<span class="gp">... </span><span class="n">fib</span><span class="p">(</span><span class="mi">2000</span><span class="p">)</span>
|
||
<span class="go">0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597</span>
|
||
</pre></div>
|
||
</div>
|
||
<p id="index-1"><em>定义</em> 函数使用关键字 <a class="reference internal" href="../reference/compound_stmts.html#def"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">def</span></code></a>,后跟函数名与括号内的形参列表。函数语句从下一行开始,并且必须缩进。</p>
|
||
<p>函数内的第一条语句是字符串时,该字符串就是文档字符串,也称为 <em class="dfn">docstring</em>,详见 <a class="reference internal" href="#tut-docstrings"><span class="std std-ref">文档字符串</span></a>。利用文档字符串可以自动生成在线文档或打印版文档,还可以让开发者在浏览代码时直接查阅文档;Python 开发者最好养成在代码中加入文档字符串的好习惯。</p>
|
||
<p>函数在 <em>执行</em> 时使用函数局部变量符号表,所有函数变量赋值都存在局部符号表中;引用变量时,首先,在局部符号表里查找变量,然后,是外层函数局部符号表,再是全局符号表,最后是内置名称符号表。因此,尽管可以引用全局变量和外层函数的变量,但最好不要在函数内直接赋值(除非是 <a class="reference internal" href="../reference/simple_stmts.html#global"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">global</span></code></a> 语句定义的全局变量,或 <a class="reference internal" href="../reference/simple_stmts.html#nonlocal"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">nonlocal</span></code></a> 语句定义的外层函数变量)。</p>
|
||
<p>在调用函数时会将实际参数(实参)引入到被调用函数的局部符号表中;因此,实参是使用 <em>按值调用</em> 来传递的(其中的 <em>值</em> 始终是对象的 <em>引用</em> 而不是对象的值)。 <a class="footnote-reference brackets" href="#id2" id="id1">1</a> 当一个函数调用另外一个函数时,会为该调用创建一个新的局部符号表。</p>
|
||
<p>函数定义在当前符号表中把函数名与函数对象关联在一起。解释器把函数名指向的对象作为用户自定义函数。还可以使用其他名称指向同一个函数对象,并访问访该函数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">fib</span>
|
||
<span class="go"><function fib at 10042ed0></span>
|
||
<span class="gp">>>> </span><span class="n">f</span> <span class="o">=</span> <span class="n">fib</span>
|
||
<span class="gp">>>> </span><span class="n">f</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
|
||
<span class="go">0 1 1 2 3 5 8 13 21 34 55 89</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>如果你用过其他语言,你可能会认为 <code class="docutils literal notranslate"><span class="pre">fib</span></code> 不是函数而是一个过程,因为它没有返回值。 事实上,即使没有 <a class="reference internal" href="../reference/simple_stmts.html#return"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code></a> 语句的函数也有返回值,尽管这个值可能相当无聊。 这个值被称为 <code class="docutils literal notranslate"><span class="pre">None</span></code> (是一个内置名称)。 通常解释器会屏蔽单独的返回值 <code class="docutils literal notranslate"><span class="pre">None</span></code>。 如果你确有需要可以使用 <a class="reference internal" href="../library/functions.html#print" title="print"><code class="xref py py-func docutils literal notranslate"><span class="pre">print()</span></code></a> 查看它:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">fib</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">fib</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
|
||
<span class="go">None</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>编写不直接输出斐波那契数列运算结果,而是返回运算结果列表的函数也非常简单:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">fib2</span><span class="p">(</span><span class="n">n</span><span class="p">):</span> <span class="c1"># return Fibonacci series up to n</span>
|
||
<span class="gp">... </span><span class="w"> </span><span class="sd">"""Return a list containing the Fibonacci series up to n."""</span>
|
||
<span class="gp">... </span> <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="gp">... </span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span>
|
||
<span class="gp">... </span> <span class="k">while</span> <span class="n">a</span> <span class="o"><</span> <span class="n">n</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="c1"># see below</span>
|
||
<span class="gp">... </span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="o">+</span><span class="n">b</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="n">result</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">f100</span> <span class="o">=</span> <span class="n">fib2</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span> <span class="c1"># call it</span>
|
||
<span class="gp">>>> </span><span class="n">f100</span> <span class="c1"># write the result</span>
|
||
<span class="go">[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>本例也新引入了一些 Python 功能:</p>
|
||
<ul class="simple">
|
||
<li><p><a class="reference internal" href="../reference/simple_stmts.html#return"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code></a> 语句返回函数的值。<code class="xref std std-keyword docutils literal notranslate"><span class="pre">return</span></code> 语句不带表达式参数时,返回 <code class="docutils literal notranslate"><span class="pre">None</span></code>。函数执行完毕退出也返回 <code class="docutils literal notranslate"><span class="pre">None</span></code>。</p></li>
|
||
<li><p><code class="docutils literal notranslate"><span class="pre">result.append(a)</span></code> 语句调用了列表对象 <code class="docutils literal notranslate"><span class="pre">result</span></code> 的 <em>方法</em> 。方法是“从属于”对象的函数,命名为 <code class="docutils literal notranslate"><span class="pre">obj.methodname</span></code>,<code class="docutils literal notranslate"><span class="pre">obj</span></code> 是对象(也可以是表达式),<code class="docutils literal notranslate"><span class="pre">methodname</span></code> 是对象类型定义的方法名。不同类型定义不同的方法,不同类型的方法名可以相同,且不会引起歧义。(用 <em>类</em> 可以自定义对象类型和方法,详见 <a class="reference internal" href="classes.html#tut-classes"><span class="std std-ref">类</span></a> )示例中的方法 <code class="xref py py-meth docutils literal notranslate"><span class="pre">append()</span></code> 是为列表对象定义的,用于在列表末尾添加新元素。本例中,该方法相当于 <code class="docutils literal notranslate"><span class="pre">result</span> <span class="pre">=</span> <span class="pre">result</span> <span class="pre">+</span> <span class="pre">[a]</span></code> ,但更有效。</p></li>
|
||
</ul>
|
||
</section>
|
||
<section id="more-on-defining-functions">
|
||
<span id="tut-defining"></span><h2><span class="section-number">4.7. </span>函数定义详解<a class="headerlink" href="#more-on-defining-functions" title="永久链接至标题">¶</a></h2>
|
||
<p>函数定义支持可变数量的参数。这里列出三种可以组合使用的形式。</p>
|
||
<section id="default-argument-values">
|
||
<span id="tut-defaultargs"></span><h3><span class="section-number">4.7.1. </span>默认值参数<a class="headerlink" href="#default-argument-values" title="永久链接至标题">¶</a></h3>
|
||
<p>为参数指定默认值是非常有用的方式。调用函数时,可以使用比定义时更少的参数,例如:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">ask_ok</span><span class="p">(</span><span class="n">prompt</span><span class="p">,</span> <span class="n">retries</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">reminder</span><span class="o">=</span><span class="s1">'Please try again!'</span><span class="p">):</span>
|
||
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
||
<span class="n">ok</span> <span class="o">=</span> <span class="nb">input</span><span class="p">(</span><span class="n">prompt</span><span class="p">)</span>
|
||
<span class="k">if</span> <span class="n">ok</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'y'</span><span class="p">,</span> <span class="s1">'ye'</span><span class="p">,</span> <span class="s1">'yes'</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
<span class="k">if</span> <span class="n">ok</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">'n'</span><span class="p">,</span> <span class="s1">'no'</span><span class="p">,</span> <span class="s1">'nop'</span><span class="p">,</span> <span class="s1">'nope'</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
<span class="n">retries</span> <span class="o">=</span> <span class="n">retries</span> <span class="o">-</span> <span class="mi">1</span>
|
||
<span class="k">if</span> <span class="n">retries</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
||
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'invalid user response'</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">reminder</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>该函数可以用以下方式调用:</p>
|
||
<ul class="simple">
|
||
<li><p>只给出必选实参:<code class="docutils literal notranslate"><span class="pre">ask_ok('Do</span> <span class="pre">you</span> <span class="pre">really</span> <span class="pre">want</span> <span class="pre">to</span> <span class="pre">quit?')</span></code></p></li>
|
||
<li><p>给出一个可选实参:<code class="docutils literal notranslate"><span class="pre">ask_ok('OK</span> <span class="pre">to</span> <span class="pre">overwrite</span> <span class="pre">the</span> <span class="pre">file?',</span> <span class="pre">2)</span></code></p></li>
|
||
<li><p>给出所有实参:<code class="docutils literal notranslate"><span class="pre">ask_ok('OK</span> <span class="pre">to</span> <span class="pre">overwrite</span> <span class="pre">the</span> <span class="pre">file?',</span> <span class="pre">2,</span> <span class="pre">'Come</span> <span class="pre">on,</span> <span class="pre">only</span> <span class="pre">yes</span> <span class="pre">or</span> <span class="pre">no!')</span></code></p></li>
|
||
</ul>
|
||
<p>本例还使用了关键字 <a class="reference internal" href="../reference/expressions.html#in"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">in</span></code></a> ,用于确认序列中是否包含某个值。</p>
|
||
<p>默认值在 <em>定义</em> 作用域里的函数定义中求值,所以:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">i</span> <span class="o">=</span> <span class="mi">5</span>
|
||
|
||
<span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">arg</span><span class="o">=</span><span class="n">i</span><span class="p">):</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
||
|
||
<span class="n">i</span> <span class="o">=</span> <span class="mi">6</span>
|
||
<span class="n">f</span><span class="p">()</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>上例输出的是 <code class="docutils literal notranslate"><span class="pre">5</span></code>。</p>
|
||
<p><strong>重要警告:</strong> 默认值只计算一次。默认值为列表、字典或类实例等可变对象时,会产生与该规则不同的结果。例如,下面的函数会累积后续调用时传递的参数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">L</span><span class="o">=</span><span class="p">[]):</span>
|
||
<span class="n">L</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">L</span>
|
||
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="mi">3</span><span class="p">))</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>输出结果如下:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
|
||
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]</span>
|
||
<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>不想在后续调用之间共享默认值时,应以如下方式编写函数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">L</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="n">L</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<span class="n">L</span> <span class="o">=</span> <span class="p">[]</span>
|
||
<span class="n">L</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
|
||
<span class="k">return</span> <span class="n">L</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="keyword-arguments">
|
||
<span id="tut-keywordargs"></span><h3><span class="section-number">4.7.2. </span>关键字参数<a class="headerlink" href="#keyword-arguments" title="永久链接至标题">¶</a></h3>
|
||
<p><code class="docutils literal notranslate"><span class="pre">kwarg=value</span></code> 形式的 <a class="reference internal" href="../glossary.html#term-keyword-argument"><span class="xref std std-term">关键字参数</span></a> 也可以用于调用函数。函数示例如下:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">parrot</span><span class="p">(</span><span class="n">voltage</span><span class="p">,</span> <span class="n">state</span><span class="o">=</span><span class="s1">'a stiff'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'voom'</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="s1">'Norwegian Blue'</span><span class="p">):</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"-- This parrot wouldn't"</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"if you put"</span><span class="p">,</span> <span class="n">voltage</span><span class="p">,</span> <span class="s2">"volts through it."</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"-- Lovely plumage, the"</span><span class="p">,</span> <span class="nb">type</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"-- It's"</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="s2">"!"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>该函数接受一个必选参数(<code class="docutils literal notranslate"><span class="pre">voltage</span></code>)和三个可选参数(<code class="docutils literal notranslate"><span class="pre">state</span></code>, <code class="docutils literal notranslate"><span class="pre">action</span></code> 和 <code class="docutils literal notranslate"><span class="pre">type</span></code>)。该函数可用下列方式调用:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">parrot</span><span class="p">(</span><span class="mi">1000</span><span class="p">)</span> <span class="c1"># 1 positional argument</span>
|
||
<span class="n">parrot</span><span class="p">(</span><span class="n">voltage</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span> <span class="c1"># 1 keyword argument</span>
|
||
<span class="n">parrot</span><span class="p">(</span><span class="n">voltage</span><span class="o">=</span><span class="mi">1000000</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'VOOOOOM'</span><span class="p">)</span> <span class="c1"># 2 keyword arguments</span>
|
||
<span class="n">parrot</span><span class="p">(</span><span class="n">action</span><span class="o">=</span><span class="s1">'VOOOOOM'</span><span class="p">,</span> <span class="n">voltage</span><span class="o">=</span><span class="mi">1000000</span><span class="p">)</span> <span class="c1"># 2 keyword arguments</span>
|
||
<span class="n">parrot</span><span class="p">(</span><span class="s1">'a million'</span><span class="p">,</span> <span class="s1">'bereft of life'</span><span class="p">,</span> <span class="s1">'jump'</span><span class="p">)</span> <span class="c1"># 3 positional arguments</span>
|
||
<span class="n">parrot</span><span class="p">(</span><span class="s1">'a thousand'</span><span class="p">,</span> <span class="n">state</span><span class="o">=</span><span class="s1">'pushing up the daisies'</span><span class="p">)</span> <span class="c1"># 1 positional, 1 keyword</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>以下调用函数的方式都无效:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">parrot</span><span class="p">()</span> <span class="c1"># required argument missing</span>
|
||
<span class="n">parrot</span><span class="p">(</span><span class="n">voltage</span><span class="o">=</span><span class="mf">5.0</span><span class="p">,</span> <span class="s1">'dead'</span><span class="p">)</span> <span class="c1"># non-keyword argument after a keyword argument</span>
|
||
<span class="n">parrot</span><span class="p">(</span><span class="mi">110</span><span class="p">,</span> <span class="n">voltage</span><span class="o">=</span><span class="mi">220</span><span class="p">)</span> <span class="c1"># duplicate value for the same argument</span>
|
||
<span class="n">parrot</span><span class="p">(</span><span class="n">actor</span><span class="o">=</span><span class="s1">'John Cleese'</span><span class="p">)</span> <span class="c1"># unknown keyword argument</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>函数调用时,关键字参数必须跟在位置参数后面。所有传递的关键字参数都必须匹配一个函数接受的参数(比如,<code class="docutils literal notranslate"><span class="pre">actor</span></code> 不是函数 <code class="docutils literal notranslate"><span class="pre">parrot</span></code> 的有效参数),关键字参数的顺序并不重要。这也包括必选参数,(比如,<code class="docutils literal notranslate"><span class="pre">parrot(voltage=1000)</span></code> 也有效)。不能对同一个参数多次赋值,下面就是一个因此限制而失败的例子:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">function</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">pass</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">function</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">a</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
||
<span class="gr">TypeError</span>: <span class="n">function() got multiple values for keyword argument 'a'</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>最后一个形参为 <code class="docutils literal notranslate"><span class="pre">**name</span></code> 形式时,接收一个字典(详见 <a class="reference internal" href="../library/stdtypes.html#typesmapping"><span class="std std-ref">映射类型 --- dict</span></a>),该字典包含与函数中已定义形参对应之外的所有关键字参数。<code class="docutils literal notranslate"><span class="pre">**name</span></code> 形参可以与 <code class="docutils literal notranslate"><span class="pre">*name</span></code> 形参(下一小节介绍)组合使用(<code class="docutils literal notranslate"><span class="pre">*name</span></code> 必须在 <code class="docutils literal notranslate"><span class="pre">**name</span></code> 前面), <code class="docutils literal notranslate"><span class="pre">*name</span></code> 形参接收一个 <a class="reference internal" href="datastructures.html#tut-tuples"><span class="std std-ref">元组</span></a>,该元组包含形参列表之外的位置参数。例如,可以定义下面这样的函数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">cheeseshop</span><span class="p">(</span><span class="n">kind</span><span class="p">,</span> <span class="o">*</span><span class="n">arguments</span><span class="p">,</span> <span class="o">**</span><span class="n">keywords</span><span class="p">):</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"-- Do you have any"</span><span class="p">,</span> <span class="n">kind</span><span class="p">,</span> <span class="s2">"?"</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"-- I'm sorry, we're all out of"</span><span class="p">,</span> <span class="n">kind</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">arguments</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="s2">"-"</span> <span class="o">*</span> <span class="mi">40</span><span class="p">)</span>
|
||
<span class="k">for</span> <span class="n">kw</span> <span class="ow">in</span> <span class="n">keywords</span><span class="p">:</span>
|
||
<span class="nb">print</span><span class="p">(</span><span class="n">kw</span><span class="p">,</span> <span class="s2">":"</span><span class="p">,</span> <span class="n">keywords</span><span class="p">[</span><span class="n">kw</span><span class="p">])</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>该函数可以用如下方式调用:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="n">cheeseshop</span><span class="p">(</span><span class="s2">"Limburger"</span><span class="p">,</span> <span class="s2">"It's very runny, sir."</span><span class="p">,</span>
|
||
<span class="s2">"It's really very, VERY runny, sir."</span><span class="p">,</span>
|
||
<span class="n">shopkeeper</span><span class="o">=</span><span class="s2">"Michael Palin"</span><span class="p">,</span>
|
||
<span class="n">client</span><span class="o">=</span><span class="s2">"John Cleese"</span><span class="p">,</span>
|
||
<span class="n">sketch</span><span class="o">=</span><span class="s2">"Cheese Shop Sketch"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>输出结果如下:</p>
|
||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>-- 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.
|
||
----------------------------------------
|
||
shopkeeper : Michael Palin
|
||
client : John Cleese
|
||
sketch : Cheese Shop Sketch
|
||
</pre></div>
|
||
</div>
|
||
<p>注意,关键字参数在输出结果中的顺序与调用函数时的顺序一致。</p>
|
||
</section>
|
||
<section id="special-parameters">
|
||
<h3><span class="section-number">4.7.3. </span>特殊参数<a class="headerlink" href="#special-parameters" title="永久链接至标题">¶</a></h3>
|
||
<p>默认情况下,参数可以按位置或显式关键字传递给 Python 函数。为了让代码易读、高效,最好限制参数的传递方式,这样,开发者只需查看函数定义,即可确定参数项是仅按位置、按位置或关键字,还是仅按关键字传递。</p>
|
||
<p>函数定义如下:</p>
|
||
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
|
||
----------- ---------- ----------
|
||
| | |
|
||
| Positional or keyword |
|
||
| - Keyword only
|
||
-- Positional only
|
||
</pre></div>
|
||
</div>
|
||
<p><code class="docutils literal notranslate"><span class="pre">/</span></code> 和 <code class="docutils literal notranslate"><span class="pre">*</span></code> 是可选的。这些符号表明形参如何把参数值传递给函数:位置、位置或关键字、关键字。关键字形参也叫作命名形参。</p>
|
||
<section id="positional-or-keyword-arguments">
|
||
<h4><span class="section-number">4.7.3.1. </span>位置或关键字参数<a class="headerlink" href="#positional-or-keyword-arguments" title="永久链接至标题">¶</a></h4>
|
||
<p>函数定义中未使用 <code class="docutils literal notranslate"><span class="pre">/</span></code> 和 <code class="docutils literal notranslate"><span class="pre">*</span></code> 时,参数可以按位置或关键字传递给函数。</p>
|
||
</section>
|
||
<section id="positional-only-parameters">
|
||
<h4><span class="section-number">4.7.3.2. </span>仅位置参数<a class="headerlink" href="#positional-only-parameters" title="永久链接至标题">¶</a></h4>
|
||
<p>此处再介绍一些细节,特定形参可以标记为 <em>仅限位置</em>。<em>仅限位置</em> 时,形参的顺序很重要,且这些形参不能用关键字传递。仅限位置形参应放在 <code class="docutils literal notranslate"><span class="pre">/</span></code> (正斜杠)前。<code class="docutils literal notranslate"><span class="pre">/</span></code> 用于在逻辑上分割仅限位置形参与其它形参。如果函数定义中没有 <code class="docutils literal notranslate"><span class="pre">/</span></code>,则表示没有仅限位置形参。</p>
|
||
<p><code class="docutils literal notranslate"><span class="pre">/</span></code> 后可以是 <em>位置或关键字</em> 或 <em>仅限关键字</em> 形参。</p>
|
||
</section>
|
||
<section id="keyword-only-arguments">
|
||
<h4><span class="section-number">4.7.3.3. </span>仅限关键字参数<a class="headerlink" href="#keyword-only-arguments" title="永久链接至标题">¶</a></h4>
|
||
<p>把形参标记为 <em>仅限关键字</em>,表明必须以关键字参数形式传递该形参,应在参数列表中第一个 <em>仅限关键字</em> 形参前添加 <code class="docutils literal notranslate"><span class="pre">*</span></code>。</p>
|
||
</section>
|
||
<section id="function-examples">
|
||
<h4><span class="section-number">4.7.3.4. </span>函数示例<a class="headerlink" href="#function-examples" title="永久链接至标题">¶</a></h4>
|
||
<p>请看下面的函数定义示例,注意 <code class="docutils literal notranslate"><span class="pre">/</span></code> 和 <code class="docutils literal notranslate"><span class="pre">*</span></code> 标记:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">standard_arg</span><span class="p">(</span><span class="n">arg</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">def</span> <span class="nf">pos_only_arg</span><span class="p">(</span><span class="n">arg</span><span class="p">,</span> <span class="o">/</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">def</span> <span class="nf">kwd_only_arg</span><span class="p">(</span><span class="o">*</span><span class="p">,</span> <span class="n">arg</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="k">def</span> <span class="nf">combined_example</span><span class="p">(</span><span class="n">pos_only</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="n">standard</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">kwd_only</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="n">pos_only</span><span class="p">,</span> <span class="n">standard</span><span class="p">,</span> <span class="n">kwd_only</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>第一个函数定义 <code class="docutils literal notranslate"><span class="pre">standard_arg</span></code> 是最常见的形式,对调用方式没有任何限制,可以按位置也可以按关键字传递参数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">standard_arg</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="go">2</span>
|
||
|
||
<span class="gp">>>> </span><span class="n">standard_arg</span><span class="p">(</span><span class="n">arg</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||
<span class="go">2</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>第二个函数 <code class="docutils literal notranslate"><span class="pre">pos_only_arg</span></code> 的函数定义中有 <code class="docutils literal notranslate"><span class="pre">/</span></code>,仅限使用位置形参:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">pos_only_arg</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="go">1</span>
|
||
|
||
<span class="gp">>>> </span><span class="n">pos_only_arg</span><span class="p">(</span><span class="n">arg</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
||
<span class="gr">TypeError</span>: <span class="n">pos_only_arg() got an unexpected keyword argument 'arg'</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>第三个函数 <code class="docutils literal notranslate"><span class="pre">kwd_only_args</span></code> 的函数定义通过 <code class="docutils literal notranslate"><span class="pre">*</span></code> 表明仅限关键字参数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">kwd_only_arg</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
||
<span class="gr">TypeError</span>: <span class="n">kwd_only_arg() takes 0 positional arguments but 1 was given</span>
|
||
|
||
<span class="gp">>>> </span><span class="n">kwd_only_arg</span><span class="p">(</span><span class="n">arg</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
||
<span class="go">3</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>最后一个函数在同一个函数定义中,使用了全部三种调用惯例:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">combined_example</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
||
<span class="gr">TypeError</span>: <span class="n">combined_example() takes 2 positional arguments but 3 were given</span>
|
||
|
||
<span class="gp">>>> </span><span class="n">combined_example</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">kwd_only</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
||
<span class="go">1 2 3</span>
|
||
|
||
<span class="gp">>>> </span><span class="n">combined_example</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">standard</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">kwd_only</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
||
<span class="go">1 2 3</span>
|
||
|
||
<span class="gp">>>> </span><span class="n">combined_example</span><span class="p">(</span><span class="n">pos_only</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">standard</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">kwd_only</span><span class="o">=</span><span class="mi">3</span><span class="p">)</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
||
<span class="gr">TypeError</span>: <span class="n">combined_example() got an unexpected keyword argument 'pos_only'</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>下面的函数定义中,<code class="docutils literal notranslate"><span class="pre">kwds</span></code> 把 <code class="docutils literal notranslate"><span class="pre">name</span></code> 当作键,因此,可能与位置参数 <code class="docutils literal notranslate"><span class="pre">name</span></code> 产生潜在冲突:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s1">'name'</span> <span class="ow">in</span> <span class="n">kwds</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>调用该函数不可能返回 <code class="docutils literal notranslate"><span class="pre">True</span></code>,因为关键字 <code class="docutils literal notranslate"><span class="pre">'name'</span></code> 总与第一个形参绑定。例如:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="mi">2</span><span class="p">})</span>
|
||
<span class="gt">Traceback (most recent call last):</span>
|
||
File <span class="nb">"<stdin>"</span>, line <span class="m">1</span>, in <span class="n"><module></span>
|
||
<span class="gr">TypeError</span>: <span class="n">foo() got multiple values for argument 'name'</span>
|
||
<span class="gp">>>></span>
|
||
</pre></div>
|
||
</div>
|
||
<p>加上 <code class="docutils literal notranslate"><span class="pre">/</span></code> (仅限位置参数)后,就可以了。此时,函数定义把 <code class="docutils literal notranslate"><span class="pre">name</span></code> 当作位置参数,<code class="docutils literal notranslate"><span class="pre">'name'</span></code> 也可以作为关键字参数的键:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="o">**</span><span class="n">kwds</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="s1">'name'</span> <span class="ow">in</span> <span class="n">kwds</span>
|
||
<span class="o">>>></span> <span class="n">foo</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="o">**</span><span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="mi">2</span><span class="p">})</span>
|
||
<span class="kc">True</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>换句话说,仅限位置形参的名称可以在 <code class="docutils literal notranslate"><span class="pre">**kwds</span></code> 中使用,而不产生歧义。</p>
|
||
</section>
|
||
<section id="recap">
|
||
<h4><span class="section-number">4.7.3.5. </span>小结<a class="headerlink" href="#recap" title="永久链接至标题">¶</a></h4>
|
||
<p>以下用例决定哪些形参可以用于函数定义:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">pos1</span><span class="p">,</span> <span class="n">pos2</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="n">pos_or_kwd</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">kwd1</span><span class="p">,</span> <span class="n">kwd2</span><span class="p">):</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>说明:</p>
|
||
<ul class="simple">
|
||
<li><p>使用仅限位置形参,可以让用户无法使用形参名。形参名没有实际意义时,强制调用函数的实参顺序时,或同时接收位置形参和关键字时,这种方式很有用。</p></li>
|
||
<li><p>当形参名有实际意义,且显式名称可以让函数定义更易理解时,阻止用户依赖传递实参的位置时,才使用关键字。</p></li>
|
||
<li><p>对于 API,使用仅限位置形参,可以防止未来修改形参名时造成破坏性的 API 变动。</p></li>
|
||
</ul>
|
||
</section>
|
||
</section>
|
||
<section id="arbitrary-argument-lists">
|
||
<span id="tut-arbitraryargs"></span><h3><span class="section-number">4.7.4. </span>任意实参列表<a class="headerlink" href="#arbitrary-argument-lists" title="永久链接至标题">¶</a></h3>
|
||
<p id="index-2">调用函数时,使用任意数量的实参是最少见的选项。这些实参包含在元组中(详见 <a class="reference internal" href="datastructures.html#tut-tuples"><span class="std std-ref">元组和序列</span></a> )。在可变数量的实参之前,可能有若干个普通参数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">write_multiple_items</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">separator</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">):</span>
|
||
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">separator</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="p">))</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>一般来说,这些 <code class="docutils literal notranslate"><span class="pre">可变参数</span></code> 将在形式参数列表的末尾,因为它们收集传递给函数的所有剩余输入参数。出现在 <code class="docutils literal notranslate"><span class="pre">*args</span></code> 参数之后的任何形式参数都是 ‘仅限关键字参数’,也就是说它们只能作为关键字参数而不能是位置参数。:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">concat</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">"/"</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="n">sep</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">concat</span><span class="p">(</span><span class="s2">"earth"</span><span class="p">,</span> <span class="s2">"mars"</span><span class="p">,</span> <span class="s2">"venus"</span><span class="p">)</span>
|
||
<span class="go">'earth/mars/venus'</span>
|
||
<span class="gp">>>> </span><span class="n">concat</span><span class="p">(</span><span class="s2">"earth"</span><span class="p">,</span> <span class="s2">"mars"</span><span class="p">,</span> <span class="s2">"venus"</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s2">"."</span><span class="p">)</span>
|
||
<span class="go">'earth.mars.venus'</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="unpacking-argument-lists">
|
||
<span id="tut-unpacking-arguments"></span><h3><span class="section-number">4.7.5. </span>解包实参列表<a class="headerlink" href="#unpacking-argument-lists" title="永久链接至标题">¶</a></h3>
|
||
<p>函数调用要求独立的位置参数,但实参在列表或元组里时,要执行相反的操作。例如,内置的 <a class="reference internal" href="../library/stdtypes.html#range" title="range"><code class="xref py py-func docutils literal notranslate"><span class="pre">range()</span></code></a> 函数要求独立的 <em>start</em> 和 <em>stop</em> 实参。如果这些参数不是独立的,则要在调用函数时,用 <code class="docutils literal notranslate"><span class="pre">*</span></code> 操作符把实参从列表或元组解包出来:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">6</span><span class="p">))</span> <span class="c1"># normal call with separate arguments</span>
|
||
<span class="go">[3, 4, 5]</span>
|
||
<span class="gp">>>> </span><span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span>
|
||
<span class="gp">>>> </span><span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">))</span> <span class="c1"># call with arguments unpacked from a list</span>
|
||
<span class="go">[3, 4, 5]</span>
|
||
</pre></div>
|
||
</div>
|
||
<p id="index-3">同样,字典可以用 <code class="docutils literal notranslate"><span class="pre">**</span></code> 操作符传递关键字参数:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">parrot</span><span class="p">(</span><span class="n">voltage</span><span class="p">,</span> <span class="n">state</span><span class="o">=</span><span class="s1">'a stiff'</span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s1">'voom'</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"-- This parrot wouldn't"</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"if you put"</span><span class="p">,</span> <span class="n">voltage</span><span class="p">,</span> <span class="s2">"volts through it."</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s1">' '</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"E's"</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="s2">"!"</span><span class="p">)</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">d</span> <span class="o">=</span> <span class="p">{</span><span class="s2">"voltage"</span><span class="p">:</span> <span class="s2">"four million"</span><span class="p">,</span> <span class="s2">"state"</span><span class="p">:</span> <span class="s2">"bleedin' demised"</span><span class="p">,</span> <span class="s2">"action"</span><span class="p">:</span> <span class="s2">"VOOM"</span><span class="p">}</span>
|
||
<span class="gp">>>> </span><span class="n">parrot</span><span class="p">(</span><span class="o">**</span><span class="n">d</span><span class="p">)</span>
|
||
<span class="go">-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="lambda-expressions">
|
||
<span id="tut-lambda"></span><h3><span class="section-number">4.7.6. </span>Lambda 表达式<a class="headerlink" href="#lambda-expressions" title="永久链接至标题">¶</a></h3>
|
||
<p><a class="reference internal" href="../reference/expressions.html#lambda"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">lambda</span></code></a> 关键字用于创建小巧的匿名函数。<code class="docutils literal notranslate"><span class="pre">lambda</span> <span class="pre">a,</span> <span class="pre">b:</span> <span class="pre">a+b</span></code> 函数返回两个参数的和。Lambda 函数可用于任何需要函数对象的地方。在语法上,匿名函数只能是单个表达式。在语义上,它只是常规函数定义的语法糖。与嵌套函数定义一样,lambda 函数可以引用包含作用域中的变量:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">make_incrementor</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">+</span> <span class="n">n</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">f</span> <span class="o">=</span> <span class="n">make_incrementor</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
|
||
<span class="gp">>>> </span><span class="n">f</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
|
||
<span class="go">42</span>
|
||
<span class="gp">>>> </span><span class="n">f</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
|
||
<span class="go">43</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>上例用 lambda 表达式返回函数。还可以把匿名函数用作传递的实参:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="n">pairs</span> <span class="o">=</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span> <span class="s1">'one'</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="s1">'two'</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="s1">'three'</span><span class="p">),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="s1">'four'</span><span class="p">)]</span>
|
||
<span class="gp">>>> </span><span class="n">pairs</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">pair</span><span class="p">:</span> <span class="n">pair</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
|
||
<span class="gp">>>> </span><span class="n">pairs</span>
|
||
<span class="go">[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="documentation-strings">
|
||
<span id="tut-docstrings"></span><h3><span class="section-number">4.7.7. </span>文档字符串<a class="headerlink" href="#documentation-strings" title="永久链接至标题">¶</a></h3>
|
||
<p id="index-4">以下是文档字符串内容和格式的约定。</p>
|
||
<p>第一行应为对象用途的简短摘要。为保持简洁,不要在这里显式说明对象名或类型,因为可通过其他方式获取这些信息(除非该名称碰巧是描述函数操作的动词)。这一行应以大写字母开头,以句点结尾。</p>
|
||
<p>文档字符串为多行时,第二行应为空白行,在视觉上将摘要与其余描述分开。后面的行可包含若干段落,描述对象的调用约定、副作用等。</p>
|
||
<p>Python 解析器不会删除 Python 中多行字符串字面值的缩进,因此,文档处理工具应在必要时删除缩进。这项操作遵循以下约定:文档字符串第一行 <em>之后</em> 的第一个非空行决定了整个文档字符串的缩进量(第一行通常与字符串开头的引号相邻,其缩进在字符串中并不明显,因此,不能用第一行的缩进),然后,删除字符串中所有行开头处与此缩进“等价”的空白符。不能有比此缩进更少的行,但如果出现了缩进更少的行,应删除这些行的所有前导空白符。转化制表符后(通常为 8 个空格),应测试空白符的等效性。</p>
|
||
<p>下面是多行文档字符串的一个例子:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">my_function</span><span class="p">():</span>
|
||
<span class="gp">... </span><span class="w"> </span><span class="sd">"""Do nothing, but document it.</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">... </span><span class="sd"> No, really, it doesn't do anything.</span>
|
||
<span class="gp">... </span><span class="sd"> """</span>
|
||
<span class="gp">... </span> <span class="k">pass</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="nb">print</span><span class="p">(</span><span class="n">my_function</span><span class="o">.</span><span class="vm">__doc__</span><span class="p">)</span>
|
||
<span class="go">Do nothing, but document it.</span>
|
||
|
||
<span class="go"> No, really, it doesn't do anything.</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
<section id="function-annotations">
|
||
<span id="tut-annotations"></span><h3><span class="section-number">4.7.8. </span>函数注解<a class="headerlink" href="#function-annotations" title="永久链接至标题">¶</a></h3>
|
||
<p id="index-5"><a class="reference internal" href="../reference/compound_stmts.html#function"><span class="std std-ref">函数注解</span></a> 是可选的用户自定义函数类型的元数据完整信息(详见 <span class="target" id="index-13"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-3107"><strong>PEP 3107</strong></a> 和 <span class="target" id="index-14"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0484"><strong>PEP 484</strong></a> )。</p>
|
||
<p><a class="reference internal" href="../glossary.html#term-function-annotation"><span class="xref std std-term">标注</span></a> 以字典的形式存放在函数的 <code class="xref py py-attr docutils literal notranslate"><span class="pre">__annotations__</span></code> 属性中,并且不会影响函数的任何其他部分。 形参标注的定义方式是在形参名后加冒号,后面跟一个表达式,该表达式会被求值为标注的值。 返回值标注的定义方式是加组合符号 <code class="docutils literal notranslate"><span class="pre">-></span></code>,后面跟一个表达式,该标注位于形参列表和表示 <a class="reference internal" href="../reference/compound_stmts.html#def"><code class="xref std std-keyword docutils literal notranslate"><span class="pre">def</span></code></a> 语句结束的冒号之间。 下面的示例有一个必须的参数,一个可选的关键字参数以及返回值都带有相应的标注:</p>
|
||
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">>>> </span><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">ham</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">eggs</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">'eggs'</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Annotations:"</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="vm">__annotations__</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="nb">print</span><span class="p">(</span><span class="s2">"Arguments:"</span><span class="p">,</span> <span class="n">ham</span><span class="p">,</span> <span class="n">eggs</span><span class="p">)</span>
|
||
<span class="gp">... </span> <span class="k">return</span> <span class="n">ham</span> <span class="o">+</span> <span class="s1">' and '</span> <span class="o">+</span> <span class="n">eggs</span>
|
||
<span class="gp">...</span>
|
||
<span class="gp">>>> </span><span class="n">f</span><span class="p">(</span><span class="s1">'spam'</span><span class="p">)</span>
|
||
<span class="go">Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}</span>
|
||
<span class="go">Arguments: spam eggs</span>
|
||
<span class="go">'spam and eggs'</span>
|
||
</pre></div>
|
||
</div>
|
||
</section>
|
||
</section>
|
||
<section id="intermezzo-coding-style">
|
||
<span id="tut-codingstyle"></span><h2><span class="section-number">4.8. </span>小插曲:编码风格<a class="headerlink" href="#intermezzo-coding-style" title="永久链接至标题">¶</a></h2>
|
||
<p id="index-8">现在你将要写更长,更复杂的 Python 代码,是时候讨论一下 <em>代码风格</em> 了。 大多数语言都能以不同的风格被编写(或更准确地说,被格式化);有些比其他的更具有可读性。 能让其他人轻松阅读你的代码总是一个好主意,采用一种好的编码风格对此有很大帮助。</p>
|
||
<p>Python 项目大多都遵循 <span class="target" id="index-15"></span><a class="pep reference external" href="https://www.python.org/dev/peps/pep-0008"><strong>PEP 8</strong></a> 的风格指南;它推行的编码风格易于阅读、赏心悦目。Python 开发者均应抽时间悉心研读;以下是该提案中的核心要点:</p>
|
||
<ul>
|
||
<li><p>缩进,用 4 个空格,不要用制表符。</p>
|
||
<p>4 个空格是小缩进(更深嵌套)和大缩进(更易阅读)之间的折中方案。制表符会引起混乱,最好别用。</p>
|
||
</li>
|
||
<li><p>换行,一行不超过 79 个字符。</p>
|
||
<p>这样换行的小屏阅读体验更好,还便于在大屏显示器上并排阅读多个代码文件。</p>
|
||
</li>
|
||
<li><p>用空行分隔函数和类,及函数内较大的代码块。</p></li>
|
||
<li><p>最好把注释放到单独一行。</p></li>
|
||
<li><p>使用文档字符串。</p></li>
|
||
<li><p>运算符前后、逗号后要用空格,但不要直接在括号内使用: <code class="docutils literal notranslate"><span class="pre">a</span> <span class="pre">=</span> <span class="pre">f(1,</span> <span class="pre">2)</span> <span class="pre">+</span> <span class="pre">g(3,</span> <span class="pre">4)</span></code>。</p></li>
|
||
<li><p>类和函数的命名要一致;按惯例,命名类用 <code class="docutils literal notranslate"><span class="pre">UpperCamelCase</span></code>,命名函数与方法用 <code class="docutils literal notranslate"><span class="pre">lowercase_with_underscores</span></code>。命名方法中第一个参数总是用 <code class="docutils literal notranslate"><span class="pre">self</span></code> (类和方法详见 <a class="reference internal" href="classes.html#tut-firstclasses"><span class="std std-ref">初探类</span></a>)。</p></li>
|
||
<li><p>编写用于国际多语环境的代码时,不要用生僻的编码。Python 默认的 UTF-8 或纯 ASCII 可以胜任各种情况。</p></li>
|
||
<li><p>同理,就算多语阅读、维护代码的可能再小,也不要在标识符中使用非 ASCII 字符。</p></li>
|
||
</ul>
|
||
<p class="rubric">备注</p>
|
||
<dl class="footnote brackets">
|
||
<dt class="label" id="id2"><span class="brackets"><a class="fn-backref" href="#id1">1</a></span></dt>
|
||
<dd><p>实际上,<em>对象引用调用</em> 这种说法更好,因为,传递的是可变对象时,调用者能发现被调者做出的任何更改(插入列表的元素)。</p>
|
||
</dd>
|
||
</dl>
|
||
</section>
|
||
</section>
|
||
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
|
||
<div class="sphinxsidebarwrapper">
|
||
<h3><a href="../contents.html">目录</a></h3>
|
||
<ul>
|
||
<li><a class="reference internal" href="#">4. 更多控制流工具</a><ul>
|
||
<li><a class="reference internal" href="#if-statements">4.1. <code class="xref std std-keyword docutils literal notranslate"><span class="pre">if</span></code> 语句</a></li>
|
||
<li><a class="reference internal" href="#for-statements">4.2. <code class="xref std std-keyword docutils literal notranslate"><span class="pre">for</span></code> 语句</a></li>
|
||
<li><a class="reference internal" href="#the-range-function">4.3. <code class="xref py py-func docutils literal notranslate"><span class="pre">range()</span></code> 函数</a></li>
|
||
<li><a class="reference internal" href="#break-and-continue-statements-and-else-clauses-on-loops">4.4. 循环中的 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">break</span></code>、<code class="xref std std-keyword docutils literal notranslate"><span class="pre">continue</span></code> 语句及 <code class="xref std std-keyword docutils literal notranslate"><span class="pre">else</span></code> 子句</a></li>
|
||
<li><a class="reference internal" href="#pass-statements">4.5. <code class="xref std std-keyword docutils literal notranslate"><span class="pre">pass</span></code> 语句</a></li>
|
||
<li><a class="reference internal" href="#defining-functions">4.6. 定义函数</a></li>
|
||
<li><a class="reference internal" href="#more-on-defining-functions">4.7. 函数定义详解</a><ul>
|
||
<li><a class="reference internal" href="#default-argument-values">4.7.1. 默认值参数</a></li>
|
||
<li><a class="reference internal" href="#keyword-arguments">4.7.2. 关键字参数</a></li>
|
||
<li><a class="reference internal" href="#special-parameters">4.7.3. 特殊参数</a><ul>
|
||
<li><a class="reference internal" href="#positional-or-keyword-arguments">4.7.3.1. 位置或关键字参数</a></li>
|
||
<li><a class="reference internal" href="#positional-only-parameters">4.7.3.2. 仅位置参数</a></li>
|
||
<li><a class="reference internal" href="#keyword-only-arguments">4.7.3.3. 仅限关键字参数</a></li>
|
||
<li><a class="reference internal" href="#function-examples">4.7.3.4. 函数示例</a></li>
|
||
<li><a class="reference internal" href="#recap">4.7.3.5. 小结</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#arbitrary-argument-lists">4.7.4. 任意实参列表</a></li>
|
||
<li><a class="reference internal" href="#unpacking-argument-lists">4.7.5. 解包实参列表</a></li>
|
||
<li><a class="reference internal" href="#lambda-expressions">4.7.6. Lambda 表达式</a></li>
|
||
<li><a class="reference internal" href="#documentation-strings">4.7.7. 文档字符串</a></li>
|
||
<li><a class="reference internal" href="#function-annotations">4.7.8. 函数注解</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#intermezzo-coding-style">4.8. 小插曲:编码风格</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
<h4>上一个主题</h4>
|
||
<p class="topless"><a href="introduction.html"
|
||
title="上一章"><span class="section-number">3. </span>Python 速览</a></p>
|
||
<h4>下一个主题</h4>
|
||
<p class="topless"><a href="datastructures.html"
|
||
title="下一章"><span class="section-number">5. </span>数据结构</a></p>
|
||
<div role="note" aria-label="source link">
|
||
<h3>本页</h3>
|
||
<ul class="this-page-menu">
|
||
<li><a href="../bugs.html">报告 Bug</a></li>
|
||
<li>
|
||
<a href="https://github.com/python/cpython/blob/3.8/Doc/tutorial/controlflow.rst"
|
||
rel="nofollow">显示源代码
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="clearer"></div>
|
||
</div>
|
||
<div class="related" role="navigation" aria-label="related navigation">
|
||
<h3>导航</h3>
|
||
<ul>
|
||
<li class="right" style="margin-right: 10px">
|
||
<a href="../genindex.html" title="总目录"
|
||
>索引</a></li>
|
||
<li class="right" >
|
||
<a href="../py-modindex.html" title="Python 模块索引"
|
||
>模块</a> |</li>
|
||
<li class="right" >
|
||
<a href="datastructures.html" title="5. 数据结构"
|
||
>下一页</a> |</li>
|
||
<li class="right" >
|
||
<a href="introduction.html" title="3. Python 速览"
|
||
>上一页</a> |</li>
|
||
|
||
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
|
||
<li><a href="https://www.python.org/">Python</a> »</li>
|
||
<li class="switchers">
|
||
<div class="language_switcher_placeholder"></div>
|
||
<div class="version_switcher_placeholder"></div>
|
||
</li>
|
||
<li>
|
||
|
||
</li>
|
||
<li id="cpython-language-and-version">
|
||
<a href="../index.html">3.8.20 Documentation</a> »
|
||
</li>
|
||
|
||
<li class="nav-item nav-item-1"><a href="index.html" >Python 教程</a> »</li>
|
||
<li class="right">
|
||
|
||
|
||
<div class="inline-search" role="search">
|
||
<form class="inline-search" action="../search.html" method="get">
|
||
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
|
||
<input type="submit" value="转向" />
|
||
<input type="hidden" name="check_keywords" value="yes" />
|
||
<input type="hidden" name="area" value="default" />
|
||
</form>
|
||
</div>
|
||
|
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
<div class="footer">
|
||
© <a href="../copyright.html">版权所有</a> 2001-2024, Python Software Foundation.
|
||
<br />
|
||
This page is licensed under the Python Software Foundation License Version 2.
|
||
<br />
|
||
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
|
||
<br />
|
||
|
||
<br />
|
||
|
||
The Python Software Foundation is a non-profit corporation.
|
||
<a href="https://www.python.org/psf/donations/">Please donate.</a>
|
||
<br />
|
||
<br />
|
||
|
||
最后更新于 12月 09, 2024.
|
||
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
|
||
<br />
|
||
|
||
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
|
||
</div>
|
||
|
||
</body>
|
||
</html> |