2017-03-09 40 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()