摘要:函數(shù)返回值支持多個(gè),返回多個(gè)時(shí),使用逗號(hào)分隔。如上,與這個(gè)參數(shù)按照由左到右依次賦值給形參和供函數(shù)內(nèi)部使用。在傳入函數(shù)時(shí),便是將這個(gè)引用傳入了函數(shù)。需要使用關(guān)鍵字聲明將變量作用域變?yōu)楹瘮?shù)外部非全局變量,及閉包作用域。
< 返回索引頁
函數(shù)
函數(shù)定義
返回值
函數(shù)的調(diào)用
函數(shù)的參數(shù)
順序參數(shù)
參數(shù)的默認(rèn)值
可變參數(shù)
關(guān)鍵字參數(shù)
參數(shù)的組合
參數(shù)的專遞
函數(shù)作用域
內(nèi)建函數(shù)
匿名函數(shù)
函數(shù)注解
總結(jié)
練習(xí)
參考
函數(shù)在維基百科上函數(shù)式這樣描述的:
函數(shù)在數(shù)學(xué)中為兩集合間的一種對(duì)應(yīng)關(guān)系:輸入值集合中的每項(xiàng)元素皆能對(duì)應(yīng)唯一一項(xiàng)輸出值集合中的元素。
此處的函數(shù)區(qū)別于我們數(shù)學(xué)上的函數(shù),在編程世界中,函數(shù)(Functions)是指可重復(fù)使用的程序片段。它們?cè)试S你為某個(gè)代碼塊賦予名字,允許你
通過這一特殊的名字在你的程序任何地方來運(yùn)行代碼塊,并可重復(fù)任何次數(shù)。這就是所謂的調(diào)用函數(shù)。我們已經(jīng)使用過了許多內(nèi)置的函數(shù),例如 len 和 range 。
基本結(jié)構(gòu)如下:
def 函數(shù)名(參數(shù)列表): " 函數(shù)說明 " 函數(shù)體函數(shù)定義
在Python中,使用關(guān)鍵字def來定義一個(gè)函數(shù)。結(jié)構(gòu)如下:
def hello(name): " 返回字符串" return name def hello2(): pass
語法說明:
函數(shù)的參數(shù)支持多種形式
函數(shù)說明,可通過內(nèi)部方法hello.__doc__ 獲取
函數(shù)的返回值支持返回多個(gè)
我們可以使用 pass 來定義個(gè)空函數(shù)
下面來展開一一講述。
返回值函數(shù)中返回值,使用關(guān)鍵字return 來表示,返回值可以是任意類型,當(dāng)沒有return語句時(shí)函數(shù)返回None。函數(shù)返回值支持多個(gè),返回多個(gè)時(shí),使用逗號(hào)分隔。如下:
def say_hello(name): print(name) return "Hello, %s" % name, name函數(shù)的調(diào)用
函數(shù)的調(diào)用,上邊我們已經(jīng)使用了很多次了,函數(shù)名加上需要傳入的響應(yīng)參數(shù)即可。這里需要注意的是,在python中,一切結(jié)尾對(duì)象,當(dāng)然函數(shù)也是對(duì)象。函數(shù)名也可以作為參數(shù)傳遞到函數(shù)中使用。
def say_hello(name): print("hello, %s" % name) def wapper(fun): print("調(diào)用之前做一些事") fun("Dean") print("調(diào)用之后做一些事") wapper(say_hello) """ 調(diào)用之前做一些事 hello, Dean 調(diào)用之后做一些事 """函數(shù)的參數(shù)
在程序設(shè)計(jì)中函數(shù)參數(shù)有2個(gè)比較通用的概念,形參和實(shí)參,在各高級(jí)語言中都會(huì)有。形參,即形式上的參數(shù),不占用內(nèi)存空間。實(shí)參,是實(shí)際真正的參數(shù)。
看下面這個(gè)實(shí)例:
def say_hello(name): print("hello, %s" % name ) say_hello("Dean")
其中,函數(shù)參數(shù)name即為函數(shù)的形參。我們調(diào)用函數(shù)時(shí),傳入的參數(shù)Dean便是實(shí)參。在Python編程時(shí),這個(gè)概念并不是那么重要,此種了解即可。
順序參數(shù)在Python 函數(shù)中,多個(gè)參數(shù)按照一定的順序依次傳入函數(shù),其值依次對(duì)應(yīng)賦給函數(shù)聲明時(shí)參數(shù),這種參數(shù)叫順序參數(shù)。
def say_hello(name, age): print("hello, %s" % name) print("you age: %s " % age) say_hello("Dean", 30)
如上,Dean與30 這2個(gè)參數(shù)按照由左到右依次賦值給形參name和age供函數(shù)內(nèi)部使用。需要注意的是,順序參數(shù)中,形參和實(shí)參的個(gè)數(shù)需要一直,否則函數(shù)會(huì)報(bào)調(diào)用錯(cuò)誤。
參數(shù)的默認(rèn)值在函數(shù)聲明時(shí),可以給參數(shù)設(shè)置默認(rèn)值,如下:
def say_hello(name="Tim", age=20): print("hello, %s" % name) print("you age: %s " % age) say_hello("Dean", 30) say_hello("Dean")
當(dāng)函數(shù)參數(shù)設(shè)置默認(rèn)值后,該參數(shù)在調(diào)用函數(shù)時(shí),可以省略,省略時(shí)則會(huì)使用默認(rèn)值。有此可以退出,參數(shù)沒有設(shè)置默認(rèn)值,則是必傳的。
可變參數(shù)有時(shí)候我們?cè)诼暶骱瘮?shù)時(shí),沒法確定函數(shù)的參數(shù)個(gè)數(shù),或者我們本身就想設(shè)計(jì)一種動(dòng)態(tài)的參數(shù),這種設(shè)計(jì)是否可以滿足呢?Python的函數(shù)對(duì)這種情況已做了考慮,提供了可變參數(shù)來滿足這種需求。
def say_hello(*args): print(args) for name in args: print("hello, %s" % name) say_hello("Dean","Tim") ("Dean", "Tim") hello, Dean hello, Tim
可變參數(shù)使用*加一個(gè)形參來表示,其值為一個(gè)元組類型,元組內(nèi)的元素為我們傳入的實(shí)參。
關(guān)鍵字參數(shù)在可變參數(shù)中,我們傳入函數(shù)的參數(shù)只能按順序或著通過下標(biāo)來獲取,那么可不可以給參數(shù)起一個(gè)名字呢,答案是可以的。Python 為這種情況提供了一種參數(shù)形式,叫做關(guān)鍵字參數(shù)。
def say_hello(**kwargs): print("hello, %s" % kwargs["name"]) print("you age: %s" % kwargs["age"]) say_hello(name="Dean", age=30)
使用**加一個(gè)形參來表示,其值為一個(gè)字典,key為我們實(shí)參中傳入的變量,value值為實(shí)參中的變量的值。
參數(shù)的組合Python 函數(shù)中,以上參數(shù)可組合使用。當(dāng)參數(shù)組合使用時(shí),需要注意以下原則:
有默認(rèn)值的參數(shù)需要放在無默認(rèn)值參數(shù)的后邊
當(dāng)順序參數(shù)和可變參數(shù)混合使用時(shí),可變參數(shù)的取值為超出順序參數(shù)的實(shí)參部分,且可變參數(shù)在順序參數(shù)之后。
args 和 *kwargs 是 Python 的慣用寫法,變量名可以更換。
參數(shù)的常用排列順序?yàn)椋瑹o默認(rèn)值順序參數(shù)、有默認(rèn)值順序參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)。
def say_hello(name, age=30, *args, **kwargs): print(args) print(kwargs) print("hello, %s" % name) print("you age: %s" % age) print("address: %s" % kwargs["address"]) say_hello("Dean", 20, address="Beijing")參數(shù)的專遞
我們?cè)谡{(diào)用函數(shù)時(shí),將實(shí)參傳遞給了函數(shù)的形參,供函數(shù)中邏輯代碼使用。那么在這個(gè)過程中,計(jì)算機(jī)內(nèi)存是一個(gè)怎么的過程呢?我們?cè)趯W(xué)習(xí)變量時(shí)知道,Python中的變量是其內(nèi)部存儲(chǔ)值的一個(gè)內(nèi)存地址或者叫做一個(gè)引用。在傳入函數(shù)時(shí),便是將這個(gè)引用傳入了函數(shù)。那么我們?cè)诤瘮?shù)內(nèi)部修改變量的值時(shí),是不是就修改了外部的變量的值呢?答案是不一定。
在我們學(xué)習(xí)基本數(shù)據(jù)結(jié)構(gòu)時(shí),我們知道有可變類型(字典、列表、集合)和不可變類型(數(shù)值、字符串、元組)。當(dāng)我們傳入函數(shù)的參數(shù)為可變類型時(shí),函數(shù)中的形參使用的內(nèi)存地址同實(shí)參的內(nèi)存地址,當(dāng)改變形參的值時(shí),實(shí)參的值也相應(yīng)跟著修改了。當(dāng)我們傳入的為不可變量時(shí),形參會(huì)重新分配一塊內(nèi)存地址保存實(shí)參傳給他的值,當(dāng)形參修改時(shí),實(shí)參自然不會(huì)修改。
來看下邊的例子:
# func.py def say_hello1(name): "不可變類型參數(shù)" name = "Time" print("name: %s" % name ) def say_hello2(user_dict): "可變類型參數(shù)" user_dict["name"] ="Time" print("name: %s" % user_dict["name"]) name = "Dean" print("name before:", name) say_hello1(name) print("name after:", name) user_dict = {"name":"Dean"} print("user_dict before:", user_dict) say_hello2(user_dict) print("user_dict after:", user_dict) """ # 不可變參數(shù),值沒有變 ("name before:", "Dean") name: Time ("name after:", "Dean") # 可變參數(shù),值變了 ("user_dict before:", {"name": "Dean"}) name: Time ("user_dict after:", {"name": "Time"}) """函數(shù)作用域
在第三章,我們學(xué)習(xí)變量時(shí),知道變量的作用域決定了在哪一部分程序可以訪問哪個(gè)特定的變量名稱。在Python中,函數(shù)會(huì)重新開啟一個(gè)作用域,當(dāng)在函數(shù)內(nèi)部定義的變量,在函數(shù)外部是無法訪問的。那么該變量便是函數(shù)的局部變量,函數(shù)外部的變量便可成為全局變量。
total = 0 # 這是一個(gè)全局變量 # 可寫函數(shù)說明 def sum( arg1, arg2 ): #返回2個(gè)參數(shù)的和. total = arg1 + arg2 # total在這里是局部變量. print ("函數(shù)內(nèi)是局部變量 : ", total) return total #調(diào)用sum函數(shù) sum( 10, 20 ) print ("函數(shù)外是全局變量 : ", total)
那么當(dāng)內(nèi)部的局部變量想要暴露出來給外部使用時(shí)如何實(shí)現(xiàn)呢?Python提供了2個(gè)關(guān)鍵字,gobal 和 nonlocal 。
global 將變量作用域變?yōu)楹瘮?shù)外層全局作用域。
num = 1 def fun1(): global num # 需要使用 global 關(guān)鍵字聲明 print(num) num = 123 print(num) fun1()
nonlocal 將變量作用域變?yōu)楹瘮?shù)外部非全局變量,及閉包(Enclosing)作用域。
def outer(): num = 10 def inner(): nonlocal num # nonlocal關(guān)鍵字聲明 num = 100 print(num) inner() print(num) outer()內(nèi)建函數(shù)
內(nèi)建函數(shù),是Python中已經(jīng)定義好的函數(shù)可以在編寫代碼時(shí)直接使用。我們已經(jīng)使用過內(nèi)建函數(shù),如len、range 等。更多的內(nèi)建函數(shù),可參閱官方文檔中函數(shù)說明。
匿名函數(shù)匿名函數(shù),就是不使用def來定義的函數(shù)。Python中使用關(guān)鍵字lambda 來實(shí)現(xiàn)匿名函數(shù)。
# 語法 lambda [arg1 [,arg2,.....argn]]:表達(dá)式
語法說明:
arg為參數(shù),可以任意多個(gè),使用逗號(hào)分隔
表達(dá)式 為函數(shù)體,使用冒號(hào)開頭
表達(dá)式 的返回值即為函數(shù)的返回值
實(shí)例:
# 內(nèi)名函數(shù) sum = lambda arg1, arg2: arg1 + arg2 # 調(diào)用sum函數(shù) print ("相加后的值為 : ", sum( 10, 20 )) print ("相加后的值為 : ", sum( 20, 20 ))函數(shù)注解
函數(shù)注解,為函數(shù)和參數(shù)增加了一些說明特性。python3.0 新增的特性,見PEP3107。可通過函數(shù)的__annotations__ 熟悉查看。
def f(ham: 42, eggs: int = "spam") -> "Nothing to see here": print("Annotations:", f.__annotations__) print("Arguments:", ham, eggs) f("wonderful") """ Annotations: {"eggs":, "return": "Nothing to see here", "ham": 42} Arguments: wonderful spam """ def foo(a: "x", b: 5 + 6, c: list) -> max(2, 9): pass
語法說明:
參數(shù)的說明在參數(shù)后邊,使用冒號(hào)和參數(shù)隔離,注釋為一個(gè)表達(dá)式。
函數(shù)的注解在函數(shù)參數(shù)括號(hào)后,使用"->" 符號(hào)開頭,也是一個(gè)表達(dá)式。
在Python的編程時(shí),注解使用的比較少,以方便人們更多的使用docstring來說明參數(shù)及返回值,另一方面Python函數(shù)參數(shù)可進(jìn)一步通過編碼規(guī)范一眼就能看出什么類型。這種注釋語法,反而顯得啰嗦冗余。
總結(jié)本章我們學(xué)習(xí)了函數(shù)及其使用,知識(shí)重點(diǎn)總結(jié)如下:
Python提供了許多內(nèi)建函數(shù)共我們使用,內(nèi)建函數(shù)可直接使用無需定義。
參數(shù)組合在使用的時(shí)候是有順序的,依次是無默認(rèn)值順序參數(shù)、有默認(rèn)值順序參數(shù)、可變參數(shù)、關(guān)鍵字參數(shù)。
args 表示可變參數(shù),*kwargs 表示關(guān)鍵字參數(shù)。
當(dāng)參數(shù)為不可變參數(shù)時(shí),函數(shù)不會(huì)影響外部實(shí)參值,當(dāng)參數(shù)為不可變參數(shù)時(shí),函數(shù)則會(huì)影響外部實(shí)參值。
函數(shù)本身可作為參數(shù)傳遞。
Python 中使用lambda 來實(shí)現(xiàn)匿名函數(shù)。
練習(xí)1、求n的階乘
def factorial(num): """ 求階乘 :param num: 非負(fù)整數(shù) :return: num的階乘 """ result = 1 for n in range(1, num + 1): result *= n return result n = int(input("n = ")) factorial(n)
2、實(shí)現(xiàn)判斷一個(gè)數(shù)是不是素?cái)?shù)的函數(shù)。
# 素?cái)?shù),在大于1的自然數(shù)中,除了1和它本身以外不再有其他因數(shù) def is_prime(num): for factor in range(2, num): if num % factor == 0: return False return True if num != 1 else False參考
廖雪峰-python3教程
python官方文檔
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/42094.html
摘要:以下這些項(xiàng)目,你拿來學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過一遍Python最基本的知識(shí),比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:本文與大家分享一些編程語言的入門書籍,其中不乏經(jīng)典。全書貫穿的主體是如何思考設(shè)計(jì)開發(fā)的方法,而具體的編程語言,只是提供一個(gè)具體場(chǎng)景方便介紹的媒介。入門入門容易理解而且讀起來幽默風(fēng)趣,對(duì)于編程初學(xué)者和語言新手而言是理想的書籍。 本文與大家分享一些Python編程語言的入門書籍,其中不乏經(jīng)典。我在這里分享的,大部分是這些書的英文版,如果有中文版的我也加上了。有關(guān)書籍的介紹,大部分截取自是官...
摘要:使用一年多了,一直知道有個(gè)裝飾器,很好用,試圖理解過,可能由于資料找的不好,自己的悟性太差,一直沒有搞清楚,今天查了一些資料,算是理解了,現(xiàn)在簡(jiǎn)單記錄下。 使用python一年多了,一直知道python有個(gè)裝飾器,很好用,試圖理解過,可能由于資料找的不好,自己的悟性太差,一直沒有搞清楚,今天查了一些資料,算是理解了,現(xiàn)在簡(jiǎn)單記錄下。python的裝飾器本身的功能是在不改變已有函數(shù)本身的...
動(dòng)畫是使可視化更具吸引力和用戶吸引力的好方法。它幫助我們以有意義的方式展示數(shù)據(jù)可視化。Python 幫助我們使用現(xiàn)有的強(qiáng)大 Python 庫創(chuàng)建動(dòng)畫可視化。Matplotlib是一個(gè)非常流行的數(shù)據(jù)可視化庫,通常用于數(shù)據(jù)的圖形表示以及使用內(nèi)置函數(shù)的動(dòng)畫。 直接跳到末尾 去評(píng)論區(qū)領(lǐng)書 ? 在 Python 中創(chuàng)建條形圖追趕動(dòng)畫(評(píng)論區(qū)送書) ? 方法一:使用 pause() 函數(shù)? 方法二:使用 F...
摘要:在這里我分享下我個(gè)人入門機(jī)器學(xué)習(xí)的經(jīng)歷,希望能對(duì)大家能有所幫助。相關(guān)學(xué)習(xí)鏈接,,入門后的體驗(yàn)在入門了機(jī)器學(xué)習(xí)之后,在實(shí)際工作中,絕大多數(shù)的情況下你并不需要去創(chuàng)造一個(gè)新的算法。 機(jī)器學(xué)習(xí)在很多眼里就是香餑餑,因?yàn)闄C(jī)器學(xué)習(xí)相關(guān)的崗位在當(dāng)前市場(chǎng)待遇不錯(cuò),但同時(shí)機(jī)器學(xué)習(xí)在很多人面前又是一座大山,因?yàn)榘l(fā)現(xiàn)它太難學(xué)了。在這里我分享下我個(gè)人入門機(jī)器學(xué)習(xí)的經(jīng)歷,希望能對(duì)大家能有所幫助。 PS:這篇文章...
閱讀 2951·2021-11-25 09:43
閱讀 3327·2021-11-24 09:39
閱讀 2828·2021-09-22 15:59
閱讀 2173·2021-09-13 10:24
閱讀 509·2019-08-29 17:02
閱讀 2098·2019-08-29 13:23
閱讀 3057·2019-08-29 13:06
閱讀 3538·2019-08-29 13:04