函數,在BASIC中,叫subroutine(子過程或子程序),在Pascal中叫作procedure(過程)和function,在C中只有function,在Java中叫method。html
定義:函數是指將一組語句的集合經過一個名字(函數名)封裝起來,要執行這個函數,只需調用其函數名便可。函數
定義一個不帶參數的函數:ui
def sayhi(): print('hello') sayhi()
定義一個帶參數的函數:spa
def sayhi(name): print('hello', name) sayhi('Jack')
形參:在函數定義時接收code
默認參數:函數定義時即默認給參數賦值,調用時能夠不須要額外賦值,位置應在位置參數以後。(有關默認參數陷阱,請見:函數的默認參數陷阱)htm
關鍵參數:指定參數名,即成爲關鍵參數,可是關鍵參數必須放在位置參數以後。blog
非固定參數(動態參數):ip
(1)動態位置參數:參數前加*號,傳遞的參數就能夠再也不是固定的個數,傳過來的全部參數打包成元組。(形參能夠是*args,也能夠是*[列表]的形式)內存
(2)動態關鍵字參數:形式參數前加**號,傳遞的能夠是未定義的關鍵字參數,以字典的key-value保存。作用域
形參排列順序:位置參數、動態位置參數(*args)、默認參數、動態默認參數(**kwargs)
--若是想將一整個字典傳入kwargs,則應在實參前也加上**號。
實參:在函數調用時傳值
按照位置傳值:現有一個列表(元組)args,使用*args傳入能夠將args拆分後傳入函數,直接使用args傳則會在函數中獲得(args,)
按照關鍵字傳值:現有一個字典kwargs,使用**kwargs傳入能夠將kwargs拆分後傳入函數(且此處的鍵必須爲字符串類型),直接使用kwargs傳會報錯。
函數參數總結:
函數的外部代碼想要獲取函數的執行結果,就能夠用函數的return語句把結果返回。
注: 1.函數執行過程當中,遇return即中止執行並返回結果,能夠理解爲return語句表明函數的結束。
2.若是未在函數中指定return,則返回值爲None。
3.函數永遠只能返回一個值,當有多個值時會打包成元組返回。
全局變量:定義在函數外部一級代碼的變量,在全局都能用
局部變量:定義在函數裏的變量,只能在局部生效
在函數內部,能夠引用全局變量,但不能修改(global後則能夠修改)。若是全局和局部都有一個同名,函數查找順序是由內而外的。
在Python中,一個函數就是一個做用域(和JavaScript相似); C#、Java中做用域爲{ }
局部變量放置在其做用域中,代碼定義完成後,做用域已經生成,做用域鏈向上查找。驗證以下:
1 age = 18 # 全局做用域 2 def show_age(): 3 new_age = 19 # 外層函數局部做用域 4 def inner(): 5 print(age) 6 print(new_age) 7 show_age()
打印結果:
內層函數用到了外層函數以及全局的做用域的變量,但變量在此只能引用不能改變,不然會報錯。
命名空間也稱名稱空間,是存放變量名字的地方。舉例說明,x=1,1存放在內存中,x變量名存在哪裏呢?x自己也存在內存中。
名稱空間正是存放名字x與1綁定關係的地方,它不只存x名,也存了綁定關係。
名稱空間共3種:
1.locals:函數內的名稱空間,包括局部變量和形參。
2.globals:全局變量,程序全部的變量及綁定關係。
3.builtins:內置模塊的名稱空間