成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python編程:遞歸與匿名函數及函數屬性與文檔字符串(函數補充)

開發(fā) 前端
本文主要基于Python語言的一大特色——函數來拓展的一些相關編程知識,包括遞歸函數(重點是有限性和邊界性)、lambda函數(簡潔性和臨時性)以及函數的屬性以及如何實現函數的文檔化描述等。

本文簡單扼要地說,輔以代碼進一步地加深理解。

 遞歸函數

當函數調用自身而生成最終結果時,這樣的函數稱為遞歸。有時遞歸函數非常有用,因為它們使編寫代碼變得更容易——使用遞歸范式編寫一些算法非常容易,而其他算法則不是這樣。沒有不能以迭代方式重寫的遞歸函數,換句話說,所有遞歸函數都可以通過循環(huán)迭代的方式實現,因此通常由程序員根據手頭的情況選擇最佳方法。

遞歸函數主體通常有兩個部分:一部分的返回值依賴于對自身的后續(xù)調用,另一部分的返回值不依賴于對自身的后續(xù)調用(稱基本情況,或遞歸邊界)。

作為理解的參考示例,我們看一個階乘函數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,當我們需要在運行時動態(tài)地獲取屬性時,就從變量中獲取屬性的名稱(如本例中所示),此時它就會派上用場。

運行這個腳本會得到類似如下輸出:

__doc__ -> 返回a乘以b的結果.

__name__ -> multiplication

__qualname__ -> multiplication

__module__ -> __main__

__defaults__ -> (1,)

__code__ -> <……>

__globals__ -> {…略…}

__dict__ -> {}

__closure__ -> None

__annotations__ -> {}

__kwdefaults__ -> None

這里省略了__globals__屬性的值,內容太多。這個屬性的含義可以在Python數據模型文檔頁面(或自帶幫助文檔中)的可調用類型部分找到:

??https://docs.python.org/3/reference/datamodel.html#the-standard-typehierarchy??

再次提醒:如果你想查看對象的所有屬性,只需調用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 。

 文檔化代碼

我們非常喜歡不需要文檔的代碼。當我們正確地編程、選擇正確的名稱、并注意細節(jié)時,代碼應該是不言自明的,幾乎不需要文檔。不過,有時注釋非常有用,添加一些文檔化描述也是如此。你可以在Python的PEP 257規(guī)范——文檔字符串約定中找到Python的文檔指南:

??https://www.python.org/dev/peps/pep-0257/,??

但在這里還是會向你展示基本原理。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是用于創(chuàng)建Python文檔的最廣泛使用的工具之一——事實上,官方Python文檔就是用它編寫的。絕對值得花點時間去看看。

內置函數help()用于即時交互使用的,它就使用對象的文檔字符串為對象創(chuàng)建文檔頁面來展示對象的用法。基本用法如下:

def square(n):
"""功能:返回數字n的平方。 """
return n ** 2

help(square)
Help on function square in module __main__:

square(n)
功能:返回數字n的平方。

首先明確或定義一個對象或函數(包括已有的對象或函數),然后使用內置help函數,并把對象或函數做help的參數,該函數就會返回相應對象的說明文檔了。就這么簡單。

本文小結

本文主要基于Python語言的一大特色——函數來拓展的一些相關編程知識,包括遞歸函數(重點是有限性和邊界性)、lambda函數(簡潔性和臨時性)以及函數的屬性以及如何實現函數的文檔化描述等。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-07-07 09:03:36

Python返回函數匿名函數

2020-05-20 10:35:53

Python開發(fā)函數

2010-10-09 11:54:46

MySQL字符串

2014-01-02 16:14:10

PostgreSQL字符串

2017-06-08 14:25:46

Kotlin函數

2014-04-16 10:54:45

Javascript遞歸調用

2021-08-20 06:58:31

C++Python函數

2010-05-31 14:05:51

2023-05-06 07:27:47

2010-03-16 10:43:26

Python字符串

2023-12-04 07:09:53

函數遞歸python

2009-11-24 09:55:44

PHP字符串函數

2009-08-06 16:01:09

C#字符串函數大全

2010-07-14 16:35:52

Perl字符串處理函數

2010-11-08 17:07:41

SQL Server字

2010-11-26 10:14:40

MySQL repla

2023-10-07 00:01:02

Java函數

2025-06-11 08:00:00

LambdaPython函數

2015-04-08 10:27:43

JavaScript字符串操作函數

2010-01-05 16:12:55

Javascript匿
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人亚洲性情网站www在线观看 | 欧美成人猛片aaaaaaa | 久久久精品视频免费看 | 国产精品99久久久久 | 狠狠操天天干 | 日本成人一区二区 | 韩日有码| 日日夜夜天天 | 一级片网址 | 日韩在线精品视频 | 久久成人国产 | 99热热热| 天天射夜夜操 | 久久新视频 | a国产一区二区免费入口 | 国产激情视频在线观看 | 国产精品久久久99 | 精品日韩一区 | 一区二区高清在线观看 | 国产精品无码久久久久 | 五月婷婷在线视频 | 自拍偷拍精品 | 91久久精品日日躁夜夜躁欧美 | 亚洲一区国产精品 | 福利一区二区 | 国产精品日韩一区二区 | 亚洲欧美国产精品久久 | 免费成人av网站 | 久久久久久久久一区 | 精品久久久久久 | 91中文字幕在线观看 | 成人在线小视频 | 91精品中文字幕一区二区三区 | 北条麻妃av一区二区三区 | 国产色片在线 | h在线 | 亚洲一区二区三区免费在线 | 99精品国产一区二区青青牛奶 | 欧美日韩一区二区电影 | 婷婷久久五月 | 久久综合色综合 |