網(wǎng)上參考的一個生成兌換碼函數(shù)
# encoding=utf8
import random
import string
def _int_to_str(x, base=36):
"""Reversed version of int(s, base=?). src: http://stackoverflow.com/questions/2267362/"""
numerals = string.digits + string.lowercase + string.uppercase
numerals.replace('0','')
numerals.replace('o','')
if x == 0:
return numerals[0]
sign = -1 if x < 0 else 1
x *= sign
digits = []
while x:
digits.append(numerals[x % base])
x /= base
if sign < 0:
digits.append(u'-')
return u''.join(reversed(digits))
n_codes = 10 # 生成兌換碼個數(shù)
rand_len = 6 #這里可以隨意傳入想要生成的位數(shù)
rand_limit = 36 ** rand_len
prefix = 'TX'
for x in xrange(0,n_codes):
rand = _int_to_str(random.randrange(0, rand_limit), base=36).zfill(6)
code_text = prefix + rand
print code_text
這里使用了一個_int_to_str的方法 傳入的x則是0-36的n次方中間的任意一個數(shù),然后 base為36. 下面為整個函數(shù)的解析
下面_int_to_str函數(shù) 使用了一個 string模塊 然后將0-9a-zA-Z包含到了一個叫numerals的變量之中。
如果x==0 那么返回0
sign等于 如果x<0 sign等于-1 否則等于1 這一句判斷傳入的x是否為一個負數(shù)。并且取出其符號 從這一句可以看到 這個通用函數(shù) 其實并不是 前面這個作者自己寫的。而是一個通用使用方法。用于解析指定base多少位數(shù)使用。 這里后面再討論。
如果為負數(shù) 轉(zhuǎn)為正數(shù)
申明一個digits = []
digits追加(numerals[傳入x % base])
x/=base 這里注意了這里和上面式子呼應 一個取的是余數(shù) 處以36取到的余數(shù)一定是0-36之間的數(shù),然后可以轉(zhuǎn)換為string,而這里記錄每次除以之后剩余的值
由于取的是36的n次方 這里也正好可以除n次,這樣的話 就對應了生成多少個隨機數(shù)了。然后跳出循環(huán)之后 判斷符號 是否需要追加 負號 也就是 還原負號
最后再將數(shù)組重新拼接成字符串返回
由此結(jié)束這樣拆開來看 似乎還是比較清晰 合理的。后面再使用了一個 zfill()函數(shù) 不滿這個數(shù)就往前用0補齊。 這樣看來 的確也有夠隨機 而且 base參數(shù)實際上是可變化的。這個算法 蠻有意思 所以在這里 記錄一下。與大家分享。
原文地址:http://www.cnblogs.com/piperck/p/5047378.html