在python中可以使用def
關鍵字來定義函式,和變數一樣每個函式也有乙個響亮的名字,而且命名規則跟變數的命名規則是一致的。在函式名後面的圓括號中可以放置傳遞給函式的引數,這一點和數學上的函式非常相似,程式中函式的引數就相當於是數學上說的函式的自變數,而函式執行完成後我們可以通過return
關鍵字來返回乙個值,這相當於數學上說的函式的因變數。
函式是絕大多數程式語言中都支援的乙個**的"構建塊",但是python中的函式與其他語言中的函式還是有很多不太相同的地方,其中乙個顯著的區別就是python對函式引數的處理。在python中,函式的引數可以有預設值,也支援使用可變引數,所以python並不需要像其他語言一樣支援函式的過載。在引數名前面的*表示args是乙個可變引數
def add(*args):
total = 0
for val in args:
total += val
return total
如果專案是由多人協作進行團隊開發的時候,團隊中可能有多個程式設計師都定義了名為foo
的函式,那麼怎麼解決這種命名衝突呢?答案其實很簡單,python中每個檔案就代表了乙個模組(module),我們在不同的模組中可以有同名的函式,在使用函式的時候我們通過import
關鍵字匯入指定的模組就可以區分到底要使用的是哪個模組中的foo
函式。
需要說明的是,如果我們匯入的模組除了定義函式之外還中有可以執行**,那麼python直譯器在匯入這個模組時就會執行這些**,事實上我們可能並不希望如此,因此如果我們在模組中編寫了執行**,最好是將這些執行**放入如下所示的條件中,這樣的話除非直接執行該模組,if條件下的這些**是不會執行的,因為只有直接執行的模組的名字才是"__main__"。
def foo():
pass
def bar():
pass
# __name__是python中乙個隱含的變數它代表了模組的名字
# 只有被python直譯器直接執行的模組的名字才是__main__
if __name__ == '__main__':
print('call foo()')
foo()
print('call bar()')
bar()
def foo():
b = 'hello'
# python中可以在函式內部再定義函式
def bar():
c = true
print(a)
print(b)
print(c)
bar()
# print(c) # nameerror: name 'c' is not defined
if __name__ == '__main__':
a = 100
# print(b) # nameerror: name 'b' is not defined
foo()
上面的**能夠順利的執行並且列印出100、hello和true,但我們注意到了,在bar
函式的內部並沒有定義a
和b
兩個變數,那麼a
和b
是從**來的。我們在上面**的if
分支中定義了乙個變數a
,這是乙個全域性變數(global variable),屬於全域性作用域,因為它沒有定義在任何乙個函式中。在上面的foo
函式中我們定義了變數b
,這是乙個定義在函式中的區域性變數(local variable),屬於區域性作用域,在foo
函式的外部並不能訪問到它;但對於foo
函式內部的bar
函式來說,變數b
屬於巢狀作用域,在bar
函式中我們是可以訪問到它的。bar
函式中的變數c
屬於區域性作用域,在bar
函式之外是無法訪問的。事實上,python查詢乙個變數時會按照「區域性作用域」、「巢狀作用域」、「全域性作用域」和「內建作用域」的順序進行搜尋,前三者我們在上面的**中已經看到了,所謂的「內建作用域」就是python內建的那些識別符號,我們之前用過的input
、print
、int
等都屬於內建作用域。 python 函式與模組
1,定義函式 def 函式名 參數列 函式語句 return 發回值 引數和返回值都可以省略 def hello print xyf 無敵 hello 2,引數傳遞 def add a,b return a b print add a b 順序依次傳遞 print add b a a b 按形參賦值...
Python函式與模組 函式定義與使用
一.函式定義與使用 1.函式定義 python中函式的定義與宣告是視為一體的。def 函式名 函式引數 函式體return 表示式或值 注 python中變數是弱型別的,python會自動根據值來維護其型別。所以不用指定返回值及函式引數的型別 若沒有return語句,則自動返回none 如果有ret...
Python 函式與模組等
參考 菜鳥教程 2 模組 3 檔案 io 4 異常 函式內容以冒號起始,並且縮排 不帶表示式的return相當於返回 none def functionname parameters function suite return expression 可變更和不可變更物件的傳遞 我的理解 usr bi...