python3.x 基礎三:函數

1.OOP 面向對象編程,萬物皆對象,以class爲主,抽象化編程

2.POP 面向過程變成,萬事皆過程,def定義過程app

3.函數式編程,將某種功能封裝起來,用的時候直接調用函數名,def定義函數,也叫function/方法/過程/子程序函數式編程

 

函數定義:函數是指將一組語句的集合經過一個名字(函數名)封裝起來,要想執行這個函數,只須要調用其函數名便可 --Alex函數

特性:ui

  1. 減小重複代碼
  2. 使程序變得可擴展
  3. 使程序變得易維護

語法定義:spa

def 函數名():
    函數執行語句
  • 不帶參數的函數調用

 

>>> def func_name1():
...     print("hello world")
... 
>>> func_name1()
hello world

 

 

  • 帶1個參數的函數調用

 

>>> def func_name1(name):
...     print("my name is :",name)
... 
>>> func_name1('alex')
my name is : alex
>>> name = 'oldboy'
>>> func_name1(name)
my name is : oldboy
>>> 

 

 

  • 帶2個參數的函數調用
  • def定義函數的時候,括號裏面的變量叫形參,引用內存空間
  • 調用函數的時候,括號裏面的變量叫實參,內存數據
  • 形如(variable1,variable2),叫位置參數
  • 形如(variable1=value1,variable2=value2),叫關鍵字參數
  • 關鍵字參數必定要在位置參數後面
  • 沒特別指明,形參和實參必須一一對應,多一個少一個都報錯

 

>>> def func_name2(a,b):
...     c=a*b
...     print(c)
... 
>>> func_name2(2,3)
6
>>> x,y=5,5
>>> func_name2(x,y)
25
>>> func_name2(a=2,b=3)
6
>>> func_name2(a=2,5)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
>>> func_name2(2,b=5)
10
>>> func_name2(a=2,b=3,c=4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func_name2() got an unexpected keyword argument 'c'
>>> func_name2(a=2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func_name2() missing 1 required positional argument: 'b'
  • 函數返回值,遇到return語句將結束函數
>>> def with_return(a,b):
...     return(a * b)
...     return(a + b)
... 
>>> def without_return(a,b):
...     print(a*b)
...     print(a+b)
... 
>>> with_return(2,3)
6
>>> without_return(2,3)
6
5
>>> x=with_return(2,3)
>>> print(x)
6
>>> y= without_return(2,3)
6
5
>>> print(y)
None
>>> 

 

  • 全局變量與局部變量
    •   函數體外定義的變量稱爲全局變量,在函數體內也生效,前提是先定義全局變量,後定義函數
    •   函數體內定義的變量稱爲局部變量,只在當前函數體內生效
name,age = 'alex',18
print(name,age)
def func_name0():
    name = 'oldboy'
    age = 100
    print(name,age)
    print(age+1)
func_name0()
print(name,age)

alex 18
oldboy 100
101
alex 18
  • 非固定參數,當傳入的參數不肯定個數的時候
    • 非固定參數*args,傳入的參數變成元組,元組可爲空
    • 非固定參數**kwargs,傳入的參數變成字典,
    • *args與**kwargs可同時使用
>>> def func_name5(name,age,*args):
...     print(name,age,args)
... 
>>> func_name5('alex',18)
alex 18 ()
>>> func_name5('alex',18,'oldboy')
alex 18 ('oldboy',)
>>> func_name5('alex',18,'oldboy',100)
alex 18 ('oldboy', 100)
>>> func_name5('alex',18,'oldboy',100,[1,2])
alex 18 ('oldboy', 100, [1, 2])
>>> func_name5('alex',18,'oldboy',100,[1,2],{'key1':'v1','k2':'v2'})
alex 18 ('oldboy', 100, [1, 2], {'key1': 'v1', 'k2': 'v2'})
>>> def func_name6(name,age,**kwargs):
...     print(name,age,kwargs)
... 
>>> func_name6('alex',18)
alex 18 {}
>>> func_name6('alex',18,'oldboy')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func_name6() takes 2 positional arguments but 3 were given
>>> func_name6('alex',18,oldboy=100)
alex 18 {'oldboy': 100}
>>> func_name6('alex',18,oldboy=100,salary=1,address='beijing')
alex 18 {'address': 'beijing', 'salary': 1, 'oldboy': 100}
>>> def func_name7(name,age,*args,**kwargs):
...     print(name,age,args,kwargs)
... 
>>> func_name7('yzw',28,18,'man',address='guanghzou',mail='xxx@com.cn')
yzw 28 (18, 'man') {'address': 'guanghzou', 'mail': 'xxx@com.cn'}
>>> func_name7('zvy',18)
zvy 18 () {}
  • 嵌套函數,函數中調用函數,可是隻能調用同級的函數,不能隔級調用
  • 遞歸函數
    • 必須有一個明確的結束條件
    • 每遞歸一次,問題規模比上一次都應有減小
    • 效率不高,下面這個越到後面效率越低
>>> list1=[0,1]
>>> for i in range(2,10):
...     list1.append(list1[i-1]+list1[i-2])
... 
>>> print(list1)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> def func_fib(x):
...     if x == 0:
...             return 0
...     elif x == 1 or x == 2:
...             return 1
...     return func_fib(x-1)+func_fib(x-2)
... 
>>> func_fib(10)
55

 

 

  • 匿名函數--link:
  • 高階函數,變量指向函數,函數的參數能接收變量,那麼一個函數就能夠接收另外一個函數做爲參數,這種函數就稱之爲高階函數。
>>> def func_high(a,b,f):
...     return f(a),f(b)
... 
>>> num1=10
>>> str1='hello'
>>> func_high(num1,str1,id)
(10911456, 140199339463320)
相關文章
相關標籤/搜索