Сократить последовательность операторов if - PullRequest
1 голос
/ 13 октября 2011

У меня есть этот код.

c = getch()
if c == "r":                                                                   
  return randrange(101, len(mylist) - 1) 
if c == "u":                                                        
  return 100               
if c == "b":      
  return -2                
if c == "w":    
  return -3                
if c == "m":
  return -4                
if c == "d":
  return -5                
if c == "e":
  return -6                
if c == "k":
  return -7
if c == "g":
  return -8
if c == "p":
  return -9
if c == "o":
  right = center - 1       
else:                      
  left = center + 1

Можно ли сделать этот фрагмент кода более компактным?Как бы вы написали это лучше?

спасибо

Ответы [ 3 ]

8 голосов
/ 13 октября 2011

Вы можете использовать словарь:

# Special case.
if c == "r":                                                                   
    return randrange(101, len(list) - 1) 

# This is constant. It could be generated once at program start.
d = { 'u' : 100, ...., 'p' : -9 }

# This covers the majority of the cases.
if c in d:
    return d[c]

# Some more special cases.
if c == "o":
   right = center - 1       
else:                      
   left = center + 1
2 голосов
/ 13 октября 2011

Я согласен, что словарь - это путь. Проблема с ответом Марка состоит в том, что словарь перестраивается при каждом вызове функции. Обходной путь состоит в том, чтобы определить dict вне функции:

def foo():
    c = getch()
    if c in foo.mydict:
        return foo.mydict[c]
    else:
        # TODO: special cases

foo.mydict = {'u':100, ... , 'p':-9}

# foo is now ready to use
1 голос
/ 13 октября 2011

Настоятельно рекомендуется переименовать переменную list во что-то, что еще не использовалось.

...
c=getch()
if c=="r":
    return randrange(101, len(mylist) - 1)

return dict(u=100, b=-2, w=-3, m=-4, d=-5, e=-6, k=-7, g=-8, p=-9, o=center-1).get(c, center+1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...