1. 程式人生 > 實用技巧 >Python基礎12 列表的推導式

Python基礎12 列表的推導式

本來是和前面的列表內容一塊的

但是加起來程式碼太長,列表推導式就單獨拆分到了這裡來寫

PS:這是我學習過程中一面學一面嘗試的程式碼,嘗試內容很多,希望理解

  1 #列表推導式
  2 #這是個新的東西
  3 f=[];
  4 #我們先定義一個空列表
  5 #然後我們再寫推導的式子
  6 
  7 for x in range(10):
  8     if(x%2==0):
  9         f.append(x**2);
 10 print(f);
 11 #這樣的一段程式碼
 12 #我們就實現了將可以被2整除的資料全部平方然後逐個新增至列表
 13 #但是其實我們可以把它們簡化到List本身上去
14 15 g = [x**2 for x in range(10) if(x%2==0)]; 16 #List = 輸出表達式 迴圈部分 判斷語句 17 print(g); 18 #輸出結果是完全一樣的 19 #同理我們還能寫出不一樣的式子 20 21 h=[x**2 for x in range(50) if(x%2==0) if(x%5==0)]; 22 print(h); 23 #這裡我們嘗試後發現 24 #前面的是表示式, 25 #而在迴圈語句中可以做判定的巢狀 26 #這樣一來,可以做多個判斷
27 28 i=[x*y for y in range(10) for x in range(10) if(y==10) if(x==2)]; 29 print(i); 30 #而這裡的輸出結果就是空 31 #這是為什麼呢? 32 for y in range(10): 33 for x in range(10): 34 if(y==10): 35 if(x==2): 36 print(y*x); 37 #這段程式碼才是我們想要表達的意思 38 #這就這涉及到了for的運算規則了 39 #Python的for和C中間的是不一樣的
40 #y 和 x是作為迭代函數出現的 41 #那我們在for嵌套了for 的時候其實y的值是沒有發生傳遞的嗎? 42 #這只是一種猜想 43 #我們來驗證一下 44 45 for y in range(2): 46 print("第一個y=",y); 47 for x in range(2): 48 print("第二層y=",y); 49 #從輸出的結果來看顯然y的值是發生的傳遞的 50 #在for這個大迴圈沒做完之前y作為迭代變數還是存在的 51 52 for y in range(10): 53 for x in range(10): 54 if(y==10): 55 print("y==10啦!"); 56 if(x==2): 57 print("x==2啦!"); 58 print(y*x); 59 #我們將原來的程式碼改進了一下 60 #當y==10的時候就輸出 61 #來確保是真的y==10 62 #但是顯然沒有得出結果 63 64 #我們換個思路 65 #我們知道int這樣的數字資料型別是不能作為迭代變數的 66 #所以我們可以先測試一下迭代變數的資料型別 67 68 for y in range(3): 69 print("y的資料型別是",type(y)); 70 #我們發現y的資料型別還是int型 71 #那為什麼if()沒執行呢? 72 73 #通過監控變數x和y 74 #我們發現,其實range(x)是生成存在x元素的列表 75 #而且是從0開始的 76 #所以這裡的最大值是9 而不是x的10 77 78 for y in range(10): 79 for x in range(10): 80 if(y==9): 81 if(x==2): 82 print(y*x); 83 #所以這樣修改 84 #就會得到正確的輸出值 85 86 #我們對i清除元素後重新賦值一次 87 i.clear(); 88 i=[x*y for y in range(10) for x in range(10) if(y==9) if(x==2)]; 89 print(i); 90 #這次結果就和我們剛剛修改過的資料是一樣的 91 #那麼這個可不可以再修改一下呢? 92 93 ''' 94 for y in range(3): 95 print("y的值為",y); 96 for x in range(3): 97 print("x的值為",x); 98 if(y==2): 99 print("y==2啦!"); 100 if(x==2): 101 print("x==2啦!"); 102 print(y*x); 103 104 ''' 105 #將其修改成這個樣子 106 #我們對i清除元素後重新賦值一次 107 i.clear(); 108 #i=[print("x==2啦"); x*y for y in range(3) for x in range(3) if(y==2) if(x==2)]; 109 #這裡我們發現,在最後一層的表示式中,只能寫一個在最前面 110 #因為表示式是要賦值給List中的 111 112 #i=[ x*y for y in range(3) print("") for x in range(3) if(y==2) if(x==2)]; 113 #所以就算我們在這裡寫了,也是不可以輸出的 114 115 #那麼在這個List的運算中,是要為其內部賦值,自然不會讓你輸出東西 116 #但是對本來的變數進行操作時可以的 117 #那麼我們可以實現這些內容嗎 118 119 ''' 120 for y in range(3): 121 shuju=shuju+1; 122 for x in range(3): 123 shuju=shuju+1 124 if(y==2): 125 shuju=shuju+1; 126 if(x==2): 127 shuju=shuju+1; 128 y*x; 129 130 131 ''' 132 133 shuju=0; 134 #i=[ x*y for y in range(3) shuju+=1; for x in range(3) if(y==2) if(x==2)]; 135 #任然不行 136 #不能在for中間對其其進行操作 137 138 #i=[ x*y for y in range(3) for x in range(3) x=x+y; for z in range(2) if(y==2) if(x==2)]; 139 #即使是迭代變數內部的資料也不能在這裡寫改變 140 141 #print(i); 142 143 i=[ x*y for y in range(3) if(y==2) for x in range(3) if(y==2) if(x==2)]; 144 print(i); 145 #但是這裡我們發現 146 #卻可以在中間迴圈區域加上if的判斷語句 147 #我們在這裡加上判斷語句後 148 #程式的結構改變了 149 ''' 150 for y in range(3): 151 if(y==2): 152 for(x in range(3)) 153 ''' 154 #形成了這樣的結構 155 #這樣來講 156 #每一句話在這裡都是一層判斷 157 #是不存在一個迴圈或者判斷下寫多個語句的 158 159 i.clear(); 160 #i=[ x*y for y in range(3) while y<10: for x in range(3) if(y==2) if(x==2)]; 161 #從這裡看出while語句也是不可行的 162 163 164 #總結出來 165 #列表的推導可以寫多個巢狀和判斷 166 #在迴圈區可以寫多個迴圈 167 #在迴圈區還可以加上判斷 168 #在判斷區也可以寫多個判斷 169 #沒一句程式碼都是一層 170 #表示式只能寫一句話 171 #只能使用for和if