python取反函数_Python优雅的反函数int(string,base)
我曾经用同样的目标编写了自己的函数,但现在却令人尴尬地复杂化了。
from math import log, ceil, floor
from collections import deque
from itertools import repeat
from string import uppercase, digits
import re
__alphanumerals = (digits + uppercase)
class InvalidBaseError(ValueError): pass
class FloatConvertError(ValueError): pass
class IncorrectBaseError(ValueError): pass
def getbase(number, base=2, frombase = 10):
if not frombase == 10:
number = getvalue(number, frombase)
#getvalue is also a personal function to replicate int(number, base)
if 1 >= base or base >= len(__alphanumerals) or not floor(base) == base:
raise InvalidBaseError("Invalid value: {} entered as base to convert
to. n{}".format(base,
"Assert that the base to convert to is a decimal integer."))
if isinstance(number, str):
try:
number = atof(number)
except ValueError:
#The first check of whether the base is 10 would have already corrected the number
raise IncorrectBaseError("Incorrect base passed as base of number -> number: {} base: {}".format(number, frombase))
#^ v was supporting float numbers incase number was the return of another operation
if number > floor(number):
raise FloatConvertError("The number to be converted must not be a float. {}".format(number))
isNegative = False
if number < 0:
isNegative = True
number = abs(number)
logarithm = log(number, base) if number else 0 #get around number being zero easily
ceiling = int(logarithm) + 1
structure = deque(repeat(0, ceiling), maxlen = ceiling)
while number:
if number >= (base ** int(logarithm)):
acceptable_digit = int(number / (base ** floor(logarithm)))
structure.append(acceptable_digit if acceptable_digit < 10 else __alphanumerals[acceptable_digit])
number -= acceptable_digit * (base ** floor(logarithm))
else:
structure.append(0)
logarithm -= 1
while structure[0] == 0:
#the result needs trailing zeros
structure.rotate(-1)
return ("-" if isNegative and number else "") + reduce(lambda a, b: a + b, map(lambda a: str(a), structure))
我认为函数strbase应该只支持base> = 2和&lt; = 36以防止与python中的其他工具冲突,例如int。
另外,我认为只应该使用一个字母大小写字母,最好是大写,以防止与其他函数如int冲突,因为它会认为“a”和“A”都是10。
from string import uppercase
dig_to_chr = lambda num: str(num) if num < 10 else uppercase[num - 10]
def strbase(number, base):
if not 2 <= base <= 36:
raise ValueError("Base to convert to must be >= 2 and <= 36")
if number < 0:
return "-" + strbase(-number, base)
d, m = divmod(number, base)
if d:
return strbase(d, base) + dig_to_chr(m)
return dig_to_chr(m)
python取反函数_Python优雅的反函数int(string,base)相关推荐
- python取整数_python 取整函数
向下取整的运算称为Floor,用数学符号⌊⌋表示:向上取整的运算称为Ceiling,用数学符号⌈⌉表示.例如: ⌊59/60⌋=0 ⌈59/60⌉=1 ⌊-59/60⌋=-1 ⌈-59/60⌉=0 向 ...
- python 取名字_python 获取如何获取类的名称?
标准库importlib 内置getattr 内置dir 这几个可以帮助你实现想要的需求,这也是项目当中lazyImport很常见的一种方式. 题主可以自己先根据文档尝试怎么写,有空我再写具体怎么实现 ...
- python exchangelib 删除邮件_Python优雅的操作Exchange邮箱——exchangelib模块使用介绍...
最近想把公司邮箱的附件给下载下来,附件好多都是我整理的报告和文档,一个个去下载明显太傻,碰到这种问题第一个想到的就是Python啦 需求很简单,只需要登录自己的Exchange邮箱,然后遍历所有邮件, ...
- python取元素_python 如何提取对象内的元素
python 菜鸟一枚,手上有 一个对象如下 Message(MessageMediaDocument(document=Document(id=620850100255067285, access_ ...
- python报错ValueError: invalid literal for int() with base 10解决方法
原因:把带有小数的字符串强转为int 解决方法: 如果你非要用int,那就在int中加个float,例如: int(float(xxx)) 如果只是想将提取的字符串转换为数字,那就将int改为floa ...
- python字节流分割_Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
问题描述 最近做一个项目,是用Python进行相关的串口操作.及将相关指令通过串口发给设备,设备根据发过来的指令来做出相应的操作,所用的库是Pyserial.在最初开发时,出现的问题在于:别人给的文档 ...
- python字节流处理_Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
问题描述 最近做一个项目,是用Python进行相关的串口操作.及将相关指令通过串口发给设备,设备根据发过来的指令来做出相应的操作,所用的库是Pyserial.在最初开发时,出现的问题在于:别人给的文档 ...
- python 优雅退出_Python学习教程:Python 使用 backoff 更优雅的实现轮询
我们经常在开发中会遇到这样一种场景,即轮循操作.今天介绍一个Python库,用于更方便的达到轮循的效果--backoff. Python学习教程:Python 使用 backoff 更优雅的实现轮询 ...
- math python 向上取整_Python成为专业人士笔记-各数学运算操作深度剖析
"专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com Python可以执行常见的数学运算符,包括整 ...
最新文章
- 浅谈单图像三维重建算法
- python自定义分页器()转自https://www.cnblogs.com/yuanchenqi/articles/7652353.html
- 深度优先搜索(DFS)相关习题
- 第三次作业(词频统计及其效能分析)
- flash写保护原理_为什么固态会掉盘?著名的30分钟大法修复是什么原理?
- htc816t Android go,HTC D816t(Desire D816t 移动4G)一键刷机图文教程详解
- 微软2013年笔试题详解及深入
- oracle数据导入/导出
- 如何安装win10与linux双系统,Windows10与CentOS 双系统共存完美教程
- this与bind(this)
- Day12:使用正则表达式
- 人脸识别系列(一):dlib安装和使用
- Android svc命令
- 程序员真的需要一台 Mac 吗?
- Java逐行读取文件
- mysql left join like_使用LEFT JOIN和LIKE mysql
- 项目质量管理中的新老7工具
- 【python】windows定时运行python脚本
- 触发器实现当一个表中字段改变时同时改变另一个表中字段值
- 数理统计学(Mathematic Statistics)的基本概念
热门文章
- 刚回到北京,倒时差中……
- linux下父子进程共享socket,多进程共享socket(Linux,Win32)
- php串行化,PHP串行化与JSON
- Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数
- 视觉编码(Visual Encoding)
- 批量插入以及数据存在重复就进行更新操作
- 编码:隐匿在计算机软硬件背后的语言(7)--存储器组织
- 安装laravel5.1项目命令
- Segment fault之痛
- php 中文 decode_php json_decode 解析中文