1. 程式人生 > >python練習冊第一題

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()