你可以拋出一個異常,而不是,然後通過捕獲該異常防止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%的機會被挑選。平分法將選擇具有完全相同概率的字符。
感謝您的幫助生病嘗試。 – 2014-12-06 12:34:41