05 函式

jhchena發表於2024-09-28

函式

- 基礎:定義、引數、返回值
- 進階:
	- 預設引數如果是可變型別 : {}	[] 集合	內部元素可以被修改的型別  有坑,不建議使用
    - 作用域 
	    py:
            if 1==1:
                name = 'test'
            
            # 等於: test 沒有問題
            print name 
            
            for i in range(10):
                pass
            
            #此時外面是可以使用i,此時值為: 9
            print(i) 
		java:
            if (1==1){
                String name = 'test';
                
                #可以列印,java 作用域 以 {為分界線}
                system.out.println(name); 
            }
            
            #執行會報錯,不允許 
            system.out.println(name);
	- 閉包
    - 裝飾器 @+巢狀的函式  -> 目的,不修改原函式內容的前提下,在函式的執行前後自定義操作
    
- 內建函式
	sum/abs/hex/int/oct/bin/chr/ord/len/rang/id(比較記憶體地址) ....
    open -> 檔案操作  ,操作模式有: r (只讀) w(只寫,會將原有資料清空)  a(追加) rb	wb	ab  b 表示得到的是原始的2進位制資料

- 生成器函式  (編碼中不常用,原始碼常使用)
	- 表象:如果函式中出現了yield關鍵字,就是生成器函式
    - 意義: 節省記憶體
    	- 建立 1~100000 數字時,	-> 如果直接在記憶體建立,佔用內容太大
        - 建立 1~100000 數字時,  ->yield使用過程中,邊使用邊建立
    
        # 傳統函式
        def info():
            v1 = 100
            v2 = 200
            return v1, v2

        # 定義的函式不會執行,只有呼叫時才會執行 ,函式名後面加 () 表示呼叫
        ret = info()  
        print(ret)


        # 1、生成器函式
        def info():
            v1 = 100
            yield v1 + 10
            v2 = 200
            yield v2 + 10
            return v1 + v2


        # 2、執行生成器函式,就不會執行函式內部的程式碼,V1=100, v2=200 return 都不會執行,而是直接返回一個生成器物件
        ret = info()  #
        # 此時ret 為 generator object物件

        # 3、透過next  + 生成器物件,執行函式中的程式碼
        # 此時會進入函式內部,先執行v1= 100,然後執行 yield v1 +10 ,一旦執行完yield 表示當前執行已經結束了,
        # 當前執行狀態進行凍結,會將後續 yield後續的內容返回
        vaule = next(ret)  
        
		# 此時vaule的值為:110
        print(vaule)  

        #在次執行next,會接著上次凍結的狀態,繼續往後面走,執行:    yield v2 + 10

        vaule = next(ret)
        
        # 此時vaule的值為:210
        print(vaule)   
        # 4、執行完畢後,在次執行 next(ret) ,會報錯提示:stopIteration:  表示當前這個生成器執行完了
        vaule = next(ret)
        # 報錯StopIteration: 300
        print(vaule)   

        # 解決:會報錯提示:stopIteration 報錯方法
        def info():
            v1 = 100
            yield v1 + 10
            v2 = 200
            yield v2 + 10
            return v1 + v2
        
        #ret生成器物件
        ret = info()  
        for item in ret:
            print(item)


    

相關文章