本文和大家分享的主要是python
函數(shù)及函數(shù)式編程相關(guān)內(nèi)容,一起來看看吧,希望對大家
學習python有所幫助。
函數(shù)基本語法及特性
定義
數(shù)學函數(shù)定義:
一般的,在一個變化過程中,如果有兩個變量
x
和
y
,并且對于
x
的每一 個確定的值,
y
都有唯一確定的值與其對應(yīng),那么我們就把
x
稱為自變量,把
y
稱為因變 量,
y
是
x
的函數(shù)。自變量
x
的取值范圍叫做這個函數(shù)的定義域。
但編程中的「函數(shù)」概念,與數(shù)學中的函數(shù)是有很
同的
函數(shù)是邏輯結(jié)構(gòu)化和過程化的一種編程方法
函數(shù)的優(yōu)點
·
減少重復(fù)代碼
·
使程序變的可擴展
·
使程序變得易維護
函數(shù)與過程
·
定義函數(shù)
def
fun1(): #
函數(shù)名稱
"The function decription" print("in the func1")
return 0 #
返回值
·
定義過程
def
fun2():"The progress decription"
print("in the func2")
·
函數(shù)與過程 過程就是沒有返回值的函數(shù) 但是在
python
中,過程會隱式默認返回
none
,所以在
python
中即便是過程也可以算作函數(shù)。
def
fun1():
"The function decription"
print("in the func1")
return 0
def
fun2():
"The progress decription"
print("in the func2")
x=fun1()
y=fun2()
print("from func1 return is %s" %x)
print("from func2 return is %s" %y)
結(jié)果為:
in the func1
in the func2
from func1
return
is 0
from func2
return
is
None
返回值
要想獲取函數(shù)的執(zhí)
結(jié)果,就可以 return
語 把結(jié)果返回。
1.
函數(shù)在執(zhí)
過程中只要遇到return
語 ,就會停 執(zhí) 并返回結(jié)果,所以也可以 解為
return
語 代表著函數(shù)的結(jié)束,如果未在函數(shù)中指定
return,
那這個函數(shù)的返回值為
None
。
2.
3.
接受返回值
4.
賦予變量,例如:
5.
def
test():
print('in the test')
return 0
x=test()
1.
返回什么樣的變量值
return
個數(shù)沒有固定,
return
的類型沒有固定。 例如:
def
test1():
print('in the test1')
def
test2():
print('in the test2')
return 0
def
test3():
print('in the test3')
return 1,'hello',['alex','wupeiqi'],{'name':'alex'}
def
test4():
print('in the test4')
return test2
x=test1()
y=test2()
z=test3()
u=test4()
print(x)
print(y)
print(z)
print(u)
結(jié)果是:
in the test1
in the test2
in the test3
in the test4
None
0
(1, 'hello', ['alex', 'wupeiqi'], {'name': 'alex'})
<
function test2 at 0x102439488>
·
返回值數(shù)
=0:
返回
None
沒有
return
·
返回值數(shù)
=1:
返回
object return
一個值,
python
基本所有的數(shù)據(jù)類型都是對象。
·
返回值數(shù)
>1:
返回
tuple
,
return
多個值。
·
返回可以返回函數(shù)
:return test2
會將
test2
的內(nèi)存地址返回。
1.
為什么要有返回值
?
想要整個函數(shù)執(zhí)行的結(jié)果。
可能對執(zhí)行結(jié)果進行相關(guān)操作。
比如登陸,返回true
接下來就可以進行其他操作。 如果是
false
則不給操作。
函數(shù)參數(shù)
形參和實參定義
·
形參
形式參數(shù),不是實際存在,是虛擬變量。在定義函數(shù)和函數(shù)體的時候使用形參,目的是在函數(shù)調(diào)用時接收實參(
形參個數(shù),類型應(yīng)與實參一一對應(yīng)
)
。
變量只有在被調(diào)時才分配內(nèi)存單元
·
實參
實際參數(shù),調(diào)用函數(shù)時傳給函數(shù)的參數(shù),可以是常量、變量、表達式、函數(shù)等,無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須有確定的值,以
把這些值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入
等辦法使參數(shù)獲得確定值。
·
區(qū)別
形參是虛擬的,不占用內(nèi)存空間.
形參變量只有在被調(diào)用時才分配內(nèi)存單元,,在調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元。因此,形參只在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后,則不能再使該形參變量。
實參是一個變量,占用內(nèi)存空間,數(shù)據(jù)傳送單向,實參傳給形參,不能形參傳給實參。
def
calc(x,y): #x,y
為形參
res = x**y
return res
c = calc(a,b) #a,b
為實參
print(c)
def
test(x,y): #x,y
為形參
print(x)
print(y)
x=1 #x
為實參
y=2 #y
為實參
test(x=x,y=y) #
等號左邊
x,y
為形參,等號右邊
x,y
為實參,引用不分順序,按關(guān)鍵字引用。
默認參數(shù)
定義函數(shù)的時候,還可以有默認參數(shù)。
函數(shù)的默認參數(shù)的作用是簡化調(diào)用,你只需要把必須的參數(shù)傳進去。但是在需要的時候,又可以傳入額外的參數(shù)來覆蓋默認參數(shù)值。
#
定義一個計算
x
的
N
次方的函數(shù)
,
默認是
2
次方
def
test6(x,n=2):
s=1
while n>0:
n=n-1
s=s*x
print(s)
return s
test6(2)
默認參數(shù)只能定義在必需參數(shù)的后面.
可變參數(shù)
如果想讓一個函數(shù)能接受任意個參數(shù),我們就可以定義一個可變參數(shù):
def
fn(*args):
print args
可變參數(shù)的名字前面有個 *
號,我們可以傳入
0
個、
1
個或多個參數(shù)給可變參數(shù):
Python
解釋器會把傳入的一組參數(shù)組裝成一個
tuple
傳遞給可變參數(shù),因此,在函數(shù)內(nèi)部,直接把變量
args
看成一個
tuple
就好了。
定義可變參數(shù)的目的也是為了簡化調(diào)用。假設(shè)我們要計算任意個數(shù)的平均值,就可以定義一個可變參數(shù):
def
average(*args):
...
這樣,在調(diào)用的時候,可以這樣寫:
>>> average()0>>> average(1, 2)1.5>>> average(1, 2, 2, 3, 4)2.4
位置參數(shù)和關(guān)鍵字
位置參數(shù)調(diào)用:實參與形參位置一一對應(yīng);
關(guān)鍵參數(shù)調(diào)用
:
位置無需固定。
正常情況下,給函數(shù)傳參數(shù)要按順序,如果不按順序就可以用關(guān)鍵參數(shù)調(diào)用,只需指定參數(shù)名即可,但關(guān)鍵參數(shù)必須放在位置參數(shù)之后。
def
test5(u,v,w):
print(u)
print(v)
print(w)
test5(3,w=2,v=6)
函數(shù)調(diào)用
Python
內(nèi)置了很多有用的函數(shù),我們可以直接調(diào)用。
要調(diào)用一個函數(shù),需要知道函數(shù)的名稱和參數(shù),比如求絕對值的函數(shù) abs
,它接收一個參數(shù)。
調(diào)用 abs
函數(shù):
>>> abs(-21)21
調(diào)用函數(shù)的時候,如果傳入的參數(shù)數(shù)量不對,會報TypeError
的錯誤,并且
Python
會明確地告訴你:
abs()
有且僅有
1
個參數(shù),但給出了兩個:
>>> abs(21,8)
Traceback (most recent
call
last):
File "/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py", line 67, in
abs(21,8)
TypeError: abs() takes exactly one
argument (2 given)
如果傳入的參數(shù)數(shù)量是對的,但參數(shù)類型不能被函數(shù)所接受,也會報TypeError
的錯誤,并且給出錯誤信息:
str
是錯誤的參數(shù)類型:
>>> abs('a')
Traceback (most recent
call
last):
File "/Users/cathy/PycharmProjects/p51cto/day3/func_test3.py", line 69, in
abs('a')
TypeError:
bad operand type
for abs(): 'str'
遞歸函數(shù)
在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù)。如果一個函數(shù)在內(nèi)部調(diào)用自身本身,這個函數(shù)就是遞歸函數(shù)。
舉個例子,我們來計算階乘 n! = 1 * 2 * 3 * ... * n
,用函數(shù)
fact(n)
表示:
def
fact(n):
if n==1:
return 1
return n * fact(n - 1)
遞歸函數(shù)的優(yōu)點是定義簡單,邏輯清晰。理論上,所有的遞歸函數(shù)都可以寫成循環(huán)的方式,但循環(huán)的邏輯不如遞歸清晰。
嵌套函數(shù)
python
允許在定義函數(shù)的時候,其函數(shù)體內(nèi)又包含另外一個函數(shù)的完整定義。
name = "test1"
def
changeout():
name = "test2"
def
changeinner():
name = "test3"
print("changeinner
賦值打印
", name)
changeinner() #
調(diào)用內(nèi)層函數(shù)
print("
外層調(diào)用內(nèi)層打印
", name)
changeout()
print("
調(diào)用外層打印
", name)
內(nèi)部函數(shù)可以訪問其外部函數(shù)的作用域,但是外部函數(shù)不能訪問內(nèi)部函數(shù)的作用域。
def change1(name):
匿名函數(shù)
匿名函數(shù)就是不需要顯式的指定函數(shù)
#
這段代碼
def calc(n): return n**n print(calc(10))
#
換成匿名函數(shù)
calc = lambda n:n**n print(calc(10))
函數(shù)式編程
單說,"
函數(shù)式編程
"
是一種
"
編程范式
"
(
programming paradigm
),也就是如何編寫程序的方法論。
主要思想是把運算過程盡量寫成一系列嵌套的函數(shù)調(diào)用。
來源:
博客園