2012-12-11 77 views
0

我有這樣的方法:如何用較少的代碼編寫相同的代碼。 Python的

def get_user_info(self): 

    month  = choice(range(1,13)) 
    day   = choice(range(1,29)) 
    year  = choice(range(1966,1994)) 
    f_name  = self.assign_name('FirstNames') 
    l_name  = self.assign_name('LastNames') 
    e_address = f_name+l_name+year.__str__()+day.__str__() 
    password = f_name+l_name+'0008383' 

    user_info = dict({ 
      'month'  : month, 
      'day'  : day, 
      'year'  : year, 

      'f_name' : f_name, 
      'l_name' : l_name, 
      'e_address' : e-address, 
      'password' : password 
    }) 

    print user_info 

它給了我正確的結果,但我填補像我寫兩次相同的代碼。所以我的問題是如何在不首先創建變量的情況下獲得相同的結果,並且將它們放入dict()中。

請注意,我需要在不同的鍵:值對中使用f_name和l_name等。

+1

說實話,這是錯誤的事情來尋求優化。 –

+1

好吧,考慮到'{expr1:expr2,..}'(因爲'{}'已經不需要'dict'),'expr1'和'expr2'都是*任意表達式*。它們不必是字符串文字或變量名稱,它們本身就是兩種表達式。(因此,它應該遵循「選擇(範圍(1,13))」,它也是一個表達式,可以根據需要進行替換。 ,我敦促謹慎地保留複合表達式的副作用* out。) – 2012-12-11 02:53:37

+0

此問題可能更適合[http://codereview.stackexchange.com/](http://codereview.stackexchange.com/) –

回答

3

我傾向於認爲,考慮到你計算的值,你現在做的方式或多或少都是你能做的最好的。有一些小的改進,如跳過dict的呼叫和使用str內置函數,而不是直接調用__str__方法,但在高層次上沒有任何好的改變。

原因是,你使用前五個變量中的每一個至少兩次。您可以將它們單獨使用一次,作爲存儲在字典中自己的密鑰下的值(例如,f_name的值存儲爲user_info["f_name"]),還可以使用它們來構建e_address和/或password的值。儘管可以將前五個值直接放到字典中,但如果再次將它們放到其他計算中使用,則需要的代碼比現在更加冗餘。

所以,除非你想改變你的e_addresspassword計算獨立於其他值,我會堅持你擁有的。

1

不知道您是否在尋找重構代碼或縮短長度。

如果是後者,你可以做多重任務和減少行數。

因此,像:

def get_user_info(self): 

    month, day, year  = choice(range(1,13)) , choice(range(1,29)), choice(range(1966,1994)) 
    f_name, l_name  = self.assign_name('FirstNames') , self.assign_name('LastNames') 
    e_address, password = f_name+l_name+year.__str__()+day.__str__(), f_name+l_name+'0008383' 

而且你並不真的需要把 '字典()',{}確實已經!

+1

Errw,這解決了什麼問題?:( – 2012-12-11 03:04:04

+0

真的沒什麼TBH。 – Kartik

0

這可能是你可以在不犧牲可讀性做最短(但改善上PEP8 compilance,例如):

def get_user_info(self): 
     month = choice(range(1, 13)) 
     day = choice(range(1, 29)) 
     year = choice(range(1966, 1994)) 
     f_name = self.assign_name('FirstNames') 
     l_name = self.assign_name('LastNames') 
     print {'month' : month, 
       'day' : day, 
       'year' : year, 
       'f_name' : f_name, 
       'l_name' : l_name, 
       'e_address' : f_name + l_name + str(year) + str(day), 
       'password' : f_name + l_name + '0008383'} 

作爲一個側面說明,請重新考慮你的密碼生成策略,它在相當不安全的碼。

你也注意到你可能錯過monthe_address作業?