2011-09-26 74 views
1

我很難理解爲什麼我的方法中的內循環沒有產生所期望的行爲,我希望有人能夠幫助我理解問題。Python方法中的內循環幫助

我的方法需要一系列參數(*args),如果參數是一個整數,我想在整數週圍添加美元符號(例如,$5$)。

def t_row(*args): 
    columns = 5 
    if len(args) == columns: 
     count = 0 
     for value in args: 
      if type(value) is int: 
       value = ''.join(('$', str(value), '$')) 
      count += 1 
      if count < len(args): 
       penult_args = args[:-1] 
       line_prefix = [''.join((str(value), " & ")) for value in penult_args] 
      elif count == len(args): 
       line_suffix = [''.join((str(value), " \\\\", "\n"))] 
     count += 1 
     line_list = line_prefix + line_suffix 
     line = ''.join(item for item in line_list) 
     return(line) 

上面的代碼這樣使用:

>>> s = q.t_row('data1', 'data2', 3, 'data4', 5) 
>>> print s 
data1 & data2 & 3 & data4 & $5$ \\ 

我爲什麼不避開整數3美元符號?如何修復我的代碼以糾正此問題?

+0

IMHO這個代碼是取消Python化:我有你的方法需要列表:'.t_row(VALUE_LIST = [無,3,5],named_list = [ 'DATA1', '數據2', 'DATA4'])'或事件剛剛返回命名值,和他們拉出來的'kwargs'的,如:'.t_row(數據1 =無,數據2 = 3,數據4 = 5)''高清t_row(個體經營,* ARGS,** kwargs):''對於kwargs中的參數:'etc –

回答

2

因爲在這條線:

  line_prefix = [''.join((str(value), " & ")) for value in penult_args] 

你拉的值從原來的名單(減去最後一個項目),而在這條線:

  value = ''.join(('$', str(value), '$')) 

您加入$但從未將值存回列表中。

5只得到$因爲它是最後一個項目,所以您可以直接在引用它:

  line_suffix = [''.join((str(value), " \\\\", "\n"))] 

一個更好的辦法來做到這一切是:

def t_row(self, *args): 
    if len(args) == self.columns: 
     result = [] 
     for value in args: 
      if isinstance(value, int): 
       result.append('$%d$' % value) 
      else: 
       result.append(value) 
     return ' $ '.join(result) + r' \\' 

作爲一個班輪,這將是

t_row = lambda self, *args: (' $ '.join('$%d$' % 
      value if isinstance(value, int) else value for value in args) + r' \\' 
       if len(args) == self.columns else None) 

但這不是實際上好主意。

+0

感謝agf。你的解釋完全清楚。出於某種原因,我無法發現錯誤,但現在非常清楚。我也非常感謝你的解決方案。這幫了我很多。 – drbunsen

2

的問題是因爲在這一行:

line_prefix = [''.join((str(value), " & ")) for value in penult_args] 

您將要覆蓋value與原(非美元簽名)的價值。

它僅適用於最後一個參數,因爲上面的行不是爲args [-1]調用的。

爲您的循環使用不同的變量名稱。

(Python的作用域是僅在函數和類,for循環和if聲明不是單獨作用域)