002第二部分 [函數 / 生成器]

函數:  

    函數是組織好的,可重複使用的,實現單一功能的代碼段

    函數有輸入(參數)和輸出(返回值)

    Python中,函數是一等對象(first class)

一.函數的定義與調用

  • 基本語法

def fn():
    pass
  • 帶函數的參數

def add(x, y):
    return x + y
  • 有賦值就創建新的變量

x = 1y = 2def swap(x, y):
    x, y = y, x

swap(x, y)
x
>1
y
>2
  • 通過list修改變量[因爲並沒有修改變量,所以將會返回append追加內容]

lst = [1, 2, 3]def append(item):lst.append(item)
append(4)
lst
[1, 2, 3, 4]

 二.位置參數和關鍵字參數:

    通過位置傳遞參數的叫位置參數

  • 位置參數和關鍵字參數

def add(x, y):
	print()
add(1, 2) 				//位置參數
add(x=1, y=2) 			//關鍵字參數
* 位置參數和關鍵字參數可以混合使用,但是關鍵字參數要在位置參數後面.否則會報錯SyntaxError python
add(1,y=2)

三.可變參數

    非默認非可變參數, 可變位置參數,可變關鍵字參數

     默認參數不要和可變參數放到一起

def print_info(x, y, *args, **kwargs):   //自動組裝成一個字典
    print(x)
    print(y)
    for x in args:
        print(x)
    for k, v in kwargs.items():
        print('{0} {1}'.format(k, v))
print_info(1, 2, 3, 4, 5, 6, name='roach',age=16)

x => 1
y => 2

可變參數爲(3, 4, 5, 6)

可變關鍵字參數爲:
name roach
age 16
  • 可變位置參數

def sum(lst):
    ret = 0
    for x in lst:
        ret += x
    return ret
sum([1, 2, 3, 4, 5])   //這裏需要傳入一個list

# 變成 可變參數
def sum(*args):     //自動組裝成一個元組
    ret = 0
    for x in args:
        ret += x
    return ret
sum(1, 2, 3, 4, 5)
  • 可變關鍵字參數:

def print_info(**kwargs):   //自動組裝成一個字典
    for k, v in kwargs.items():
        print('{0} {1}'.format(k, v))
print_info(name='roach',age=16)
> name roach
> age 16
  • 可變位置參數和可變關鍵字參數混合:

       可變參數函數在定義的時候,就決定了參數是位置參數還是關鍵字參數

def print_info(*args, **kwargs):   //自動組裝成一個字典
    for x in args:
        print(x)
    for k, v in kwargs.items():
        print('{0} {1}'.format(k, v))
print_info(name='roach',age=16)
> name roach
> age 16

四.參數解包 [重要]

a = [1, 2, 3]
b = {'a':1, 'b':2, 'c':3}
def fn(a, b, c):
    pass
fn(*a)(1)
fn(**b)(1)
fn(*[1, 2], **{'c':3})(3)

1.可以用 * 解包列表或者元組作爲位置參數

2.可以用**解包字典爲關鍵字參數

3.也可以混合使用,思考:fn([1, 2],*{'c':3, 'a':4})會怎麼樣?


例子1 - 列表[參數解包]:

lst = [1, 2]

def add(x, y):
    print(x)
    print(y)
add(*lst)      //參數解包

例子2 - 字典[參數解包]:

d = {'x':1, 'y':2}    
def add(x=1, y=3):  //key 要和非可變形參一一對應
    print(x)
    print(y)
add(**d)

五.默認參數:

默認參數的坑: 列表

當形參是可變類型的時候就會發生這種情況:

def fn(lst = []):
lst.append(1)
print(list)

解決辦法

def fn(lst = None):
if lst is None:
lst = []
lst.append(1)
print(list)

六.函數返回值:

可以通過type來查看函數的返回值;

函數默認return None;

def add():
	pass
type(add())

七.遞歸函數:

    函數體內條用自身的函數

    遞歸函數需要有合適的退出條件

    迭代都可以轉換成遞歸

    遞歸不一定可以轉化爲迭代

    python遞歸最大深度爲1000,且不支持尾遞歸優化

    python中應儘量避免使用遞歸

八.作用域與全局變量:

    作用域: 變量生效的範圍

    局部變量:在函數體內定義的變量, 局部變量作用域爲函數體

    

    輸出當前的全局變量和局部變量:

     print(globals())

    print(locals())

九.函數的調用過程:

def add(x, y):

def inc(x):
def main():
    x = 1
    y = 2
    ret = add(x, y)
    ret =inc(ret)
    print(ret)

十.生成器:

def iterator(x):
    i = 0
    while i < 5:
        yield i
        i += 1

def main():
    for i in iterator(5):
        print(i)
main()


1.先執行main函數.

2.執行到iterator 將main函數壓棧;執行iterator函數.

3.執行到yield,將 i = 0 放入main的命令空間,同時把iterator壓棧,暫停,調出main函數;

4.然後就重複1-3步驟,直到while條件不滿足,逐步退出函數;

def iterator():
    lst = [1, 2, 3, 4, 5]
    yield from lst

for x in iterator():
    print(x)


  • 通過生成器求積數:

def fn(x):
    ret = 1
    for i in range(1, x +1):
        ret *=i
        yield ret

for x in fn(5):  
    print(x)
1
2
6
24
120

it = fn(5)    
it.next()     //生成器可以生成可迭代對象;
              //遍歷到最後一個完後會返回,StopIteration;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章