Python随堂笔记 函数典型案例练习

本文介绍了Python基础的四个典型案例:使用加密和解密函数实现字符串的加解密,两种方法计算最大公约数,通过装饰器检查函数参数合法性,以及模拟轮盘抽奖游戏的实现。涉及字符串操作、循环、递归、装饰器及随机数应用。
摘要由CSDN通过智能技术生成

🌴 2022.04.15 下午

前言

🎬本文章是 【Python语言基础】 专栏的文章,主要是上课的随堂笔记与练习
🔗Python专栏 传送门
💻提示:本文的环境配置是Python3的开发环境。目录顺序以当堂内容(教材)为准,所以并非“1、2、3”
📽本节主要内容:上节学习了函数,这节通过几个小题目练习一下

5.6 典型案例

5.6.1 加密和解密

将输入字符串的所有字符加密,密钥key为3。然后,再使用同样的密钥key对加密后的字符串进行解密

分析:

  1. 定义一个加密函数对传入的明文进行加密,返回加密后的密文
  2. 定义一个解密函数对传入的密文进行解密,返回解密后的明文
#加密函数
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 求最大公约数

求两个正整数的最大公约数

方法一:创建非递归函数求最大公约数
分析:非递归函数使用穷举法实现

  1. 将两个数m和n做比较,取较小的数作为smaller
  2. 以smaller为被除数分别和输入的两个数m和n做除法运算
  3. 被除数每做一次除法运算,值减少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
'''

方法二:创建递归函数求最大公约数

分析:递归函数采用辗转相除法实现

  1. 取两个数中较大的数做除数,较小的数做被除数
  2. 用较大的数除较小的数:如果余数为0,则较小数为这两个数的最大公约数;如果余数不为0,则用较小数除上一步计算出的余数
  3. 重复上述步骤,直到余数为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. 抽中的数字在1~3范围,为特等奖,奖金为10000元
  2. 抽中的数字在4~10范围,为一等奖,奖金为5000元
  3. 抽中的数字在11~30范围,为二等奖,奖金为1000元
  4. 抽中的数字在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元
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值