1. 程式人生 > >python初學一(函式與生成器一)

python初學一(函式與生成器一)

一、函式的基本知識:

                      理解:封裝重複程式碼塊的某種規則,實現一個功能。

    1、函式的定義:

                     

                      

               注意:

                  (1)函式程式碼塊以 def 關鍵詞開頭,後接函式識別符號名稱和圓括號()

                  (2)任何傳入引數和自變數必須放在圓括號中間。

                  (3)函式的第一行語句可以選擇性地使用文件字串

---用於存放函式說明

                  (4)函式內容以冒號起始,並且縮排

2、函式的呼叫:

                 函式名() 表示執行  而  print(函式名())表示列印return值。

def func():                    # 注意 print列印的 是返回值
    print('內部列印')
    return '返回值'
a = func            # 函式 是一種特殊的    資料型別  ,函式名可以賦值。
print(func())
print(a())

                                            

二、函式的返回值return:

                      

def func(x,y,z):
    return x,y,z    
print(func(1,2,3))      結果 (1,2,3)   print列印時轉化為  元組
a,b,c = func(1,2,3)     a = 1,b=2,c=3

三、函式的引數:

                   函式引數有四種:位置引數、關鍵字引數、預設引數、不定長引數組。

     1、位置引數:

                  
def name(username,age):           #形參:佔位的作用,並沒有實際的含義
    print('hello,%s,%s歲'%(username,age))
                          #  位置引數  函式,形參和實參的位置要一一對應了,個數要相同
name('小紅',10)
name('小明',20)           

      2、關鍵字引數:

def name(username,age):           #形參:佔位的作用,並沒有實際的含義
    print('hello,%s,%s歲'%(username,age))
                          #  關鍵字引數  函式,形參和實參的個數要相同,位置無需一一對應。
name(username = '小紅',age = 10)
name(age = 10,username = '小紅')

      3、預設引數:

def name(username,age = 20):           #形參:佔位的作用,並沒有實際的含義
    print('hello,%s,%s歲'%(username,age))
                          #  預設引數  函式,不傳值時輸入 預設值
name(username = '小紅')
name(age = 10,username = '小紅')

     4、不定長引數組:

def func1(a,b,c,*args,**kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)
    print(*args)
    # print(**kwargs)                               #    無效報錯
func1(1,2,3,4,5,6,name = 'liu',age = 22)      p

func1(1,2,3,*(4,5,6),name = 'liu',age = 22)

                                 

四、yield(會暫停的return)將函式轉化為生成器:

      1、yiled的概念:

                  yield 的作用就是把一個函式變成一個generator生成器(特殊的迭代器,且只能迭代一次。),帶有 yield 的函式

                  不再是一個普通函式,Python 直譯器會將其視為一個生成器,return 一個iterable的物件

               

      2、遍歷生成器的方法():

                       ①系統函式next()、迭代物件內部方法  . —next—()、for迴圈遍歷、內部方法send(值)

                                   yield  >> 生成器 (特殊的迭代器)
def Xun(max):
    n=0
    b=1
    while n < max:
        yield b
        b+=1
        n = n + 1
 print(Xun(5)) 
    
      //  <generator object Xun at 0x000001984A207BA0>   可以迭代,且迭代一次

a = Xun(5)                  變數的目的是為了儲存迭代位置

                  生成器:        遍歷方法1:系統函式next()方法,一個一次。

print(next(a))   1                 print(next(Xun(5))  1                   
print(next(a))   2                 print(next(Xun(5))  1
print(next(a))   3      與         print(next(Xun(5))  1        注意這兩者的區別。
print(next(a))   4                 print(next(Xun(5))  1  
print(next(a))   5                 print(next(Xun(5))  1   
                                  遍歷方法2:
print(a.__next__())            
print(a.__next__())             next() 系統函式
print(a.__next__())             iterable.__next__()  迭代物件內部函式 ,一個一次
print(a.__next__())
print(a.__next__())                                                                               
                                  
                               自動迭代 使用for 遍歷所有

for i in Xun(5):
    print(i)

       3、 生成器 yield 執行過程:

               ① 過程:

            

                    如下:

                        

           ② 生成器物件內部方法: . send(值) 、 . __next__() :

 

               如下:

1、
def f():
    print('start')
    a = yield 1
    print(a)
    print('middle....')
    b = yield 2  # 2這個值只是迭代值,呼叫next時候返回的值
    print(b)
    print('next')
    c = yield 3
    print(c)

a = f()
print(next(a))        結果 : start  1
print(next(a))         結果 : start 1     None middle  2
print(next(a))
print(next(a))          結果:報錯,超過範圍。



a = f()
print(a.send('msg'))     結果 : start  1             
print(a.send('msg1'))   結果 : start  1    msg middle  2     
print(next(a)) 

2、
def myGen():
    v1=yield 1
    v2=yield 9
gen=myGen()
print(next(gen))             結果 1
print(gen.send(8))            結果 9

五、生成器中send(值)的用法: 

              1、特性:

                              (1)send(值)一次   相當於   next()一次   並傳一個值,不同的是next()是系統方法,send是迭代器內部方法:  iterable.send(值)。

             2、例項:

                          本章節 第四章程式碼。

六、函式傳參中的可變物件與不可變物件:

    ①可變型別資料與不可變資料型別回顧:

          1、在 python 中,strings, tuples, numbers 是不可更改的物件,而 list,dict,set則是可以修改的物件。          

          2、不可變型別:變數賦值 a=5 後再賦值 a=10,這裡實際是新生成一個 int 值物件 10,再讓 a 指向它,而 5 被丟棄,不是改變a的值,相當於新生成了a

          3、可變型別:變數賦值 la=[1,2,3,4] 後再賦值 la[2]=5 則是將 list la 的第三個元素值更改,本身la沒有動,只是其內部的一部分值被修改了,記憶體地址沒有改變。由於可變資料型別的這個特性,誕生的copy模組中的 深淺拷貝 來保證list修改後 原list 不改變。

    ②可變型別資料與不可變資料型別函式傳參:

                                

七、返回值return:

              1、特點:

                           (1)函式執行後會得到返回值,沒有print不會展示到使用者介面,可以作為其他函式的引數使用。

                           (2)函式沒有return語句時預設返回 None。

                           (3)return可以返回可以理解為  print()語句 去掉  print  和(),因此return可以返回多個值,用 “,”隔開。

             2、例項:

def func(x,y):
    return x,y
print(func(1,2))        結果:       (1,2)  》》 元組        

 

           詳細見函式二