この記事は簡潔に説明されており、理解を深めるためにコードで補足されています。
関数がそれ自体を呼び出して最終結果を生成する場合、そのような関数は再帰的と呼ばれます。再帰関数は、コードの記述が容易になるため、場合によっては便利です。アルゴリズムによっては、再帰パラダイムを使用して非常に簡単に記述できるものもあれば、そうでないものもあります。反復的に書き換えることができない再帰関数はありません。言い換えれば、すべての再帰関数はループを通じて反復的に実装できるため、通常、目前の状況に基づいて最適なアプローチを選択するのはプログラマの責任です。
再帰関数の本体は通常 2 つの部分で構成されます。1 つの部分の戻り値はそれ自体への後続の呼び出しに依存し、もう 1 つの部分の戻り値はそれ以降のそれ自体への呼び出しには依存しません (基本ケースまたは再帰と呼ばれます)。境界)。
理解のための参考例として、階乗関数 N を見てみましょう! 再帰の 2 つの部分は次のとおりです: 基本的なケース (境界、再帰を終了するために使用されます) は、N が 0 または 1 の場合です。の場合、関数は 1 を返します。これ以上の計算は必要ありません。一方、一般的な自己呼び出しの場合、N! によって返される生成結果は次のとおりです:
1 * 2 * ... * (N-1) * N
よく考えると、N! は次のように書くことができます: N!= (N - 1) !*N 。実際の例として、次の階乗表現を見てください:
5! = 1 * 2 * 3 * 4 * 5 = (1 * 2 * 3 * 4) * 5 = 4! * 5
これを関数実装に変換してみましょう:
# 阶乘递归函数实现 def factorial(n): if n in (0, 1): # 递归边界 return 1 return factorial(n - 1) * n # 递归调用
マスターやヒーローは、アルゴリズムを作成するときによくこれを使用します。再帰関数、再帰関数を書くのはとても楽しいです。演習として、再帰的および反復的手法を使用していくつかの簡単な問題を解決してみてください。フィボナッチ数などを計算することをお勧めします。あなたも試してみてください。
# ヒント: 再帰関数を作成するときは、ネストの数を常に考慮してください。限界があるからです。詳細については、sys.getrecursionlimit() および sys.setrecursionlimit() を確認してください。 |
__doc__ -> 返回a乘以b的结果. __name__ -> multiplication __qualname__ -> multiplication __module__ -> __main__ __defaults__ -> (1,) __code__ -> <……> __globals__ -> {…略…} __dict__ -> {} __closure__ -> None __annotations__ -> {} __kwdefaults__ -> None |
这里省略了__globals__属性的值,内容太多。这个属性的含义可以在Python数据模型文档页面(或自带帮助文档中)的可调用类型部分找到:
//m.sbmmt.com/link/032abcd424b4312e7087f434ef1c0094
再次提醒:如果你想查看对象的所有属性,只需调用dir(object_name),将得到其所有属性的列表。
Python自带很多内置函数。它们可以在任何地方使用,你可以通过dir(__builtins__)来查看builtins模块,或通过访问官方Python文档来获得它们的列表。这里就不一一介绍了。在前面的学习过程中,我们已经见过其中的一些,如any、bin、bool、divmod、filter、float、getattr、id、int、len、list、min、print、set、tuple、type和zip等,但还有更多,建议你至少应该阅读一次。熟悉它们,尝试它们,为它们每个编写一小段代码,并确保您随时可以使用它们,以便在需要时使用它们。
可在官方文档中找到这个内置函数列表:https://docs.python.org/3/library/functions.html 。
我们非常喜欢不需要文档的代码。当我们正确地编程、选择正确的名称、并注意细节时,代码应该是不言自明的,几乎不需要文档。不过,有时注释非常有用,添加一些文档化描述也是如此。你可以在Python的PEP 257规范——文档字符串约定中找到Python的文档指南:
//m.sbmmt.com/link/da40657c9fece7e48d30af42d31d4350
但在这里还是会向你展示基本原理。Python的文档中包含字符串,这些字符串被恰当地称为文档字符串(docstrings)。任何对象都可以被文档化来加以描述记录,可以使用单行或多行文档字符串。单行程序非常简单。不是为函数提供另外的签名,而应该声明或描述函数的目的。请看下面的示例:
# 简单的文档化代码 def square(n): """功能:返回数字n的平方。 """ return n ** 2 def get_username(userid): """功能:返回给定id的用户名称。 """ return db.get(user_id=userid).username
使用三重双引号字符串可以在以后轻松展开或扩展文档内容。
使用以句号结尾的句子,不要在前后留下空行。
多行注释的结构与此类似。应该用一行代码简单地说明对象的主旨,然后是更详细的描述。
作为多行文档化的一个例子,我们在下面的例子中使用Sphinx表示法记录了一个虚构的connect()函数及文档化描述:
# 多行文档化代码 def connect(host, port, user, password): """功能:连接数据库并返回连接对象. 使用如下参数直接连接 PostgreSQL数据库. :param host: 主机 IP. :param port: 端口. :param user: 连接用户名. :param password: 连接密码. :return: 连接对象. """ # 函数主体... return connection
提示:
Sphinx是用于创建Python文档的最广泛使用的工具之一——事实上,官方Python文档就是用它编写的。绝对值得花点时间去看看。
内置函数help()用于即时交互使用的,它就使用对象的文档字符串为对象创建文档页面来展示对象的用法。基本用法如下:
def square(n): """功能:返回数字n的平方。 """ return n ** 2 help(square) Help on function square in module __main__: square(n) 功能:返回数字n的平方。
首先明确或定义一个对象或函数(包括已有的对象或函数),然后使用内置help函数,并把对象或函数做help的参数,该函数就会返回相应对象的说明文档了。就这么简单。
本文主要基于Python语言的一大特色——函数来拓展的一些相关编程知识,包括递归函数(重点是有限性和边界性)、lambda函数(简洁性和临时性)以及函数的属性以及如何实现函数的文档化描述等。
以上がPython プログラミング: 再帰的および匿名関数、関数属性、およびドキュメント文字列 (関数補足)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。