python練習冊第一題
題目
做為 Apple Store App 獨立開發者,你要搞限時促銷,為你的應用生成啟用碼(或者優惠券),使用 Python 如何生成 200 個啟用碼(或者優惠券)?
解題思路
上網搜了一下生成隨機字串的方法,除了猜想中類似C的random()
方法,令我驚訝的是uuid
模組也可以起到隨機的作用,甚至它不會重複。我想要是不限制啟用碼的長度的話,兩種都試一下吧。
random()內建方法
random.sample(population, k)
Return a k length list of unique elements chosen from the population sequence or set. Used for random sampling without replacement.
這是從一個部落格中看到的例子:
# 多個字元中選取特定數量的字元組成新字串:
>>> import random
>>> import string
>>> string.join(random.sample(['a','b','c','d','e','f','g','h','i','j'], 3)).replace(" ","")
'fih'
如果能創造一個包含數字和所有字母的序列,再隨機生成一定長度的字串,最後用一定格式輸出這個字串,就可以得到我們想要的隨機啟用碼。
String模組
這個String是一個模組,和String資料型別不是同一個。
string.hexdigits
The string '0123456789abcdefABCDEF'.
乾脆就用這個十六進位制的String方法生成一個序列
解決程式碼1
因為也沒要求儲存,就直接打印出來了。粗粗看了一下沒有太大的重複可能性,但概率上還是有可能的;如果需要嚴謹,可以使用uuid方法。
import random, string str = '' seq = [] for d in string.hexdigits: seq.append(d) for i in range(200): key = str.join(random.choices(seq, k=20)) with open('cokey.txt', 'a') as fp: fp.write(key+'\n')
uuid
uuid.uuid1(node=None, clock_seq=None)
Generate a UUID from a host ID, sequence number, and the current time. If node is not given, getnode() is used to obtain the hardware address. If clock_seq is given, it is used as the sequence number; otherwise a random 14-bit sequence number is chosen.
解題程式碼2
由於uuid的唯一性,它生成的序列作為啟用碼倒是沒什麼問題。
import uuid
for i in range(200):
seq=str(uuid.uuid1())
string=''.join(seq.split('-'))
with open('cokey.txt', 'a') as fp:
fp.write(string+'\n')
別人的解題方法
對這個優惠券,我光想到隨機性了,沒想到還要做到與獎品號一一對應。這位大佬的程式碼就很好的解決了這一點。
import base64
# base64編碼方便使用
# 通過id檢驗優惠券是否存在,通過goods查詢商品
coupon = {
'id': '1231',
'goods': '0001',
}
def gen_coupon(id, goods):
coupon['id'] = id
coupon['goods'] = goods
raw = '/'.join([k + ':' + v for k, v in coupon.items()])
raw_64 = base64.urlsafe_b64encode(raw.encode('utf-8'))
c_code = raw_64.decode()
return c_code
def save_coupon(c_code):
with open('coupon.txt', 'a+') as file:
file.write(c_code+'\n')
def show_coupon(c_code):
print('優惠碼:', c_code)
def parse_coupon(c_code):
print('解析優惠碼:', base64.urlsafe_b64decode(c_code.encode('utf-8')))
def gen_all():
for i in range(1000, 1200):
c_code = gen_coupon(str(i), str(int(i/2)))
save_coupon(c_code)
if __name__ == '__main__':
gen_all()