python基础案例题:进制转换、字符串加密的实现、猜拳游戏、多种方法计算π

news2024/11/16 15:37:56

目录

      • 前言
      • 1.进制转换
      • 2.字符串加密的实现
      • 3.猜拳游戏
      • 4.多种方法计算π
      • 尾语 💝

前言

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

1.进制转换

功能

获取十进制整数的二进制串,相当于内置函数bin。

算法分析

  1. 对2辗转相除,直到商为0

  2. 每次所得余数逆序即可

流程图绘制

测试驱动,书写测试用例:

>>> convert(13)
'1101'
>>> convert(1)
'1'
>>> convert(0)
'0'
>>> convert(67)
'1000011'
>>> convert(15)
'1111'

代码实现:

def convert(n):
    """
    添加上述测试用例
    """
    s = ""
    while n != 0:
        r = n % 2
        s = str(r) + s
        n //= 2
    return s

if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=True)

运行上述测试,可以看到0的二进制串没通过测试,

原因是s默认为空串,因而传入0时得到的将是空串。

我们可以在返回值时,使用三元运算符处理即可,return s if s != “” else “0”

扩展:十进制转任意进制

  1. 进制:变化的是数码和基数

  2. 基数我们可以通过参数传入来解决

  3. 数码我们可以通过定义码元串来完成,然后通过索引访问即可

代码实现:

def convert(num, base):
    """
    >>> convert(13, 2)
    '1101'
    >>> convert(23, 16)
    '17'
    >>> convert(23, 8)
    '27'
    >>> convert(30, 16)
    '1E'
    """
    codes = "0123456789ABCDEF"
    s = ""
    while num != 0:
        r = num % base
        s = codes[r] + s
        num //= base
    return s if s != "" else "0"

if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=True)

2.字符串加密的实现

功能:

对英文串进行加密,规则英文字母循环右移n位,不失一般性,此处n设为3

算法分析:

  1. chr,根据ASCII码获取字符;

  2. ord,获取字母的ASCII码

循环右移,即越界翻转,z完后再到a,即(ord(ch) + 3 - 0x61) % 26 + 0x61

流程图绘制

测试先行:

>>> encrypt("abc")
'def'
>>> encrypt("xyz")
'abc'
>>> encrypt("Abc")
'Def'
>>> encrypt("a1b2c3")
'd1e2f3'
>>> encrypt("abc ABC")
'def DEF'

代码实现:

def encrypt(p):
    """
    添加上述测试用例
    """
    s = ""
    for ch in p:
        code = (ord(ch) - 0x61 + 3) % 26 + 0x61
        s += chr(code)
    return s

if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=True)

运行上述测试,前2个通过,后面3个失败。

原因分析:

大写字母处理不对,代码默认基础字母是‘a’。

只需要增加base变量,根据字母是大写还是小写来初始化,即base = 0x41 if ch.isupper() else 0x61,将该行插入到第7行前,然后把后面行中出现的0x61修改为base即可。

再运行测试,前3个通过。

根据题意,对英文字母进行加密,非英文字母我们保持不变即可。

利用字符串对象提供的isalpha方法进行分支处理,

加密方法的完整代码如下:

def encrypt(p):
    """
    添加上述测试用例
    """
    s = ""
    for ch in p:
        if not ch.isalpha():
            s += ch
            continue
        base = 0x41 if ch.isupper() else 0x61
        code = (ord(ch) - 0x61 + 3) % 26 + 0x61
        s += chr(code)
    return s

注意:Python字符串的isalpha方法,支持unicode字符,因而中文也是字符,

这将导致上述代码无法正确处理中文。

我们可以通过自己定义is_letter函数来实现英文字母的判断。

3.猜拳游戏

功能:

玩家与计算机“剪刀石头布”,三局两胜(平局不算),最后输出获胜方。

计算机出拳,使用random库随机产生;玩家由键盘输入。

random库:

randrange函数:和range函数的参数一样,在该范围产生一个随机数

choice函数:抽取一个

choices函数:有放回抽样

sample函数:无放回抽样

seed函数:默认系统时间作为种子。种子相同,则产生相同随机数列。

逻辑判断优化:

建立映射:0表示scissor,1表示stone,2表示cloth

观察可得,(x+1)%3 == y,表示y胜;否则,x!=y,表示x胜

代码实现

import random

def compare(computer, player):
    choices = ["scissor", "stone", "paper"]
    infos = ["it is a draw.", "computer win!", "player win!"]    
    wid = 0
    if computer == (player + 1) % 3:
        wid = 1
    elif computer != player:
        wid = 2
    return wid, infos[wid] + f"{choices[computer]} VS {choices[player]}"

def run():    
    result = [0, 0, 0]
    while True:
        computer = random.choice([0, 1, 2])
        player = int(input("please input your choice:"))
        wid, info = compare(computer, player)
        print(info)      
        result[wid] += 1        
        if max(result[1], result[2]) == 2: break
    
    print(f"game over!{result[1]}:{result[2]}")

if __name__ == "__main__":
    run()

程序运行情况如下:

please input your choice:0
computer win!stone VS scissor
please input your choice:0
computer win!stone VS scissor
game over!2:0
>>> 

please input your choice:0
player win!paper VS scissor
please input your choice:1
player win!scissor VS stone
game over!0:2
>>> 

please input your choice:0
it is a draw.scissor VS scissor
please input your choice:0
computer win!stone VS scissor
please input your choice:0
player win!paper VS scissor
please input your choice:0
player win!paper VS scissor
game over!1:2

4.多种方法计算π

功能:

数列方式求π:π/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9......

通项分析:

  1. 分子为1,分母为奇数2n-1,正负交替

  2. 计算项数越多,精度越高

代码实现

def calc(n):
    s, sign = 0, 1
    for i in range(1, n+1):
        item = sign / (2*i - 1)
        s += item        
        sign *= -1     #正负交替
    return 4 * s

if __name__ == "__main__":
    s = calc(1000000)
    print(f"{s}")

运行该程序,可以得到π值为:3.1415916535897743。

增加循环次数,可以提升精度,但运行时间会增加,请大家自行测试。

扩展练习:

已知数列,π2/6=1+1/4+1/9+1/16……,编程实现π的计算。

刘徽割圆术求π

割之弥细,所失弥少,计算正多边形的面积,就是圆的面积(单位圆的话,就是π的值)

正多边形就是n个相同大小的三角形,只需计算1个三角形的面积即可

三角形三边长容易获得,再利用海伦-秦九韶公式可以计算面积: p ( p − a ) ( p − b ) ∗ ( p − c ) \sqrt{p(p-a)(p-b)*(p-c)} p(pa)(pb)(pc) ,其中p为周长的一半。

代码实现

import math

def calc_area(n):
    angle = 2*math.pi / n
    x1, y1 = 1, 0
    x2, y2 = math.cos(angle), math.sin(angle)
    a = math.sqrt((x1-x2)**2 + (y1-y2)**2)      #求两点距离
    p = (a+1+1) / 2                             #周长的一半
    s = math.sqrt(p * (p-a) * (p-1) * (p-1))    #海伦-秦九韶公式
    return s

#学习中没有资料?可以加我VX:qian97378免费领
def run():
    n = 20000
    s = calc_area(n)
    print(n * s)

if __name__ == "__main__":
    run()

运行该程序,可得π \piπ的值:3.141592601914085。

扩展练习:

利用已知两边长及其夹角求面积公式,完成π \piπ的计算。

蒙特卡罗投针实验求π

概率可以用面积之比来表示

模拟投针实验:

  1. 单位圆和其外接正方形

  2. 随机投针

  3. 圆内针数与总针数的比例等于圆和方形的面积之比

代码实现

import random, math

def calc_area(n):
    count = 0
    for i in range(n):
        x = random.random()
        y = random.random()
        d = math.sqrt(x*x + y*y)            #到圆心的距离
        if d < 1:                           #落入圆内,则计数加1
            count += 1
    return count * 4 / n

def run():
    n = 1000000
    s = calc_area(n)
    print(s)

if __name__ == "__main__":
    run()

运行程序,1百万次投针得到的π \piπ值为:3.140648,精度不算太高。

尾语 💝

要成功,先发疯,下定决心往前冲!

学习是需要长期坚持的,一步一个脚印地走向未来!

未来的你一定会感谢今天学习的你。

—— 心灵鸡汤

本文章到这里就结束啦~感兴趣的小伙伴可以复制代码去试试哦 😝

👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pyecharts从入门到精通-地图专题Map-世界地图和中国城市地图

文章目录 参考安装与查看pyecharts地图实现-Geo数据集查看读取数据生成中文国家名称国家中文和英文名称字典:根据字典&#xff0c;生成国家中文名查看没有转换成功的国家中文有哪些过滤包含中文国家名的数据 可视化人口数据显示中国城市地图数据 拓展-pyecharts中Map源码拓展-p…

开放耳机有什么优缺点,推荐几款不错的开放式耳机

​由于骨传导耳机可以保持耳朵的开放&#xff0c;长时间佩戴不会有闷热感&#xff0c;同时可以在运动中保持安全&#xff0c;因此被越来越多的人接受。在目前市面上骨传导耳机品牌众多&#xff0c;价格从几十元到上千元不等&#xff0c;为了让大家更好地挑选适合自己的骨传导耳…

java获取两个日期之间的所有日期

1、获取日期的过程&#xff1a; 首先创建一个数组&#xff0c;然后在数组的末尾加上一个日期。当我们有两个日期时&#xff0c;可以把这两个日期当做是不同的数组&#xff0c;然后使用 next函数把这两个日期之间的所有时间都获取出来。 2、代码演示&#xff1a; 3、实现效果&am…

bat批处理文件无法执行

执行后弹出cmd窗口&#xff0c;但里面命令未执行 方案一&#xff1a; 1、打开开始菜单——控制面板 2、点击系统和安全——系统 3、点击左上角的“高级系统设置” 4、切换到“高级”选项卡&#xff0c;点击下方的“环境变量” 5、在用户变量下方点击“新建”&#xff0c;…

3.2.3队列的链式实现

队列的链式实现 注意声明队头指针和队尾指针作用 (1)插入节点的时候只要rear指针指向结点的next指针指向的位置&#xff1b; (2)删除只要front指指针指向的头节点next指针指向的位置删除&#xff1b; &#xff08;1&#xff09;初始化&#xff08;带头结点&#xff09; 初试化…

C++:多态的底层实现原理 -- 虚函数表

目录 一. 多态的原理 1.1 虚函数表 1.2 多态的实现原理 1.3 动态绑定与静态绑定 二. 多继承中的虚函数表 2.1 虚函数表的打印 2.2 多继承中虚函数表中的内容存储情况 一. 多态的原理 1.1 虚函数表 对于一个含有虚函数的的类&#xff0c;在实例化出来对象以后&#xff0…

Docker部署SpringBoot+Vue项目

1.项目部署规划 1.后端多模块项目blog以及各模块运行端口&#xff1a; 前台服务模块sangeng-blog->7777&#xff0c;后台服务模块sangeng-admin->8989&#xff0c;公共模块sangeng-framework 2.前端前台Vue项目&#xff1a;sg-blog-vue->80 3.前端后台Vue项目&#x…

如何在AWS EKS上部署安装nginx ingress controller

Ingress Controller Ingress Controller 通常是一个负载均衡器&#xff0c;用于将外部流量路由到您的 Kubernetes 集群&#xff0c;并负责 L4-L7 网络服务 Ingress controller 仅覆盖 L7 流量&#xff0c;而入口重新路由 HTTP 和 HTTPS 流量 Type of Ingress Controllers C…

QT编程集成环境在Ubuntu中如何使用ROS工程?

文章目录 0.引言1.安装Qt Creator&#xff08;带ROS插件&#xff09;2.创建ROS工程3.创建功能包4.创建节点5.添加编译规则6.编译运行 0.引言 在进行ROS开发过程中&#xff0c;会创建许多功能包和源代码文件&#xff0c;这些文件少量时&#xff0c;手动管理还能接受&#xff0c;…

微搭低代码学习之数据收集

低代码和开发之间的关系 低代码平台是一种快速构建应用程序的工具&#xff0c;旨在提高开发效率。它们提供了一种基于图形用户界面的方式来创建应用程序&#xff0c;而无需编写大量的代码。使用低代码平台&#xff0c;开发人员可以更快速地构建和交付应用程序&#xff0c;从而缩…

nginx--HTTPS服务

目录 1.为什么要使用https 2.https协议的实现 1.对称加密 2.非对称加密 3.https加密 3.生成密钥和CA证书需要的依赖 1.查看是否有装openssl 2.查看nginx是否有 --with-http_ssl_module 4.生成密钥和CA证书步骤 步骤一、生成key密钥 步骤二、通过密钥去生成证书签名请求文件…

Java多例Bean的应用场景-easyExcel导入

目录 1. bean注入方式&#xff08;IOC&#xff09;2. 有状态会话bean和无状态会话bean3. 单例模式和多例模式4. 深挖多例模式应用场景&#xff1f; 1. bean注入方式&#xff08;IOC&#xff09; 2. 有状态会话bean和无状态会话bean 有状态会话bean&#xff1a;每个用户有自己特…

2023什么电脑配置适合机器学习和人工智能

机器学习和人工智能应用有多种类型——从传统的回归模型、非神经网络分类器和以 Python SciKitLearn 和 R 语言的功能为代表的统计模型&#xff0c;到使用 PyTorch 和 TensorFlow 等框架的深度学习模型. 在这些不同类型的 ML/AI 模型中&#xff0c;也可能存在显着差异。“最佳”…

不用ChatGPT,只用CodeGeeX with Chat!一样实现智能问答

在ChatGPT推出后&#xff0c;许多人发现&#xff0c;它在编程方面也具有强大的能力——在编写代码过程中&#xff0c;如果遇到问题&#xff0c;可以不必去搜索引擎寻找答案&#xff0c;而是直接向ChatGPT提问。不过&#xff0c;在申请使用一些功能时&#xff0c;需要先等待各种…

机器人感知与控制关键技术及其智能制造应用

源自&#xff1a;自动化学报 作者&#xff1a;王耀南 江一鸣 姜娇 张辉 谭浩然 彭伟星 吴昊天 曾凯 摘 要 智能机器人在服务国家重大需求, 引领国民经济发展和保障国防安全中起到重要作用, 被誉为“制造业皇冠顶端的明珠”. 随着新一轮工业革命的到来, 世界主要工业国…

【Linux】System V IPC-进程信号

进程信号 信号的概念信号的产生信号的种类信号的处理方式信号的注册信号的注销信号的自定义处理方式信号的捕捉流程信号的阻塞常见的程序崩溃父子进程进程等待自定义信号处理方式volatile关键字 信号的概念 信号是一个软件中断&#xff0c;实际上是操作系统告诉进程需要进程执行…

08 - 文章详情页面

文章详情页面 8-1&#xff1a;开篇 从本章开始我们要进入文章详情的页面开发。 在文章详情页面可以展示&#xff1a; 文章标题作者信息发布时间文章内容文章评论 同时你可以在这里进行&#xff1a; 作者关注文章评论文章点赞文章收藏 等操作。 基本功能大家可以进入到我…

IT知识百科:什么是暴力破解?

暴力破解是一种常见的网络安全攻击方法&#xff0c;它利用计算机程序自动尝试大量的密码组合来破解密码。这种攻击方法通常用于获取未经授权的访问权限&#xff0c;如入侵网络系统或个人账户。在本文中&#xff0c;我们将探讨暴力破解的原理、工具和防范方法。 暴力破解的原理 …

WPS表格的重复项使用方法

重复项就是指一列内容中有重复一样的值&#xff0c;或者两列数据对比后是否有重复的值&#xff0c;而在WPS表格中提供了直接标记重复值&#xff08;高度重复项&#xff09;&#xff0c;删除重复值和限制重复值在一个单元格区域中输入。 【WPS表格的高度重复项】 作用是&#…

【K8S系列】深入解析DNS

序言 世界上最幸福的事之一&#xff0c;莫过于经过一番努力后&#xff0c;所有东西正慢慢变成你想要的样子。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 Kubernet…