[python学习]案例02:京牌摇号与公司年会抽奖

6 阅读4分钟

京牌摇号

要求:(1)京+1位大写字母+5位大写字母或数字 (2)每次输出20个(3)可以刷新3次,每次可选一个

根据要求可以想到需要用到循环嵌套,我选择使用for循环,还需要使用到string的模块输出随机数。

代码如下

import string
import random
# 设置第一个大写字母和5个大写字母或数字
first_num = string.ascii_uppercase
other_num = string.ascii_uppercase + string.digits
# 初始化车牌号
choice = "无"
# 生成20个车牌号,规定3次刷新
for a in range(3):
    for b in range(20):
        card = "京" + random.choice(first_num)
        for c in range(5):
            card += random.choice(other_num)
        print(card+" ")
    # 进行刷新和确定车牌号
    print(f"您的选号为:{choice}")
    choice = input("请输入您选择的车牌号")
    print(f"1.确认选号,不在刷新\n2.刷新(剩余的刷新次数{3-a}/3)")
    choose = input()
    if choose == "1":
        print(f"选号成功,您的车牌号为:{choice}")
        break
    elif choose == "2":
        # 刷新
        continue
    else:
        print("输入错误")

运行结果

京PAOIMM 
京XYCZJD 
京VRHRVG 
京FY183P 
京ISSJG9 
京XJJ7VJ 
京UNWPKV 
京E9AVSI 
京N5SFGI 
京Q25M39 
京I7K9BK 
京FTDWY7 
京G6TZ3U 
京TFGRGD 
京D1Z45R 
京L6713D 
京DW6K7O 
京QV3LFV 
京KEOHBR 
京GJ98FW 
您的选号为:无
请输入您选择的车牌号京KEOHBR
1.确认选号,不在刷新
2.刷新(剩余的刷新次数3/3)
2
京H3JZAW 
京EF56FD 
京MA0F02 
京RLPCEM 
京YFR0BO 
京CSP1H8 
京OPJOD4 
京T7W9TO 
京LRXCXK 
京O2HHHS 
京UJ1H26 
京C6WT0Y 
京Z2TEA0 
京COEYHZ 
京E46ESN 
京AFGQWM 
京PLY8TW 
京KL9APZ 
京PDDIN8 
京U0TLSO 
您的选号为:京KEOHBR
请输入您选择的车牌号京PDDIN8
1.确认选号,不在刷新
2.刷新(剩余的刷新次数2/3)
1
选号成功,您的车牌号为:京PDDIN8

进程已结束,退出代码0

公司年会抽奖

要求:一等奖 3名,二等奖 6名,三等奖 30名,一共300个。300名员工,每人抽3次。第一次抽三等奖,第二次抽二等奖,第三次抽一等奖。每名员工限中奖一次,不可重复。

代码如下

import random
# 各奖项中奖名单
prize_one = ""
prize_two = ""
prize_three = ""
n = 1
# 三等奖
for i in range(1, 31):
    prize_three = prize_three + str(random.choice(range(1, 301))) + " "
# 二等奖
while n < 8:
    num = str(random.choice(range(1, 301)))
    if prize_three.find(num) == -1:
        prize_two = prize_two + num + " "
        n += 1
# 一等奖
n = 1
while n < 4:
    num = str(random.choice(range(1, 301)))
    if (prize_three.find(num) == -1) and (prize_two.find(num) == -1):
        prize_one = prize_one + num + " "
        n += 1
print(f"一等奖的员工编号{prize_one}\n二等奖的员工编号{prize_two}\n三等奖的员工编号{prize_three}")

运行结果

一等奖的员工编号227 245 67 
二等奖的员工编号300 135 141 278 146 275 289 
三等奖的员工编号121 279 154 169 95 39 11 106 9 138 244 97 107 76 134 299 255 149 250 199 104 254 235 248 32 194 23 104 2 145 

进程已结束,退出代码0

该案例使用了一些string模块,以下是我记的一些笔记。

# 内置方法:数据类型对象.方法名(参数)
s1 = "Hello World"

# upper lower
print(s1.upper())
print(s1.lower())

# startswith() endswith()
# s1是否以He开头
print(s1.startswith("He"))
# s1是否以He结尾
print(s1.endswith("He"))

# isdigit()检查是否是数字字符串
s2 = input("input a digit")
print(s2.isdigit())

# strip  去除字符串两端的空格或换行符
s3 = input("input name")
print(s3, len(s3))
s3 = s3.strip()
print(s3, len(s3))

# split(" ") 将字符串以" "分割变成列表(数组)
s4 = "1 2 3 4 5"
ret = s4.split(" ")
print(ret, len(ret))

# " ".join(ret)将ret列表以“ ”组合成字符串
ret2 = ":".join(ret)
print(ret2, len(ret2))

# find 查找并返回首个字符的索引
# 没有找到返回-1
s5 = "1234567"
print(s5.find("4"), type(s5.find("4")))

# index 查找并返回首个字符的索引
# 没有找到就报错
s5 = "1234567"
print(s5.index("1"))

# count 计数
s6 = "1234141414"
print(s6.count("1"))

# replace 替换
s7 = "i have dream"
print(s7.replace("have dream", "am a student"))

# x.append(y) x是一个列表,y是字符(串),将y加入到x中
# random.sample(x,num) 返回num个x

运行结果

HELLO WORLD
hello world
True
False
input a digit12
True
input namename
name 4
name 4
['1', '2', '3', '4', '5'] 5
1:2:3:4:5 9
3 <class 'int'>
0
4
i am a student

总结

这两个案例,是为了巩固string模块的使用。其中年会抽奖这个案例整理思路用了很久,如果各位大佬有更好的思路欢迎指教。