🌴 2022.04.15 下午
前言
🎬本文章是 【Python语言基础】 专栏的文章,主要是上课的随堂笔记与练习
🔗Python专栏 传送门
💻提示:本文的环境配置是Python3的开发环境。目录顺序以当堂内容(教材)为准,所以并非“1、2、3”
📽本节主要内容:上节学习了函数,这节通过几个小题目练习一下
5.6 典型案例
5.6.1 加密和解密
将输入字符串的所有字符加密,密钥key为3。然后,再使用同样的密钥key对加密后的字符串进行解密
分析:
- 定义一个加密函数对传入的明文进行加密,返回加密后的密文
- 定义一个解密函数对传入的密文进行解密,返回解密后的明文
#加密函数
def encryFunc(encryString):
decryString = ''
for i in encryString:
decryString = decryString + chr(ord(i) + 3)
return decryString
#解密函数
def decryFunc(decryString):
encryString = ''
for i in decryString:
encryString = encryString + chr(ord(i) - 3)
return encryString
if __name__ == '__main__':
encryStr = input("请输入要加密的字符串: ")
decryStr = encryFunc(encryStr)
print("加密后的字符串:",decryStr)
encryStr = decryFunc(decryStr)
print("解密后的字符串:",encryStr)
'''
请输入要加密的字符串: a3b5e8
加密后的字符串: d6e8h;
解密后的字符串: a3b5e8
'''
5.6.2 求最大公约数
求两个正整数的最大公约数
方法一:创建非递归函数求最大公约数
分析:非递归函数使用穷举法实现
- 将两个数m和n做比较,取较小的数作为smaller
- 以smaller为被除数分别和输入的两个数m和n做除法运算
- 被除数每做一次除法运算,值减少1,直到两个运算的余数都为0,该被除数为这两个数的最大公约数
#定义非递归函数
def gys(m,n):
if m > n:
smaller = n
else:
smaller = m
for i in range(smaller,1,-1):
if ((m % i == 0) and (n % i == 0)):
gys = i
break
return gys
if __name__ == '__main__':
num1 = int(input("请输入第一个整数: "))
num2 = int(input("请输入第二个整数: "))
print(num1,"和",num2,"的最大公约数为
",gys(num1,num2))
'''
请输入第一个整数: 6
请输入第二个整数: 10
6 和 10 的最大公约数为 2
'''
方法二:创建递归函数求最大公约数
分析:递归函数采用辗转相除法实现
- 取两个数中较大的数做除数,较小的数做被除数
- 用较大的数除较小的数:如果余数为0,则较小数为这两个数的最大公约数;如果余数不为0,则用较小数除上一步计算出的余数
- 重复上述步骤,直到余数为0,则这两个数的最大公约数为上一步的余数
#定义递归函数
def gys(a,b):
if a > b:
a,b = b,a
if b % a == 0:
return a
else:
return gys(a,b % a)
if __name__ == '__main__':
num1 = int(input("请输入第一个整数: "))
num2 = int(input("请输入第二个整数: "))
print(num1,"和",num2,"的最大公约数为
",gys(num1,num2))
'''
请输入第一个整数: 20
请输入第二个整数: 10
20 和 10 的最大公约数为 10
'''
方法三:使用Math中的函数求最大公约数
分析:直接调用Math中的
gcd()
函数
import math
num1 = int(input("请输入第一个整数: "))
num2 = int(input("请输入第二个整数: "))
print(num1,"和",num2,"的最大公约数为",(math.gcd(num1,num2)))
'''
请输入第一个整数: 12
请输入第二个整数: 8
12 和 8 的最大公约数为 4
'''
5.6.3 使用装饰器检查函数参数合法性
使用装饰器检查函数参数合法性
#定义装饰器
def deco(func):
#检查func(x,y)中的参数
def check_call_func(x,y):
if x >= 0 and y >= 0:
return func(x,y)
else:
return "提示: 函数参数 " + str(x)+" 和 "+str(y)+" 必须为非负数!"
return check_call_func
@deco
def rec_area(x,y): #计算长方形面积
return x * y
@deco
def rec_perimeter(x,y): #计算长方形周长
return 2 * (x + y)
if __name__ == "__main__":
print(rec_area(-3,4))
print(rec_perimeter(-3,4))
print(rec_area(3,4))
print(rec_perimeter(3,4))
'''
提示: 函数参数 -3 和 4 必须为非负数!
提示: 函数参数 -3 和 4 必须为非负数!
12
14
'''
5.6.4 模拟轮盘抽奖游戏
编写程序模拟轮盘抽奖游戏
分析:抽奖数字范围为1~100
- 抽中的数字在1~3范围,为特等奖,奖金为10000元
- 抽中的数字在4~10范围,为一等奖,奖金为5000元
- 抽中的数字在11~30范围,为二等奖,奖金为1000元
- 抽中的数字在31~100范围,为三等奖,奖金为300元
import random
#定义抽奖函数
def cjhs(jxfb):
zpds = random.randint(1,100)
#根据zpds所在范围返回抽奖类型
for jxjg,kdfw in jxfb.items():
if kdfw[0] <= zpds and zpds <= kdfw[1]:
return jxjg
if __name__ == '__main__':
#各奖项分布比例.
jxfb = {'特等奖':(1,3),'一等奖':(4,10),'二等奖':(11,30),'三等奖':(31,100)}
#各奖项奖金.
jxjj = {'特等奖':10000元,'一等奖':5000元,'二等奖':1000元,'三等奖':300元}
zjqk = dict() #中奖情况
#1轮抽奖的次数.
for i in range(30):
bczk = cjhs(jxfb)
zjqk[bczk] = zjqk.get(bczk,0) + 1
zjj = 0 #总奖金
#根据奖项类型和奖项奖金计算所得奖金情况.
for key,value in zjqk.items():
if key == "特等奖": zjj = zjj + value * jxjj[key]
if key == "一等奖": zjj = zjj + value * jxjj[key]
if key == "二等奖": zjj = zjj + value * jxjj[key]
if key == "三等奖": zjj = zjj + value * jxjj[key]
print("本轮游戏中奖情况:",zjqk)
print("本轮游戏共获得总奖金 =",zjj)
'''
运行结果:(1次运行结果)
本轮游戏中奖情况: {'二等奖': 7, '三等奖': 18, '特等奖': 2, '一等奖': 3}
本轮游戏共获得总奖金 = 47400元
'''