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

news2024/11/18 15:44:31

前言

大家早好、午好、晚好吖 ❤ ~欢迎光临本文章

环境使用:

  • Python 3.8

  • Pycharm 专业版

1.进制转换

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

算法分析:

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

  • 每次所得余数逆序即可

流程图绘制

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

>>> 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”

扩展:十进制转任意进制

  • 进制:变化的是数码和基数

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

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

代码实现:

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

算法分析:

  • chr,根据ASCII码获取字符;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.猜拳游戏

功能:

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

  2. 计算机出拳,使用random库随机产生;

  3. 玩家由键盘输入。

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]}"
    #python更多资料、教程、源码、知识可加小编V:qian97378免费获取

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,分母为奇数2n-1,正负交替

  • 计算项数越多,精度越高

  • 流程图绘制

代码实现

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个三角形的面积即可

  • 三角形三边长容易获得,再利用海伦-秦九韶公式可以计算面积:$\sqrt{p(p-a)(p-b)*(p-c)}$,其中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

#python更多资料、教程、源码、知识可加小编V:qian97378免费获取
def run():
    n = 20000
    s = calc_area(n)
    print(n * s)

if __name__ == "__main__":
    run()

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

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

蒙特卡罗投针实验求π

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

模拟投针实验:

  • 单位圆和其外接正方形

  • 随机投针

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

代码实现

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/695727.html

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

相关文章

playerdemo开源项目win运行详细配置

playerdemo开源项目win运行详细配置 在项目同目录建立文件夹lib 一、下载ffmpeg 下载32位的ffmpeg&#xff0c;放在lib/ffmpeg路径下 二、下载sdl2 下载sdl2也放在 lib/sdl2路径下 三、配置 .pro文件 win32 { LIBS -L$$PWD/lib/SDL2/lib/x86 \-L$$PWD/lib/ffmpeg-4.2.…

springboot增加logback日志记录ip

1、增加logback配置文件&#xff1a; public class IPLogConfig extends ClassicConverter {Overridepublic String convert(ILoggingEvent event) {RequestAttributes requestAttributes RequestContextHolder.getRequestAttributes();if (requestAttributes null) {return…

could not read ok from ADB Server

ADB不能连接&#xff1a; D:\adb\platform-tools>adb.exe devices * daemon not running; starting now at tcp:5037 could not read ok from ADB Server * failed to start daemon adb.exe: failed to check server version: cannot connect to daemon关闭防火墙可以解决。…

星辰秘典:揭示Python项目的宇宙奥秘——宇宙星空模拟器

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;html css js&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;你好&#x…

Unity | HDRP高清渲染管线学习笔记:Post-processing后处理效果

目录 一、后处理效果顺序 二、16个后处理效果 1. Tonemapping&#xff08;色调映射&#xff09; 2.White Balance&#xff08;白平衡&#xff09; 3. Bloom&#xff08;泛光&#xff09; 3.1 Quality 3.2 Bloom 3.2.1 Threshold&#xff08;临界值&#xff09; 3.2.2 I…

为什么 Java 是我心中的 TOP 1

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

10张读书笔记思维导图|让你告别书荒

又到了2023年下半年了&#xff0c;很多朋友又开始计划新一轮的读书计划&#xff0c;可是不知道读什么&#xff1f;也不知道怎么读&#xff1f; 今天小P就给大家分享30张思维导图读书笔记&#xff0c;让你在读书之前先了解书里讲了什么&#xff1f;帮你快速筛选自己喜欢的且有用…

47从零开始学Java之详解final修饰符、常量、常量方法与常量类

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 壹哥之前跟大家说过&#xff0c;在面向对象中&#xff0c;有abstract、static和final 这3个核心修饰符…

使用XLSX.utils.sheet_to_json()解析excel,给空的单元格赋值为空字符串

前言 今天用到XLSX来解析excel文件&#xff0c;调用XLSX.utils.sheet_to_json(worksheet)&#xff0c;发现如果单元格为空的话&#xff0c;解析出来的结果&#xff0c;就会缺少相应的key&#xff08;如图所示&#xff09;。但是我想要单元格为空的话&#xff0c;值就默认给空字…

BUUCTF刷题之路--ez_pz_hackover_20161

检查开启的保护&#xff1a; 32位程序&#xff0c;没有开启保护。看到这大概率猜到是可以利用shellcode。接着IDA查看下逻辑&#xff1a; 主函数&#xff1a; header函数&#xff1a; chall函数&#xff1a; 大致讲解下程序逻辑。首先会要求你输入一个名字。存入s这个缓冲区中。…

Redis7【④ 事务 管道】

1. Redis事务 Redis 事务&#xff08;Transaction&#xff09;是一组 Redis 命令的集合&#xff0c;这些命令被当作一个整体&#xff0c;按顺序地串行化执行&#xff0c;而不会被其他命令插入。 Redis 事务使用 MULTI、EXEC、WATCH、DISCARD 和 UNWATCH 这些命令来实现。 1.1…

Linux系统:进程控制

文章目录 1 创建进程2 进程终止2.1 进程退出情况2.2 进程终止的常见方式2.2.1 return语句2.2.2 exit()函数2.2.3 _exit()函数 3进程等待3.1 进程等待的重要性3.2 进程等待的方法3.2.1 wait()方法3.2.2 waitpid()方法 4 进程替换4.1 替换原理4.2 替换函数 1 创建进程 fork()函数…

mediapipe 手势节点识别自动控制音量

参考&#xff1a;https://www.computervision.zone/topic/volumehandcontrol-py/ 主函数&#xff1a; VolumeHandControl.py import cv2 import time import numpy as np import HandTrackingModule as htm import math from ctypes import cast, POINTER from comtypes imp…

[问题解决] ubuntu 18.04 GPU驱动安装

删除当前显卡驱动[参考] sudo apt-get purge nvidia* 查看推荐驱动 sudo ubuntu-drivers devices 安装对应驱动 sudo apt install nvidia-driver-530 验证安装是否成功&#xff1a;nvidia-smi

「一本通 3.2 例 3」架设电话线

题目大意 在加权无向图上求出一条从 号结点到 号结点的路径&#xff0c;使路径上第 大的边权尽量小。 思路 由于是一次性的&#xff0c;且这题数据极小&#xff0c;考虑 正常情况下是来更新数组的&#xff0c;不过这次是更新 表示第个节点&#xff0c;&#xff08;可以…

springboot引入外部sdk,以及在maven中配置,以及连同sdk打包

目录 1 安置sdk 2 配置maven配置文件 3 刷新maven即可 4 打包配置 1 安置sdk 将外部的sdk放在项目的指定目录下&#xff0c;我选择放在resource/sdk的目录下 示例&#xff1a; 2 配置maven配置文件 打开pom.xml&#xff0c;新增以下的依赖配置 具体如下所示&#xff1a; …

C# OpenCvSharp 透视变换(图像摆正)Demo

效果 Demo下载 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using OpenCvSharp; using OpenCvSha…

王爽《汇编语言》期末考试题库(附答案)

单选题 第一章 PC机的最小信息单位是&#xff08; &#xff09;。 A. bit B. 字节 C. 字长 D. 字 A PC机的最小信息单位是比特(bit)&#xff0c;常用来表示一位二进制数字&#xff08;0或1&#xff09;。字节(byte)是计算机中常用的数据单位&#xff0c;一个字…

vscode中ModuleNotFoundError: No module named ‘torch‘解决方法

文章目录 遇到的问题解决方法参考 遇到的问题 使用vscode训练模型&#xff0c;没有使用远程服务器&#xff0c;使用本地运行代码&#xff0c;显示“ModuleNotFoundError: No module named ‘torch’” 解决方法 这是因为没有选择合适的python解释器。如何选择正确的解释器呢&…

【HDFS实战】HDFS上的数据均衡

HDFS上的数据均衡简介 文章目录 HDFS上的数据均衡简介重新平衡数据节点之间的数据块相关命令 重新平衡DN内磁盘间的数据相关命令PlanExecuteQueryCancelReport 相关配置调试 HDFS上的balance目前有两类&#xff1a; Balancer&#xff1a;节点之间的balanceDisk Balancer&#x…