2014-12-06 82 views
0

我這個選擇的代碼:返回原來的價值,有蟒蛇

def obsfucate_letters(letters): 

    letters[0] = obsfucate_function() 
    letters[1] = obsfucate_function() 
    letters[2] = obsfucate_function() 
    letters[3] = obsfucate_function() 

    return letters 

def obsfucate_function(): 

    import random as r 
    randomnumber = r.random() * 100 
    if randomnumber <= 16: 
     letters1 = "!" 
     return letters1 
    elif randomnumber > 16 and randomnumber <= 30: 
     letters1 = "%" 
     return letters1 
    elif randomnumber > 30 and randomnumber <= 45: 
     letters1 = "&" 
     return letters1 
    elif randomnumber > 45 and randomnumber <= 60: 
     letters1 = "*" 
     return letters1 
    elif randomnumber > 60 and randomnumber <= 75: 
     letters1 = "#" 
     return letters1 
    elif randomnumber > 75 and randomnumber <= 90: 
     letters1 = "@" 
     return letters1 

現在,此刻如果值爲隨機數超過90它只會自動給出值NoneNone取代例如letters[0]

但我想要它做的是,如果數量在90和100之間,我希望它顯示原始值。所以最初存儲在letters[0]

真的不知道該怎麼做。希望我已經清楚解釋清楚了。

回答

0

你可以拋出一個異常,而不是,然後通過捕獲該異常防止letters[0]進行更換:

def obsfucate_letters(letters): 
    try:  
     letters[0] = obsfucate_function() 
    except ValueError: 
     # ignore the exception, letters[0] will be unchanged 
     pass 

    try: 
     letters[1] = obsfucate_function() 
    except ValueError: 
     pass 

    try: 
     letters[2] = obsfucate_function() 
    except ValueError: 
     pass 

    try: 
     letters[3] = obsfucate_function() 
    except ValueError: 
     pass 

    return letters 

def obsfucate_function(): 
    import random as r 
    randomnumber = r.random() * 100 
    if randomnumber <= 16: 
     letters1 = "!" 
     return letters1 
    elif randomnumber > 16 and randomnumber <= 30: 
     letters1 = "%" 
     return letters1 
    elif randomnumber > 30 and randomnumber <= 45: 
     letters1 = "&" 
     return letters1 
    elif randomnumber > 45 and randomnumber <= 60: 
     letters1 = "*" 
     return letters1 
    elif randomnumber > 60 and randomnumber <= 75: 
     letters1 = "#" 
     return letters1 
    elif randomnumber > 75 and randomnumber <= 90: 
     letters1 = "@" 
     return letters1 
    else: 
     raise ValueError('random number out of range') 

你也電流值傳遞給obfuscate_function()功能,如果隨機值返回大於90:

def obsfucate_letters(letters): 
    letters[0] = obsfucate_function(letters[0]) 
    letters[1] = obsfucate_function(letters[1]) 
    letters[2] = obsfucate_function(letters[2]) 
    letters[3] = obsfucate_function(letters[3]) 

    return letters 

def obsfucate_function(default): 
    import random as r 
    randomnumber = r.random() * 100 
    if randomnumber <= 16: 
     letters1 = "!" 
     return letters1 
    elif randomnumber > 16 and randomnumber <= 30: 
     letters1 = "%" 
     return letters1 
    elif randomnumber > 30 and randomnumber <= 45: 
     letters1 = "&" 
     return letters1 
    elif randomnumber > 45 and randomnumber <= 60: 
     letters1 = "*" 
     return letters1 
    elif randomnumber > 60 and randomnumber <= 75: 
     letters1 = "#" 
     return letters1 
    elif randomnumber > 75 and randomnumber <= 90: 
     letters1 = "@" 
     return letters1 
    else: 
     return default 

你可以儘量避免重複自己;使用循環在obfuscate_letters例如:

def obsfucate_letters(letters): 
    for i in range(len(letters)): 
     try: 
      letters[i] = obfuscate_function() 
     except ValueError: 
      # don't replace a letter when the random value was out of range 
      pass 

    return letters 

或傳遞一個的當前值:

def obsfucate_letters(letters): 
    for i in range(len(letters)): 
     letters[i] = obfuscate_function(letters[i]) 

    return letters 

obsfucate_function()你可以太簡化;或者通過使用random.choice()來進行角色選擇,並且單獨的10%機率不作任何改變,或者通過使用bisect來選擇角色或基於累積權重的默認值。

使用random.choice()

import random 

def obsfucate_function(default): 
    if random.random() < 0.1: 
     # 10% chance the default is picked 
     return default 
    return random.choice('!%&*#@') 

使用二分法:

import random 
import bisect 

def obsfucate_function(default): 
    cumulative_weights = [16, 30, 45, 60, 75, 90, 100] 
    values = ['!', '%', '&', '*', '#', '@', default] 
    return values[bisect.bisect(cumulative_weights, random.randrange(100))] 

random.choice()選項並不完全複製你的原始功能,選擇一個!是16%的機率,而其餘角色有15%的機會被挑選。平分法將選擇具有完全相同概率的字符。

+0

感謝您的幫助生病嘗試。 – 2014-12-06 12:34:41

0

它沒有返回值,因爲你的值沒有返回值。換句話說,你沒有定義90到100之間範圍的最終elif條件。

0

最簡單的方法是使用letters[i] = obsfucate_function() or letters[i]。當obsfucate_function返回無(randomnumber> 90)時,它會自動使用字母[i]的值。

順便說一句,你可能想使用混淆而不是晦澀難懂。