1. 程式人生 > 實用技巧 >2.4函式

2.4函式

1.自定義函式

def szys(a,b,c):
if c == '求和':
d = a + b
elif c == '求乘積':
d = a * b
elif c == '求冪':
d = a ** b
else:
d = a - b
return d
a = int(input('請輸入a:\n'))
b = int(input('請輸入b:\n'))
c = input('請輸入c:\n')

print(szys(a,b,c))
請輸入a:
5
請輸入b:
4
請輸入c:
求冪
625

2.函式的引數

1)必備引數 以正確的順序傳入函式,呼叫時的數量必須和宣告時的一樣。

def move(x, y, step, angle=0):
nx = x + step + angle
ny = y - step - angle
return nx, ny
move(11,22)
---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

<ipython-input-7-0d9a8cf7bc14> in <module>()
----> 1 move(11,22)
TypeError: move() missing 1 required positional argument: 'step'

2)命名引數 用引數的命名確定傳入的引數值。可以跳過不傳的引數或者亂序傳參,因為Python直譯器能夠用引數名匹配引數值。

def tiktok(x, y, step, angle=0):
nx = x - step * angle
ny = y + step - angle
return nx, ny
tiktok(y=23,x=66,step=24)

(66, 47)

3)預設引數 呼叫函式時,預設引數的值如果沒有傳入,則被認為是預設值。

def facebook(x, y, step, angle=0):
    nx = x - step * angle
    ny = y + step - angle
    return nx, ny
facebook(y=23,x=66,step=24,angle=1)

(42, 46)

4)不定引數 如需一個函式能處理比當初宣告時更多的引數,這些引數叫做不定引數。

def buding(*bd):
    print(bd)
    
buding(1,2,3)
(1, 2, 3)

def tin(x,*yy):
    print(x)
    print(yy)
    
tin(1,2,3,4,5,6,7)
1
(2, 3, 4, 5, 6, 7)

def ceshi(**zd):
    print(zd)
    
ceshi(**{'mignzi':'bob','tizhong':'5公斤'})
{'mignzi': 'bob', 'tizhong': '5公斤'}

def ceshi(*zd):
    print(zd)
    
ceshi({'sd':'sa','sddd':'yhn'})
({'sd': 'sa', 'sddd': 'yhn'},)

3.全域性變數與區域性變數

1)區域性變數 函式內部的變數名,如果第一次出現,且出現在“=”前面,就被視為定義一個區域性變數。

shuzi = 100

def lizi():
    shuzi = 233
    print(shuzi)

lizi()
233

shuzi2 = 111

def fff():
    shuzi2 = shuzi2 + 1
    print(shuzi2)
    
fff()
---------------------------------------------------------------------------

UnboundLocalError                         Traceback (most recent call last)

<ipython-input-21-e4a46d02496b> in <module>()
      5     print(shuzi2)
      6 
----> 7 fff()
<ipython-input-21-e4a46d02496b> in fff()
      2 
      3 def fff():
----> 4     shuzi2 = shuzi2 + 1
      5     print(shuzi2)
      6 
UnboundLocalError: local variable 'shuzi2' referenced before assignment

2)全域性變數 函式內部的變數名,如果第一次出現,且出現在“=”後面,且該變數在全域性域中已定義, 則這裡將引用全域性變數。

shuzi3 = 45

def po():
    y = shuzi3 + 25
    print(y)
    
po()
70

lie = [1,2,31,44]

def lieb():
    lie.append(2333)
    print(lie)
    
lieb()
[1, 2, 31, 44, 2333]

4.匿名函式lambda

hanshu = lambda x,y : x if x<y else y

hanshu(4,2)

2

def qjxz(s,f):
    if s<f:
        return s
    else:
        return f
    
qjxz(4,2)

2

chengfa = lambda j,k : j*k
chengfa(4,6)

24

1)filter函式 用於指定過濾列表元素的條件

yanshi =[1,2,3,4,5,6,7,8,9]

fil = filter(lambda x : x%3==0,yanshi) 

list(fil) #filter函式返回的是一個數組,此時要用list

[3, 6, 9]

2)map函式 用於指定對列表中的每一個元素的共同操作

yanshi2 = [2,4,5,3,2,58,66,70]

ma = map(lambda t: t*2,yanshi2)

list(ma)

[4, 8, 10, 6, 4, 116, 132, 140]

5.遞迴函式

def digui(nn):
if nn == 1:
return 0
return nn * digui(nn-1) #--digui(4)

digui(5)

#現在要計算的是digui(5),把數值代入進去計算
#nn不等於1,5*digui(4).digui(4)等於多少呢?再次計算
#nn不等於1,5*4*digui(3).digui(3)等於多少呢?再次計算
#nn不等於1,5*4*3*digui(2).digui(2)等於多少呢?再次計算

0

5xdigui(4) 5x4xdigui(3) 5x4x3xdigui(2) 5x4x3x2x1

lmd_dg = lambda n:1 if n==0 else n * lmd_dg(n-1)

lmd_dg(5)

120