在python子程序中、使用关键字_Python 的控制和函数
控制if else
for
while
函數
函數的定義
函數一詞來源于數學,但編程中的函數概念,與數學中的函數是有很大不同的,具體區別,我們后面會講,編程中的函數在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子過程或子程序),在Pascal中叫做procedure(過程)和function,在C中只有function,在Java里面叫做method。
函數能提高應用的模塊性,和代碼的重復利用率。你已經知道Python提供了許多內建函數,比如print()。但你也可以自己創建函數,這被叫做用戶自定義函數。
定義: 函數是指將一組語句的集合通過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名即可
特性:
代碼重用
保持一致性
可擴展性
函數的創建
格式
Python 定義函數使用 def 關鍵字,一般格式如下:
def 函數名(參數列表):
函數體
舉例
def hello():
print('hello')
調用hello()
函數名的命名規則:函數名必須以下劃線或字母開頭,可以包含任意字母、數字或下劃線的組合。不能使用任何的標點符號;
函數名是區分大小寫的。
函數名不能是保留字。
形參和實參形參:形式參數,不是實際存在,是虛擬變量。在定義函數和函數體的時候使用形參,目的是在函數調用時接收實參(實參個數,類型應與實參一一對應)
實參:實際參數,調用函數時傳給函數的參數,可以是常量,變量,表達式,函數,傳給形參
區別:
形參是虛擬的,不占用內存空間
形參變量只有在被調用時才分配內存單元,
實參是一個變量,占用內存空間,數據傳送單向,實參傳給形參,不能形參傳給實參
函數的參數類型
說明
必需的參數
必需參數須以正確的順序傳入函數。調用時的數量必須和聲明時的一樣。
缺省參數(默認參數)
調用函數時,缺省參數的值如果沒有傳入,則被認為是默認值。下例會打印默認的age,如果age沒有被傳入
不定長參數
你可能需要一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,和上述2種參數不同,聲明時不會命名。
函數的返回值
要想獲取函數的執行結果,就可以用return語句把結果返回
注意:
函數在執行過程中只要遇到return語句,就會停止執行并返回結果,也可以理解為 return 語句代表著函數的結束
如果未在函數中指定return,那這個函數的返回值為None
return多個對象,解釋器會把這多個對象組裝成一個元組作為一個一個整體結果輸出。
作用域
作用域介紹
python中的作用域分4種情況:
L:local,局部作用域,即函數中定義的變量;
E:enclosing,嵌套的父級函數的局部作用域,即包含此函數的上級函數的局部作用域,但不是全局的;
G:globa,全局變量,就是模塊級別定義的變量;
B:built-in,系統固定模塊里面的變量,比如int, bytearray等。 搜索變量的優先級順序依次是:作用域局部>外層作用域>當前模塊中的全局>python內置作用域,也就是LEGB。
作用域產生
在Python中,只有模塊(module),類(class)以及函數(def、lambda)才會引入新的作用域,其它的代碼塊(如if、try、for等)是不會引入新的作用域的。
global關鍵字
當內部作用域想修改外部作用域的變量時,就要用到global和nonlocal關鍵字了,當修改的變量是在全局作用域(global作用域)上的,就要使用global先聲明一下。
nonlocal關鍵字
global關鍵字聲明的變量必須在全局作用域上,不能嵌套作用域上,當要修改嵌套作用域(enclosing作用域,外層非全局作用域)中的變量怎么辦呢,這時就需要nonlocal關鍵字了。
小結變量查找順序:LEGB,作用域局部>外層作用域>當前模塊中的全局>python內置作用域;
只有模塊、類、及函數才能引入新作用域;
對于一個變量,內部作用域先聲明就會覆蓋外部變量,不聲明直接使用,就會使用外部作用域的變量;
內部作用域要修改外部作用域變量的值時,全局變量要使用global關鍵字,嵌套作用域變量要使用nonlocal關鍵字。nonlocal是python3新增的關鍵字,有了這個 關鍵字,就能完美的實現閉包了。
遞歸函數
定義:在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞歸函數。
實踐1-階乘def factorial(n):
result=n
for i in range(1,n):
result*=i
return result
print(factorial(4))
def factorial_new(n):
if n==1:
return 1
return n*factorial_new(n-1)
print(factorial_new(3))
實踐2-斐波那契數列def fibo(n):
before=0
after=1
for i in range(n-1):
ret=before+after
before=after
after=ret
return ret
print(fibo(3))
def fibo_new(n):
if n <= 1:
return n
return(fibo_new(n-1) + fibo_new(n-2))
print(fibo_new(3))
1
print(fibo_new(30000))
maximum recursion depth exceeded in comparison
遞歸函數的優點:
是定義簡單,邏輯清晰。
理論上,所有的遞歸函數都可以寫成循環的方式,但循環的邏輯不如遞歸清晰。
遞歸特性:
必須有一個明確的結束條件
每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
遞歸效率不高,遞歸層次過多會導致棧溢出(在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由于棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出。)
內置函數
重要的內置函數filter(function, sequence)
map(function, sequence)
reduce(function, sequence, starting_value)
lambda
函數式編程
定義
函數式編程是一種編程范式,我們常見的編程范式有命令式編程(Imperative programming),函數式編程,常見的面向對象編程是也是一種命令式編程。
命令式編程是面向計算機硬件的抽象,有變量(對應著存儲單元),賦值語句(獲取,存儲指令),表達式(內存引用和算術運算)和控制語句(跳轉指令),一句話,命令式程序就是一個馮諾依曼機的指令序列。
而函數式編程是面向數學的抽象,將計算描述為一種表達式求值,一句話,函數式程序就是一個表達式。
函數式編程的本質
函數式編程中的函數這個術語不是指計算機中的函數,而是指數學中的函數,即自變量的映射。也就是說一個函數的值僅決定于函數參數的值,不依賴其他狀態。比如y=x*x函數計算x的平方根,只要x的平方,不論什么時候調用,調用幾次,值都是不變的。
純函數式編程語言中的變量也不是命令式編程語言中的變量,即存儲狀態的單元,而是代數中的變量,即一個值的名稱。變量的值是不可變的(immutable),也就是說不允許像命令式編程語言中那樣多次給一個變量賦值。比如說在命令式編程語言我們寫“x = x + 1”,這依賴可變狀態的事實,拿給程序員看說是對的,但拿給數學家看,卻被認為這個等式為假。
函數式語言的如條件語句,循環語句也不是命令式編程語言中的控制語句,而是函數的語法糖,比如在Scala語言中,if else不是語句而是三元運算符,是有返回值的。
嚴格意義上的函數式編程意味著不使用可變的變量,賦值,循環和其他命令式控制結構進行編程。
函數式編程關心數據的映射,命令式編程關心解決問題的步驟,這也是為什么“函數式編程”叫做“函數式編程”。
函數式編程的優點代碼簡潔
無副作用
由于命令式編程語言也可以通過類似函數指針的方式來實現高階函數,函數式的最主要的好處主要是不可變性帶來的。沒有可變的狀態,函數就是引用透明(Referential transparency)的和沒有副作用(No Side Effect)。
實踐1-求列表中的正數的平均值nums = [2, -5, 9, -7, 2, 5, 4, -1, 0, -3, 8]
num_lt_0 = list(filter(lambda x: x>0, nums))
avg_num = sum(num_lt_0) / len(num_lt_0)
實踐2-求階乘from functools import reduce
print (reduce(lambda x,y: x*y, range(1,6)))
總結
以上是生活随笔為你收集整理的在python子程序中、使用关键字_Python 的控制和函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python处理时间和日期_使用Pyth
- 下一篇: hook java_Java 实现 Ho