上一章讲了函数的使用,这章就来练习练习。
1.CRAPS赌博游戏(花旗骰)
玩家摇两颗色子,如果第一次摇出了7点或11点,玩家胜;如果摇出了2点、3点、12点,庄家胜;
如果摇出了其他的点数,游戏继续,玩家重新摇色子;如果玩家摇出了第一次摇的点数,玩家胜;
如果玩家摇出了7点,庄家胜;如果玩家摇出其他点数,游戏继续,玩家重新摇色子,直到分出胜负。游戏开始之前,玩家有1000元的初始资金,玩家可以下注,赢了获得下注的金额,输了就扣除下注的金额,
游戏结束的条件是玩家把钱输光。
首先我们分析我们需要定义哪些函数。第一个需要定义随机摇骰子的函数,因为我们可能需要摇多次骰子才能判处胜负,不写函数就需要多次重复。第二个是玩家胜利后的函数,玩家获得赌注后的金钱变化。第三个是玩家失败后的函数,玩家扣除赌注后金钱变化。所以我们先定义三个函数。
import random
def roll_dice(num=2):
"""摇骰子
:param num: 骰子颗数(自变量)
:return: 骰子点数总和(因变量)
"""
total = 0
# 如果有默认值,调用函数时不给参数则默认为默认值,给参数则使用参数值。
for _ in range(num):
total += random.randrange(1,7)
return total
def win():
global money
print(f'玩家胜利了,您的钱还剩:{money + money_zhu}元')
money += money_zhu
def lose():
global money
print(f'玩家失败了,您的钱还剩:{money - money_zhu}元')
money -= money_zhu
第二步是写判断玩家输入的金额是否在余额范围内,并且是否输入有效。首先给定初始资金为1000,让玩家输入下注金额。使用try``except
方法尝试执行,如果有效则代码继续执行,如果输入无效,或者捕获到ValueError
或让用户重新输入。
第三步就是摇骰子。摇出第一次做出判断,若分出胜负则输出玩家剩余金额,未分出胜负则进行下一轮直至分出胜负。回合结束,玩家可再次输入下注金额。
money = 1000
print(f'您有1000元,请输入下注金额')
while money > 0:
money_zhu = 0
while money_zhu <= 0 or money_zhu > money:
try:
money_zhu = int(input('请输入下注金额:'))
except ValueError:
pass
counter = 1
total_1 = roll_dice(2)
print(f'第1次摇出了{total_1}点')
if total_1 == 7 or total_1 == 11:
win()
elif total_1 == 2 or total_1 == 3 or total_1 == 12:
lose()
else:
while True:
counter += 1
total_2 = roll_dice(2)
if total_2 == total_1:
print(f'第{counter}次摇出了{total_2}点')
win()
break
elif total_2 == 7:
print(f'第{counter}次摇出了{total_2}点')
lose()
break
else:
print(f'第{counter}次摇出了{total_2},未分出胜负')
2. 写一个实现生成指定长度的随机验证码(有数字和英文字母构成)的函数
使用random函数中的choices方法随机抽取指定数量字符组成验证码,这样的函数写成后,以后调用就很方便,不用每次都在写一次。
import random
import string
def num(i=4):
"""生成随机验证码
:param i: 验证码长度
:return: 验证码字符串
"""
selected_chars = random.choices(string.ascii_letters + string.digits, k=i)
ma_str = ''.join(selected_chars)
return ma_str
print(num(6))
3.生成随机五组双色球
“双色球”每注投注号码由6个红色球号码和1个蓝色球号码组成。红色球号码从1–33中选择;蓝色球号码从1–16中选择。
import random
def balls(red_maxnum=33, red_ball=5,
bule_maxnum=16, bule_ball=1):
for _ in range(num):
red = [random.randint(1, red_maxnum + 1) for _ in range(red_ball)]
red.sort()
blue = [random.randrange(1, bule_maxnum + 1) for _ in range(bule_ball)]
ball = red + blue
print(ball)
# 双色球
num = int(input('机选几注:'))
balls()
我们不把红色球和蓝色球的抽奖号码定死,而是让他们成为自变量的原因是,如果我们想要把程序改成六合彩的时候,可以通过输入因变量的值将抽奖范围和红蓝球的数量改变,从而轻易改成六合彩的程序。
4. 设计一个函数返回给定文件名的后缀名
文件名通常是一个字符串,而文件的后缀名指的是文件名中最后一个.
后面的部分。但是只有以.
开头或结尾,没有其他的.
默认为没有后缀名。
filename
是输入的字符串,has_dot
是代表输不输出.
def get_suffix(filename='bu.txt', has_dot=True):
x = filename.rfind('.')
if x == len(filename) - 1:
return None
if x <= 0:
return None
if x > 0:
if has_dot:
x += 1
return filename[x:]
print(demo.get_suffix(filename='khkfh.fhiuf.txt', has_dot=True)) # txt
print(demo.get_suffix(filename='.fhiuf.txt', has_dot=False)) # .txt
print(demo.get_suffix(filename='khkfh.fhiuf.')) # None
print(demo.get_suffix(filename='khkfh', has_dot=True)) # None
在写代码的时候,一定要有意识的将相对独立且重复出现的功能封装成函数,这样不管是自己还是团队的其他成员都可以通过调用函数的方式来使用这些功能。