python基礎--函數

來源:互聯網
上載者:User

標籤:python   基礎   

定義: 函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可
特性:

1. 減少重複代碼2. 使程式變的可擴充3. 使程式變得易維護

在Python中,定義一個函數要使用def語句,依次寫出函數名、括弧、括弧中的參數和冒號:,然後,在縮排塊中編寫函數體,函數的傳回值用return語句返回。
函數分類
內建函數
自訂函數
python解譯器已經為我們定義好了的函數即內建函數。
可以直接使用的函數,如len(),sum(),max()
自訂函數規則:
函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括弧 ()。
任何傳入參數和自變數必須放在圓括弧中間,圓括弧之間可以用於定義參數。
函數的第一行語句可以選擇性地使用文檔字串—用於存放函數說明。
函數內容以冒號起始,並且縮排。
return [運算式] 結束函數,選擇性地返回一個值給調用方。不帶運算式的return相當於返回 None。
#文法
def 函數名(參數1,參數2,參數3,...):
‘‘‘注釋‘‘‘
函數體
return 返回的值
def hello():
print("hello word")
hello()

在python中函數要先定義後才能調用
def hello():
print("hello")
word()
hello()

def hello():
print("hello")
word()
hello()
def word():
print("word")
報錯word未定義

def hello():
print("hello")
word()

def word():
print("word")

hello()
正常運行

可以把函數的運行分成兩部
函數的定義
函數的調用
定義時對函數進行文法分析,不執行函數
調用時檢測邏輯是否正確返回結果

上面是不帶參數的函數
還有帶參數的函數
def mysum(a,b):
res = a + b
print(res)
mysum(1,2)
a,b叫形參(函數定義時的參數)
1,2叫實參(函數調用時傳遞的參數)
形式參數(變數)只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數。
實參可以是常量、變數、運算式、函數等,無論實參是何種類型,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定的值

預設參數
如果在傳參數時有一個參數是相同的或者很少變可以寫成預設參數
例如:
def register(name,age,country="CN"):
print(name)
print(age)
print(name)
print(country)
register("Jack",16)
register("Mike",18,"USA")


運行結果如下

關鍵字參數(鍵-值對參數)
正常情況下,給函數傳參數要按順序,不想按順序就可以用關鍵參數,只需指定參數名即可,關鍵字參數必須放在位置參數之後。


結果


總結:
一、位置參數
調用函數時根據函數定義的參數位置來傳遞參數
二、關鍵字參數
用於函數調用,通過“鍵-值”形式加以指定。可以讓函數更加清晰、容易使用,同時也清除了參數的順序需求。
三、預設參數
用於定義函數,為參數提供預設值,調用函數時可傳可不傳該預設參數的值(注意:所有位置參數必須出現在預設參數前,包括函數定義和調用)
預設參數的使用:就是某一個參數只有在少數情況下需要修改!
預設參數跟位置參數同時存在的話,要把預設參數放在後邊啊,放在前邊的話,如果只傳一個參數進去,編譯器也不知道你是誰。
預設參數不可以是可變對象。因為可變對象有可能在函數中值發生改變,也就不是預設值了。
非固定參數(可變參數)
如果函數在定義時不確定使用者想傳入多少個參數,就可以使用非固定參數

結果

如果可變參數不傳參數則為空白元組

def register(name,age,args): # args 會把多傳入的參數變成一個元組形式
print(name,age,args)
register(‘Jack‘,20,"python","php","java")
register(‘Mike‘,18)

還可以有一個*kwargs
kwargs 會把多傳入的參數變成一個dict形式
#如果為空白則返回空元組 空字典



kwargs 會把多傳入的參數變成一個dict形式
def register(name,age,
args,**kwargs):
print(name,age,args,kwargs)
register("Jack",20,"CN","Python",sex="Male",province="jiangsu")
#如果為空白則返回空元組 空字典
register("Mike",16)
參數組合
具體的使用中,經常會不止使用到一種參數。這些參數是有順序的:
位置參數,預設參數,可變參數,索引值對參數(關鍵字參數)

局部變數

函數內部可以使用全域變數
如果在函數內部進行賦值改變則只在函數內部起作用


結果如下:

name = "我是全域變數"
def change_name(name):
print("使用傳遞的全域變數:",name)
name = "我是函數的局部變數"
print("使用函數內部的變數", name)
change_name(name)
print("外部列印:",name)

全域與局部變數
在函數中定義的變數稱為局部變數(作用於本函數),在函數外部定義的變數稱為全域變數(作用於整個程式)。
全域變數範圍是整個程式,局部變數範圍是定義該變數的函數。
當全域變數與局部變數同名時:
在定義局部變數的函數內,局部變數起作用;在其它地方全域變數起作用。

範圍
在 Python 函數中會建立一個新的範圍,只在函數體內起作用
當在函數體中遇到變數時,Python 會首先在該函數的命名空間中尋找變數名,如果找不到就找全域變數
strs = "teststring"
print(id(strs))
def foo():
print(strs)
print(id(strs))
foo()
print(id(strs))


可以看出地址不改變
如果在函數內重新賦值會是什麼情況那?

strs = ‘abc‘
print(id(strs))#abc的地址
def foo():
strs = ‘cde‘
print(id(strs))#輸出新建立的地址
print(strs)#新建立的地址的內容即cde
foo()
print(id(strs))#全域變數abc的地址
print(strs)#全域變數不會改變

輸出結果

全部變數可以被訪問(如果是可變類型,甚至可以被修改)。foo(),實際上是在棧中建立了一個和全域變數相同名字的局部變數,通過在函數 foo 中列印局部命名空間可以印證這一點。在函數執行完後執行完後輸出全域變數可以看到,全域命名空間裡變數 strs 的值並沒有改變地址也不會變。

python基礎--函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.