Python 프로그래밍: 재귀 및 익명 함수, 함수 속성 및 문서 문자열(함수 보충)
이 글에서는 간단하고 간결하게 설명하고, 이해를 돕기 위해 코드를 보충했습니다.
재귀 함수
함수가 자신을 호출하여 최종 결과를 생성하는 경우 이러한 함수를 재귀라고 합니다. 때때로 재귀 함수는 코드 작성을 더 쉽게 만들어주기 때문에 유용합니다. 일부 알고리즘은 재귀 패러다임을 사용하여 작성하기가 매우 쉬운 반면 다른 알고리즘은 그렇지 않습니다. 반복적인 방식으로 다시 작성할 수 없는 재귀 함수는 없습니다. 즉, 모든 재귀 함수는 루프를 통해 반복적으로 구현될 수 있으므로 일반적으로 현재 상황에 따라 최상의 접근 방식을 선택하는 것은 프로그래머의 몫입니다.
재귀 함수의 본문은 일반적으로 두 부분으로 구성됩니다. 한 부분의 반환 값은 자신에 대한 후속 호출에 따라 달라지고, 다른 부분의 반환 값은 자신에 대한 후속 호출에 의존하지 않습니다(기본 사례 또는 재귀 경계라고 함).
이해를 위한 참고 예로 계승 함수 N을 살펴보겠습니다. 재귀의 두 부분은 다음과 같습니다. 기본 사례(경계, 재귀를 종료하는 데 사용됨)는 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()를 확인하세요. |
匿名函数
还有一种函数是匿名函数(Anonymous functions)。这些函数在Python中称为lambda(兰姆达),其通常在使用具有自己完整定义名称的函数有些多余时而使用,此时所需要的只是一个快速、简单的一行程序来完成这项工作。
假设我们想要一个列表,所有N的某个值,是5的倍数的数字。为此,我们可以使用filter()函数,它需要一个函数和一个可迭代对象作为输入。返回值是一个过滤器对象,当你遍历它时,会从输入可迭代对象中生成元素,所需的参数函数会为其返回True。如果不使用匿名函数,我们可能会这样做:
def isMultipleOfFive(n): return not n % 5 def getMultiplesOfFive(n): return list(filter(isMultipleOfFive, range(n)))
注意我们如何使用isMultipleOfFive()来过滤前n个自然数。这似乎有点过分——任务及其很简单,我们不需要为其他任何事情保留isMultipleOfFive()函数。此时,我们就可用lambda函数来重写它:
# lambda过滤 def getMultiplesOfFive(n): return list(filter(lambda k: not k % 5, range(n)))
逻辑是完全相同的,但是过滤函数现在是个lambda函数,显然,Lambda更简单。
定义Lambda函数非常简单,它遵循以下形式:
funcName = lambda [parameter_list]: expression
其返回的是一个函数对象,相当于:
def func_ name([parameter_list]):return expression
参数列表以逗号分隔。
注意,可选参数是方括号括起来的部分,是通用语法的表示形式,即文中的方括号部分是可选的,根据实际需要提供,
我们再来看另外两个等价函数的例子,以两种形式定义:
# lambda说明 # 示例 1: 两数相加 def adder(a, b): return a + b # 等价于: adder_lambda = lambda a, b: a + b # 示例 2: 字符串转大写 def to_upper(s): return s.upper() # 等价于: to_upper_lambda = lambda s: s.upper()
前面的例子非常简单。第一个函数将两个数字相加,第二个函数生成字符串的大写版本。注意,我们将lambda表达式返回的内容赋值给一个名称(adder_lambda, to_upper_lambda),但是当按照filter()示例中的方式使用lambda时,就不需要这样做了——不需要把匿名函数赋给变量。
函数属性
Python中每个函数都是一个完整的对。因此,它有许多属性。其中一些是特殊的,可以以内省的方式在运行时检查函数对象。下面的示例,展示了它们的一部分以及如何为示例函数显示它们的值:
# 函数属性 def multiplication(a, b=1): """返回a乘以b的结构. """ return a * b if __name__ == "__main__": special_attributes = [ "__doc__", "__name__", "__qualname__", "__module__", "__defaults__", "__code__", "__globals__", "__dict__", "__closure__", "__annotations__", "__kwdefaults__", ] for attribute in special_attributes: print(attribute, '->', getattr(multiplication, attribute))
我们使用内置的getattr()函数来获取这些属性的值。getattr(obj, attribute)等价于obj.attribute,当我们需要在运行时动态地获取属性时,就从变量中获取属性的名称(如本例中所示),此时它就会派上用场。
运行这个脚本会得到类似如下输出:
__doc__ -> 返回a乘以b的结果. __name__ -> multiplication __qualname__ -> multiplication __module__ -> __main__ __defaults__ -> (1,) __code__ -> <……> __globals__ -> {…略…} __dict__ -> {} __closure__ -> None __annotations__ -> {} __kwdefaults__ -> None |
这里省略了__globals__属性的值,内容太多。这个属性的含义可以在Python数据模型文档页面(或自带帮助文档中)的可调用类型部分找到:
https://www.php.cn/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的文档指南:
https://www.php.cn/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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 기사는 데비안 시스템에서 Apache Logs를 분석하여 웹 사이트 성능을 향상시키는 방법을 설명합니다. 1. 로그 분석 기본 사항 Apache Log는 IP 주소, 타임 스탬프, 요청 URL, HTTP 메소드 및 응답 코드를 포함한 모든 HTTP 요청의 자세한 정보를 기록합니다. 데비안 시스템 에서이 로그는 일반적으로 /var/log/apache2/access.log 및 /var/log/apache2/error.log 디렉토리에 있습니다. 로그 구조를 이해하는 것은 효과적인 분석의 첫 번째 단계입니다. 2. 로그 분석 도구 다양한 도구를 사용하여 Apache 로그를 분석 할 수 있습니다.

Python은 게임 및 GUI 개발에서 탁월합니다. 1) 게임 개발은 Pygame을 사용하여 드로잉, 오디오 및 기타 기능을 제공하며 2D 게임을 만드는 데 적합합니다. 2) GUI 개발은 Tkinter 또는 PYQT를 선택할 수 있습니다. Tkinter는 간단하고 사용하기 쉽고 PYQT는 풍부한 기능을 가지고 있으며 전문 개발에 적합합니다.

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

데비안 시스템의 readdir 함수는 디렉토리 컨텐츠를 읽는 데 사용되는 시스템 호출이며 종종 C 프로그래밍에 사용됩니다. 이 기사에서는 ReadDir를 다른 도구와 통합하여 기능을 향상시키는 방법을 설명합니다. 방법 1 : C 언어 프로그램을 파이프 라인과 결합하고 먼저 C 프로그램을 작성하여 readDir 함수를 호출하고 결과를 출력하십시오.#포함#포함#포함#포함#includinTmain (intargc, char*argv []) {dir*dir; structdirent*entry; if (argc! = 2) {

이 기사에서는 DDOS 공격 탐지 방법에 대해 설명합니다. "Debiansniffer"의 직접적인 적용 사례는 발견되지 않았지만 DDOS 공격 탐지에 다음과 같은 방법을 사용할 수 있습니다. 효과적인 DDOS 공격 탐지 기술 : 트래픽 분석을 기반으로 한 탐지 : 갑작스런 트래픽 성장, 특정 포트에서의 연결 감지 등의 비정상적인 네트워크 트래픽 패턴을 모니터링하여 DDOS 공격을 식별합니다. 예를 들어, Pyshark 및 Colorama 라이브러리와 결합 된 Python 스크립트는 실시간으로 네트워크 트래픽을 모니터링하고 경고를 발행 할 수 있습니다. 통계 분석에 기반한 탐지 : 데이터와 같은 네트워크 트래픽의 통계적 특성을 분석하여

제한된 시간에 Python 학습 효율을 극대화하려면 Python의 DateTime, Time 및 Schedule 모듈을 사용할 수 있습니다. 1. DateTime 모듈은 학습 시간을 기록하고 계획하는 데 사용됩니다. 2. 시간 모듈은 학습과 휴식 시간을 설정하는 데 도움이됩니다. 3. 일정 모듈은 주간 학습 작업을 자동으로 배열합니다.

이 기사에서는 Debian 시스템에서 NginxSSL 인증서를 업데이트하는 방법에 대해 안내합니다. 1 단계 : CertBot을 먼저 설치하십시오. 시스템에 CERTBOT 및 PYTHON3-CERTBOT-NGINX 패키지가 설치되어 있는지 확인하십시오. 설치되지 않은 경우 다음 명령을 실행하십시오. sudoapt-getupdatesudoapt-getinstallcertbotpython3-certbot-nginx 2 단계 : 인증서 획득 및 구성 rectbot 명령을 사용하여 nginx를 획득하고 nginx를 구성하십시오.

데비안에서 gitlab 플러그인을 개발하려면 몇 가지 특정 단계와 지식이 필요합니다. 다음은이 과정을 시작하는 데 도움이되는 기본 안내서입니다. Gitlab을 먼저 설치하려면 Debian 시스템에 Gitlab을 설치해야합니다. Gitlab의 공식 설치 매뉴얼을 참조 할 수 있습니다. API 액세스 토큰을 얻으십시오 API 통합을 수행하기 전에 Gitlab의 API 액세스 토큰을 먼저 가져와야합니다. Gitlab 대시 보드를 열고 사용자 설정에서 "AccessTokens"옵션을 찾은 다음 새 액세스 토큰을 생성하십시오. 생성됩니다
