2017-03-09 143 views
1

如何縮短for循環中的所有if語句?我正在開發這個大學項目。我想不出一個辦法。如何縮短很多if語句? (Python 3.x)

基本上它應該做的事情是,如果板上的某個位置不等於一塊岩石,那麼將其設置爲植物。這些地點是工廠周圍的一個圓圈。例如:

N N N
N P N
N N N

if RainFall == 2: 
    print("This summer has been a perfect summer, the plants have multiplied.") 
    for Row in range(FIELDLENGTH): 
     for Column in range(FIELDWIDTH): 
      if Field[Row][Column] == PLANT: 
       if Field[Row + 1][Column] != ROCKS: 
        Field[Row + 1][Column] = GOODSUMMER 
       if Field[Row - 1][Column] != ROCKS: 
        Field[Row - 1][Column] = GOODSUMMER 
       if Field[Row + 1][Column + 1] != ROCKS: 
        Field[Row + 1][Column + 1] = GOODSUMMER 
       if Field[Row - 1][Column - 1] != ROCKS: 
        Field[Row - 1][Column - 1] = GOODSUMMER 
       if Field[Row][Column + 1] != ROCKS: 
        Field[Row][Column + 1] = GOODSUMMER 
       if Field[Row][Column - 1] != ROCKS: 
        Field[Row][Column - 1] = GOODSUMMER 
       if Field[Row + 1][Column + 1] != ROCKS: 
        Field[Row + 1][Column - 1] = GOODSUMMER 
       if Field[Row - 1][Column + 1] != ROCKS: 
        Field[Row - 1][Column + 1] = GOODSUMMER 
       break 
+1

很多方法。但是你想以一種能夠幫助你在以後開發它的方式推廣它。一個想法是有一個方法來評估一個正方形,併爲它周圍的所有方塊調用一次。像這種乞求面向對象編程的東西。 –

+0

我不是一個Python人,但在OOP中,有這種情況的命令模式。挖後:http://stackoverflow.com/a/1494532/5058677 – Rumid

回答

2

呀,把你的指數排列在列表中,並遍歷這一點。你可以明確地定義列表(對於初學者更易讀,但更容易出錯)或者通過理解來生成列表。明確的版本第一:

coord_shift = [(1, 0), (-1, 0), (1, 1), (-1, -1), (0, 1), (0, -1), (1, -1), (-1, 1)] 
for Row in range(FIELDLENGTH): 
    for Column in range(FIELDWIDTH): 
     if Field[Row][Column] == PLANT: 
      for i, j in coord_shift: 
       if Field[Row + i][Column + j] != ROCKS: 
        Field[Row + i][Column + j] = GOODSUMMER 

一些其他注意事項:

推薦Python的風格是使用小寫的變量名定期變量,大寫的人更意味着類。

你不需要休息。

以上顯示了您的小錯誤Field[Row +1][Column -1]

喜歡冒險的版本,我答應是:

coord_shift = [(i, j) for i in range(-1, 2) for j in range (-1, 2)] 
coord_shift.drop((0, 0)) 
1

我們只能猜測你的代碼的其餘部分,所以包含向下跌破是用於測試的全面實施。要查看您的重做代碼,請查看multiply_plants函數。它不是擁有許多語句,而是使用循環來檢查單元周圍的區域。您可能還會注意到,它正確地檢查每個列表的範圍,以便不會發生異常。

#! /usr/bin/env python3 
import random 


FIELD_ROWS = 10 
FIELD_COLUMNS = 10 
EMPTY = ' ' 
PLANT = 'P' 
ROCKS = 'R' 
NEW_PLANT = 'N' 


def main(): 
    field = create_field() 
    show_field(field) 
    multiply_plants(field, 2) 
    replace_cells(field, NEW_PLANT, PLANT) 
    show_field(field) 


def create_field(): 
    field = [] 
    for _ in range(FIELD_ROWS): 
     row = [] 
     for _ in range(FIELD_COLUMNS): 
      row.append(random.choice([EMPTY] * 3 + [ROCKS] * 2 + [PLANT] * 1)) 
     field.append(row) 
    return field 


def show_field(field): 
    width = max(map(len, field)) * 2 + 1 
    print(f'/{"-" * width}\\') 
    print('\n'.join(' '.join(['|'] + row + ['|']) for row in field)) 
    print(f'\\{"-" * width}/') 


def multiply_plants(field, rainfall): 
    # If there was enough rain, cause the plants to spread. 
    if rainfall > 1: 
     print('This summer has been a perfect summer;') 
     print('the plants have multiplied!') 
     # Find each space that already has a plant in it. 
     for y, row in enumerate(field): 
      for x, cell in enumerate(row): 
       if cell == PLANT: 
        # Introduce a Y-axis offset to search up & down. 
        for y_offset in range(-1, 2): 
         y_index = y_offset + y 
         if 0 <= y_index < len(field): 
          # Introduce a X-axis offset to search left & right. 
          for x_offset in range(-1, 2): 
           if y_offset or x_offset: # Skip zero offset. 
            x_index = x_offset + x 
            if 0 <= x_index < len(field[y_index]): 
             # Spread plant to non-rock areas. 
             if field[y_index][x_index] != ROCKS: 
              field[y_index][x_index] = NEW_PLANT 


def replace_cells(field, old, new): 
    for y, row in enumerate(field): 
     for x, cell in enumerate(row): 
      if cell == old: 
       field[y][x] = new 


if __name__ == '__main__': 
    main()