1. 程式人生 > 實用技巧 >Python基礎16 函式返回值 作用區域 生成器

Python基礎16 函式返回值 作用區域 生成器

  1 #函式
  2 
  3 #函式的返還值
  4 #返還值有三種形式,無返還值,單一返還值,多返還值
  5 
  6 #無返還值
  7 #有時我們呼叫一個函式只是完成一個過程或者某個動作
  8 #而不需要去設定返還值
  9 
 10 def no_return ():
 11     print("我不需要返還值哦");
 12 
 13 
 14 def no_return_2 ():
 15     print("寫個return就行了");
 16     return
 17     
 18 def no_return_3 ():
 19     print("return None
"); 20 return None 21 22 no_return(); 23 no_return_2(); 24 no_return_3(); 25 #這裡我們建立的這個函式就不需要返還值 26 #我們可以省略返還值,也可以只寫一個return 或者加上None 27 28 #單返還值 29 def one_return (): 30 i=54188; 31 return i 32 33 print(one_return()); 34 #這就通過return產生了返還值 35 36 #注意,return後面是不能加;的!!!!!(我開始就搞錯了)
37 38 #多返還值 39 #一般採用元組返還的方法,因為元組是不可以變的,比較安全 40 41 def tuple_return(): 42 Q1="哈噻!" 43 Q2="哈噻!" 44 Q3="hasaki!" 45 return (Q1,Q2,Q3) 46 47 print(tuple_return()[0]) 48 #這裡我們就把這個返還值送了出來,而且他是穩定的 49 #而且這裡開可以進行[]的索引 50 #我們也可以遍歷元組 51 52 for i in tuple_return(): 53 print
(i) 54 #也是可以直接使用的 55 56 def tuple_return(): 57 Q1="哈噻!" 58 Q2="哈噻!" 59 Q3="hasaki!" 60 return Q1+Q2+Q3 61 62 print(tuple_return()) 63 #如果是字串的話還可直接加起來輸出 64 #return後面是可以寫運算的 65 #但是這樣子就是去意義了,還是元組會更好 66 67 def tuple_return(): 68 Q1="哈噻!" 69 Q2="哈噻!" 70 Q3="hasaki!" 71 return [Q1,Q2,Q3] 72 print(tuple_return()) 73 #既然元組可以,那列表也是一定可以的 74 75 def tuple_return(): 76 Q1="哈噻!" 77 Q2="哈噻!" 78 Q3="hasaki!" 79 return {Q1,Q2,Q3} 80 print(tuple_return()) 81 #但是集合有點不一樣了 82 #首先集合是一個無序不重複的結構 83 #所以我們這裡儲存來的Q1和Q2是重複的 84 #只會保留一個 85 86 #字典就算了吧,還要在裡面構成字典的結構,麻煩得很,,, 87 88 print("////////////////////////////") 89 90 #函式的區域性變數和全域性變數問題 91 92 test = 100; 93 def hanshu_0 (): 94 print("區域性變數test={0}".format(test)) 95 print("全域性變數test={0}".format(test)) 96 hanshu_0() 97 #這裡函式中直接呼叫的test是全域性變數的test,也就是這個模組中可以隨便使用 98 #區域性變數就只能在設定的範圍內起作用 99 #例如在函式中設定的變數就只能在函式中起作用 100 101 def hanshu_1 (): 102 test="不是100了哦!我現在是字串了!" 103 print("區域性變數test={0}".format(test)) 104 print("全域性變數test={0}".format(test)) 105 hanshu_1() 106 #這裡就讓起作用的是區域性變量了 107 #正所謂 108 #翔龍鬥不過地頭蛇 109 #在同時存在同名變數時,優先滿足區域性變數 110 111 test_2="測試是否改動了我" 112 def hanshu_2 (): 113 global test 114 # global test_2 = "改變!" 115 print("區域性變數test={0}".format(test)) 116 print("全域性變數test={0}".format(test)) 117 hanshu_2() 118 #這裡使用的就不再時區域性變數 119 #我們再test前面聲明瞭gobal表明了這裡test時呼叫的時全域性變數 120 #同時我們發現global 變數 不能直接在函式中被改變 121 122 print('////////////////////////////') 123 124 #生成器 125 #新東西 126 #函式中間,我們一般使用return返還資料 127 #但是有時候我們可以使用yield關鍵字函式返回一個生成器(generator)物件 128 #生成器物件是可迭代物件 129 130 def fang(num): 131 for i in range(1,num+1): 132 yield i*i 133 134 for j in fang(5): 135 print(j) 136 #這裡我們就生成了從1到5的數的平方 137 #而這裡yield返還的值是一個一個可迭代的資料 138 139 #我們來驗證一下 140 print(type(fang(1))) 141 #這裡我們看到,這裡生成的型別是generator生成器型別的 142 print(fang(5)) 143 #<generator object fang at 0x0000024D4721CF20> 144 #返還的是這樣的資料 145 #我們除了可以使用for來呼叫還可以使用next來呼叫 146 #(但是不推薦,畢竟用for會更可靠也不用擔心丟擲錯誤) 147 print(next(fang(5))) 148 #他會就生成下一個的資料 149 #但是如果我們一直向下寫呢? 150 print(next(fang(5))) 151 print(next(fang(5))) 152 print(next(fang(5))) 153 print(next(fang(5))) 154 #結果全都是1 155 #而沒有向後面推 156 #這是因為這裡生成器雖然建立了,但是每一次我們都是先呼叫函式 157 #這就導致了每一次都是重新建立並儲存的資料 158 159 160 generator_0=(i*i for i in range(5)) 161 for j in generator_0: 162 print("生成器資料",j) 163 164 #這樣我們就建立了一個生成器的資料 165 #它類似於列表的形式 166 #但是它比列表更簡單,節省了記憶體空間 167 #而這樣建立的資料,就可以用next一直向後推了 168 169 #print(next(generator_0)) 170 #但是這裡卻直接異常丟擲了 171 #StopIteration 172 #原因是我們上面的for迴圈將generator中的資料遍歷到了最後面 173 #所以我們再在這裡使用next就直接超過了原有的資料列 174 #就會報錯 175 176 #這個時候我們就要重置一下生成器了 177 #有三種方法 178 #第一種直接讓生成程式碼重新執行 179 #第二種則是在生成這些程式碼的時候就建立資料的第二個版本 180 #這裡我們就要使用itertool.tee 181 182 import itertools 183 generator_1=(i*i for i in range(5)) 184 yy,yyy = itertools.tee(generator_1) 185 for i in yy: 186 print("yy",i) 187 for j in yyy: 188 print("yyy",j) 189 #這樣我們就通過itertools模組中的tee來給為generator建立了兩個副本 190 #yy和yyy就已經和generator_1沒有什麼不同了 191 #但是它存在的型別卻發生了變化 192 print(type(yy)) 193 #這裡的型別是itertools. 194 195 #第三種方法就是轉存,將資料轉存到其他變數中儲存下來 196 #然後就可以使用__next__()方法來操作了 197 198 199 def fang_2(num): 200 for i in range(1,num+1): 201 yield i*i 202 ccc=fang_2(5) 203 #這樣ccc就儲存了generator的值 204 #這裡就可以使用到__next__()方法 205 print(ccc.__next__()) 206 print(ccc.__next__()) 207 print(ccc.__next__()) 208 print(ccc.__next__()) 209 print(ccc.__next__()) 210 #這樣就可以實現生成器資料的傳輸與訪問