返回原始值,python

返回原始值,python,python,python-3.x,Python,Python 3.x,我选择了以下代码: 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(): imp

我选择了以下代码:

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
现在,如果值random number大于90,它将自动给出值None,并将例如字母[0]替换为None

但我想让它做的是,如果数字在90到100之间,我希望它显示原始值。因此,最初存储在字母[0]中的内容


我真的不知道该怎么做。希望我解释得足够清楚。

您可以引发一个异常,然后通过捕获该异常来防止替换字母[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')
你可以尽量避免重复你自己;使用模糊字母的循环,例如:

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
你的obfucate_函数也可以简化;可以只使用random.choice进行角色选择,并有10%的几率不进行更改,也可以使用bisect选择角色或基于累积权重的默认值

使用random.choice:


random.choice选项并不能完全复制您的原始功能,因为您有机会选择一个!是16%,而其他角色有15%的几率被选中。二分法将选择概率完全相同的字符。

它不返回任何字符,因为您的值没有返回值。换句话说,您没有为90到100之间的范围定义最终的elif条件。最简单的方法是使用字母[i]=obsfucate_函数或字母[i]。当obsfucate_函数返回None randomnumber>90时,它将自动使用字母[i]的值

顺便说一句,你可能想使用模糊而不是混乱

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

    return letters
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))]