返回原始值,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))]