--********************************************************************************************************************************

--import------import cmath 模块---运算的是复数--------------对复数的处理,包含了一些用于复数运算的函数--------------跟math模块函数基本一致------------------------------------------------

--********************************************************************************************************************************

>>> cmath.sqrt(-1)    1j

>>> cmath.sqrt(9)     (3+0j)

>>> cmath.sin(1)      (0.8414709848078965+0j)

>>> cmath.log10(100)  (2+0j)

complex(a,b)    #建立a+bj的复数

complex('2+1j') #将字符串形式的复数转成复数

real(x)         #取复数x的实部

imag(x)         #取复数x的虚部

abs(x)          #求x的模

--********************************************************************************************************************************

--import------import math 模块---运算的是数学运算------------内置在标准库中的,所以不用安装,可直接使用----------------------------------------------------------------

--********************************************************************************************************************************

math模块 实现了许多对浮点数的数学运算函数. 这些函数一般是对平台 C 库中同名函数的简单封装, 所以一般情况下, 不同平台下计算的结果可能稍微地有所不同, 有时候甚至有很大出入

 sin(x) 求x的正弦(x是弧度)         sin(0.0)等于0.0

asin(x) 求x的反正弦(结果是弧度)     asin(0.0)等于0.0

 cos(x) 求x的余弦(x是弧度)      cos(0.0)等于1.0

acos(x) 求x的反余弦(结果是弧度) acos(2.0)等于0.0

 tan(x) 求x的正切(x是弧度)      tan(0.0)等于0.0       返回x弧度的正切值

atan(x) 求x的反正切(结果是弧度) atan(0.0)等于0.0       返回x的反正切弧度值。

atan2(y,x)返回给定的 X 及 Y 坐标值的反正切值。

degrees(x)将弧度转换为角度,        将弧度制表示的a转换成角度制表示的seta        如degrees(math.pi/2) , 返回90.0

radians(x)将角度转换为弧度

 modf(x)返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。

round(x [,n])返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。

 ceil(x)  取顶(为x取整),结果是不小于x的最小整数 ceil(-9.8)等于-9.0        ceil(9.2)等于10.0      返回数字的上入整数,如math.ceil(4.1) 返回 5

floor(x)  取底(为x取整),结果是不大于x的最大整数 floor(9.2)等于9.0        floor(-9.8)等于-10.0    返回数字的下舍整数,如math.floor(4.9)返回 4

trunc(x)  截断取整数部分

  exp(x) 求幂函数e` exp(1.0)等于2.71828     exp(2.0)等于7.38906     返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045

 fabs(x) 求x的绝对值 fabs(5.1)等于5.1      fabs(-5.1)等于5.1     返回数字的绝对值,如math.fabs(-10) 返回10.0

 fmod(x,y) 求x/y的余数,结果是浮点数 fmod(9.8,4.0)等于1.8

log10(x) 求x的对数(以10为底) log10(10.0)等于1.0     log10(100.0)等于2.0    返回以10为基数的x的对数,如math.log10(100)返回 2.0

  log(x)    如math.log(math.e)返回1.0,math.log(100,10)返回2.0

  pow(x,y) x的y次方 求x的y次方(xy) pow(2.7,7.0)等于128.0       pow(9.0,0.5)等于3.0    x**y 运算后的值。

factorial (x) 阶乘

isnan(x)  判断是否NaN(not a number)

 sqrt(x) 开平方     求x的平方根 sqrt(900.0)等于30.0    返回数字x的平方根,数字可以为负数,返回类型为实数,如math.sqrt(4)返回 2+0j

hypot(x,y)返回欧几里德范数 sqrt(x*x + y*y)   求直角三角的斜边长度,直边长度为x和y:  Sqrt(x2-y2) hypot(3.0,4.0)等于5.0

  abs(x)    返回数字的绝对值,如abs(-10) 返回 10

  cmp(x, y)如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1

  max(x1, x2,...)返回给定参数的最大值,参数可以为序列。

  min(x1, x2,...)返回给定参数的最小值,参数可以为序列。

--********************************************************************************************************************************

--import------import random 模块---获取随机数----------可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性------------

--********************************************************************************************************************************

seed([x])改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。

random.random()    随机生成一个0到1的随机符点数(实数),它在[0,1.0)范围内

                   random.random()           0.85415370477785668    随机浮点数

random.uniform(a, b)   随机生成下一个实数,它在[x,y]范围内。  用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成的随机数n: a <= n <= b。如果 a

                       print random.uniform(10, 20)   # 18.7356606526

                       print random.uniform(20, 10)   # 12.5798298022

                       print random.uniform(1, 10)     # 5.4221167969800881

random.randint(a, b)   用于生成一个指定范围内的整数(a是下限,b是上限)生成的随机数 n: a <= n <= b

                       print random.randint(0,99)      # 21       随机整数

                       print random.randint(12, 20)  # 生成的随机数 n: 12 <= n <= 20

                       print random.randint(20, 20)  # 结果永远是20

                       print random.randint(20, 10)  # 该语句是错误的。 下限必须小于上限

random.randrange([start], stop[, step]),从指定范围内,按指定基数递增的集合中 获取一个随机数(基数默认为1)   这篇文章就是对python生成随机数的应用程序的部分介绍

                random.randrange(10, 100, 2),结果相当于从[10, 12, 14, 16, ... 96, 98]序列中获取一个随机数。

                random.randrange(10, 100, 2)在结果上与 random.choice(range(10, 100, 2) 等效

                random.randrange(0, 101, 2)   # 42    随机选取0到100间的偶数

random.choice(seq)从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。

                  从序列中获取一个随机元素。其函数原型为:  random.choice(sequence)。参数sequence表示一个有序类型。这里要说明 一下:  sequence在python不是一种特定的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。有关sequence可以查看python手册数据模型这一章。下面是使用choice的一些

                print random.choice("学习Python")

                print random.choice(["JGood", "is", "a", "handsome", "boy"])

                print random.choice(("Tuple", "List", "Dict"))

                      random.choice('abcdefg&#%^*f')         # 'd'   随机字符

                      random.choice ( ['apple', 'pear', 'peach', 'orange', 'lemon'] )     # 'lemon'    随机选取字符串

random.shuffle(x[, random]) 将序列的所有元素随机排序   用于将一个列表中的元素打乱

                            p = ["Python", "is", "powerful", "simple", "and so on..."]

                            random.shuffle(p)

                            print p                    

                            >>> items = [1, 2, 3, 4, 5, 6]    洗牌

                            >>> random.shuffle(items)

                            >>> items       # [3, 2, 5, 6, 4, 1]

random.sample(sequence, k)  从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列

                            random.sample('abcdefghij', 3)      # ['a', 'd', 'b']  多个字符中选取特定数量的字符

                            list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

                            slice = random.sample(list, 5)  # 从list中随机获取5个元素,作为一个片断返回

                            print slice

                            print list  # 原有序列并没有改变

                            >>> import random

                            >>> import string

                            >>> string.join( random.sample(['a','b','c','d','e','f','g','h','i','j'], 3) ).replace(" ","")     # 'fih'   多个字符中选取特定数量的字符组成新字符串


如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与random模块中最常用的几个函数的关系,希望你会有所收获,以下就是这篇文章的介绍。

random.random()   用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,则生成随机数

n: a <= n <= b。如果 a

print random.uniform(10, 20)

print random.uniform(20, 10)

#----

#18.7356606526

#12.5798298022


#-*-coding:utf-8-*-

import datetime

now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

print now;

运行结果如下,输出当前的时间,时间格式根据strftime("%Y-%m-%d %H:%M:%S")而定,相应的格式,正如C语言的printf语句那样简单。

Python可以利用如下语句产生唯一的随机数:

import random;

print random.randint(0,100); #生成的随机整数n,其中0<=n<=100

据此,我们可以利用当前时间、随机数产生一个唯一的数字,用于一些上传文件,产生文件等场合,

考虑到极端情况,在1秒内有1000个用户上传文件,也不会出现冲突的最好情况,就是利用当前时间+0~1000的随机整数,构造一个随机数字:

唯一值得注意的是,拼接时间与字符串要转化成字符串才拼接,而不是直接相加,由于Python是没有变量声明的,直接相加则变成了数字之间的相加了。

同时注意,如果随机数随机到一个比10少的数字,应当在随机产生出来的数字前面补上一个0,使得产生的数字的位数是相同的。

具体代码如下:

#-*-coding:utf-8-*-

import datetime;

import random;

nowTime=datetime.datetime.now().strftime("%Y%m%d%H%M%S");#生成当前时间

randomNum=random.randint(0,100);#生成的随机整数n,其中0<=n<=100

if randomNum<=10:

  randomNum=str(0)+str(randomNum);

uniqueNum=str(nowTime)+str(randomNum);

print uniqueNum;

以下Python程序,将利用for设置10个测试用例来测试在一秒内产生的结果,代码如下:

#-*-coding:utf-8-*-

import datetime;

import random;

for i in range (0,10):

  nowTime=datetime.datetime.now().strftime("%Y%m%d%H%M%S");#生成当前时间

  randomNum=random.randint(0,100);#生成的随机整数n,其中0<=n<=100

  if randomNum<=10:

    randomNum=str(0)+str(randomNum);

  uniqueNum=str(nowTime)+str(randomNum);

  print uniqueNum;

得到的运行结果如下图,可以发生产生出来的数字没有一个是相同的:

--Python编程实现生成特定范围内不重复多个随机数的2种方法

这篇文章主要介绍了Python编程实现生成特定范围内不重复多个随机数的2种方法,涉及Python基于random生成随机数的常见操作技巧,需要的朋友可以参考下

本文实例讲述了Python编程实现生成特定范围内不重复多个随机数的2种方法。分享给大家供大家参考,具体如下:

在近期进行的一个实验中,需要将数据按一定比例随机分割为两个部分。这一问题的核心其实就是产生不重复随机数的问题。首先想到的递归的方法,然后才发现Python中居然已经提供了此方法的函数,可以直接使用。具体代码如下:

#生成某区间内不重复的N个随机数的方法

import random;

#1、利用递归生成

resultList=[];#用于存放结果的List

A=1; #最小随机数

B=10 #最大随机数

COUNT=10

#生成随机数的递归数学,参数counter表示当前准备要生成的第几个有效随机数

def generateRand(counter):

  tempInt=random.randint(A,B); # 生成一个范围内的临时随机数,

  if(counter<=COUNT): # 先看随机数的总个数是不是够了,如果不够

    if(tempInt not in resultList): # 再检查当前已经生成的临时随机数是不是已经存在,如果不存在

      resultList.append(tempInt); #则将其追加到结果List中

      counter+=1;# 然后将表示有效结果的个数加1. 请注意这里,如果临时随机数已经存在,则此if不成立,那么将直接执行16行,counter不用再加1

    generateRand(counter); # 不管上面的if是否成立,都要递归。如果上面的临时随机数有效,则这里的conter会加1,如果上面的临时随机数已经存在了,则需要重新再生成一次随机数,counter不能变化

generateRand(1);#调用递归函数,并给当前要生成的有效随机数的个序号置为1,因为要从第一个开始嘛

print(resultList)# 打印结果

#2、利用Python中的randomw.sample()函数实现

resultList=random.sample(range(A,B+1),COUNT); # sample(x,y)函数的作用是从序列x中,随机选择y个不重复的元素。上面的方法写了那么多,其实Python一句话就完成了。

print(resultList)# 打印结果

--Python实现基于权重的随机数2种方法

问题:

例如我们要选从不同省份选取一个号码,每个省份的权重不一样,直接选随机数肯定是不行的了,就需要一个模型来解决这个问题。

简化成下面的问题:

 字典的key代表是省份,value代表的是权重,我们现在需要一个函数,每次基于权重选择一个省份出来

{"A":2, "B":2, "C":4, "D":10, "E": 20}

解决:

这是能想到和能看到的最多的版本,不知道还没有更高效好用的算法。

#!/usr/bin/env python

# -*- coding: utf-8 -*-

#python2.7x

#random_weight.py

#author: [email protected] 2014-10-11

'''''

每个元素都有权重,然后根据权重随机取值

输入 {"A":2, "B":2, "C":4, "D":10, "E": 20}

输出一个值

'''

import random

import collections as coll

data = {"A":2, "B":2, "C":4, "D":6, "E": 11}

#第一种 根据元素权重值 "A"*2 ..等,把每个元素取权重个元素放到一个数组中,然后最数组下标取随机数得到权重

def list_method():

 all_data = []

 for v, w in data.items():

  temp = []

  for i in range(w):

   temp.append(v)

  all_data.extend(temp)

 n = random.randint(0,len(all_data)-1)

 return all_data[n]

#第二种 也是要计算出权重总和,取出一个随机数,遍历所有元素,把权重相加sum,当sum大于等于随机数字的时候停止,取出当前的元组

def iter_method():

 total = sum(data.values())

 rad = random.randint(1,total)

 cur_total = 0

 res = ""

 for k, v in data.items():

  cur_total += v

  if rad<= cur_total:

   res = k

   break

 return res

def test(method):

 dict_num = coll.defaultdict(int)

 for i in range(100):

  dict_num[eval(method)] += 1

 for i,j in dict_num.items():

  print i, j

if __name__ == "__main__":

 test("list_method()")

 print "-"*50

 test("iter_method()")

一次执行的结果

A 4

C 14

B 7

E 44

D 31

--------------------------------------------------

A 8

C 16

B 6

E 43

D 27

--python生成--指定长度的随机数密码--密码使用数字和字母组合

import random, string    #导入random和string模块

def GenPassword(length):

    numOfNum = random.randint(1,length-1)        #随机出数字的个数

    numOfLetter = length - numOfNum

    slcNum = [random.choice(string.digits) for i in range(numOfNum)]                    #选中numOfNum个数字

    slcLetter = [random.choice(string.ascii_letters) for i in range(numOfLetter)]       #选中numOfLetter个字母

    slcChar = slcNum + slcLetter          #打乱这个组合

    random.shuffle(slcChar)

    genPwd = ''.join([i for i in slcChar])       #生成密码

    return genPwd

if __name__ == '__main__':

    print GenPassword(6)

--python生成--不重复的随机数的代码---用的是筛选法--就是先随机生成一串数字,之后用下标来判断这些数字有没有重复,重复的就筛去

import random

print 'N must >K else error'

n=int(raw_input("n="))

k=int(raw_input("k="))

result=[]

x=range(n)

for i in range(k):

t=random.randint(i,n-1)

temp=x[i]

x[i]=x[t]

x[t]=temp

result.append(x[i])

print result

raw_input('Inpuy AnyKey to exit')

这是用算法生成的 其实python有方法的

random.sample(list, n)即是从list中随机选取n个不同的元素

import random

for i in range(4):

print random.sample(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], 7)

--********************************************************************************************************************************

--import------import PIL 模块---生成随机验证码,具有一定的参考价值----------------------------------------------------------------------------

--********************************************************************************************************************************

安装:  pip3 install pillow

基本使用

1. 创建图片

from PIL import Image

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))

# 在图片查看器中打开

# img.show()

# 保存在本地

with open('code.png','wb') as f:

 img.save(f,format='png')

2. 创建画笔,用于在图片上画任意内容

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))

draw = ImageDraw.Draw(img, mode='RGB')

3. 画点

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))

draw = ImageDraw.Draw(img, mode='RGB')

# 第一个参数:  表示坐标

# 第二个参数:  表示颜色

draw.point([100, 100], fill="red")

draw.point([300, 300], fill=(255, 255, 255))

4. 画线

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))

draw = ImageDraw.Draw(img, mode='RGB')

# 第一个参数:  表示起始坐标和结束坐标

# 第二个参数:  表示颜色

draw.line((100,100,100,300), fill='red')

draw.line((100,100,300,100), fill=(255, 255, 255))

5. 画圆

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))

draw = ImageDraw.Draw(img, mode='RGB')

# 第一个参数:  表示起始坐标和结束坐标(圆要画在其中间)

# 第二个参数:  表示开始角度

# 第三个参数:  表示结束角度

# 第四个参数:  表示颜色

draw.arc((100,100,300,300),0,90,fill="red")

6. 写文本

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))

draw = ImageDraw.Draw(img, mode='RGB')

# 第一个参数:  表示起始坐标

# 第二个参数:  表示写入内容

# 第三个参数:  表示颜色

draw.text([0,0],'python',"red")

7. 特殊字体文字

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))

draw = ImageDraw.Draw(img, mode='RGB')

# 第一个参数:  表示字体文件路径

# 第二个参数:  表示字体大小

font = ImageFont.truetype("kumo.ttf", 28)

# 第一个参数:  表示起始坐标

# 第二个参数:  表示写入内容

# 第三个参数:  表示颜色

# 第四个参数:  表示颜色

draw.text([0, 0], 'python', "red", font=font)

图片验证码

import random

def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):

code = []

img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))

draw = ImageDraw.Draw(img, mode='RGB')

def rndChar():

"""

生成随机字母

:return:

"""

return chr(random.randint(65, 90))

def rndColor():

"""

生成随机颜色

:return:

"""

return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))

# 写文字

font = ImageFont.truetype(font_file, font_size)

for i in range(char_length):

char = rndChar()

code.append(char)

h = random.randint(0, 4)

draw.text([i * width / char_length, h], char, font=font, fill=rndColor())

# 写干扰点

for i in range(40):

draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())

# 写干扰圆圈

for i in range(40):

draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())

x = random.randint(0, width)

y = random.randint(0, height)

draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())

# 画干扰线

for i in range(5):

x1 = random.randint(0, width)

y1 = random.randint(0, height)

x2 = random.randint(0, width)

y2 = random.randint(0, height)

draw.line((x1, y1, x2, y2), fill=rndColor())

img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)

return img,''.join(code)

if __name__ == '__main__':

# 1. 直接打开

# img,code = check_code()

# img.show()

# 2. 写入文件

# img,code = check_code()

# with open('code.png','wb') as f:

# img.save(f,format='png')

# 3. 写入内存(Python3)

# from io import BytesIO

# stream = BytesIO()

# img.save(stream, 'png')

# stream.getvalue()

# 4. 写入内存(Python2)

# import StringIO

# stream = StringIO.StringIO()

# img.save(stream, 'png')

# stream.getvalue()

pass

--********************************************************************************************************************************

--import------Matplotlib  模块---相关----------------------------------------------------------------------------

--********************************************************************************************************************************

Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形[1]  。

通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图,直方图,功率谱,条形图,错误图,散点图等。

Matplotlib基础知识

1.Matplotlib中的基本图表包括的元素

x轴和y轴

水平和垂直的轴线

x轴和y轴刻度

刻度标示坐标轴的分隔,包括最小刻度和最大刻度

x轴和y轴刻度标签

表示特定坐标轴的值

绘图区域

实际绘图的区域

2.hold属性

hold属性默认为True,允许在一幅图中绘制多个曲线;将hold属性修改为False,每一个plot都会覆盖前面的plot。

但是目前不推荐去动hold这个属性,这种做法(会有警告)。因此使用默认设置即可。

3.网格线

grid方法

使用grid方法为图添加网格线

设置grid参数(参数与plot函数相同)

.lw代表linewidth,线的粗细

.alpha表示线的明暗程度

4.axis方法

如果axis方法没有任何参数,则返回当前坐标轴的上下限

5.xlim方法和ylim方法

除了plt.axis方法,还可以通过xlim,ylim方法设置坐标轴范围

6.legend方法

两种传参方法:

【推荐使用】在plot函数中增加label参数

在legend方法中传入字符串列表

配置matplotlib参数

永久配置

matplotlib配置信息是从配置文件读取的。在配置文件中可以为matplotlib的几乎所有属性指定永久有效的默认值

安装级配置文件(Per installation configuration file)

Python的site-packages目录下(site-packages/matplotlib/mpl-data/matplotlibrc)

系统级配置,每次重新安装matplotlib后,配置文件会被覆盖

如果希望保持持久有效的配置,最好选择在用户级配置文件中进行设置

对本配置文件的最佳应用方式,是将其作为默认配置模板

用户级.matplotlib/matplotlibrc文件(Per user .matplotlib/matplotlibrc)

用户的Documents and Settings目录

可以用matplotlib.get_configdir()命令来找到当前用户的配置文件目录

当前工作目录

代码运行的目录

在当前目录下,可以为目录所包含的当前项目代码定制matplotlib配置项。配置文件的文件名是matplotlibrc

在Windows系统中,没有全局配置文件,用户配置文件的位置在C:\Documents and Settings\yourname\.matplotlib。

在Linux系统中,全局配置文件的位置在/etc/matplotlibrc,用户配置文件的位置在$HOME/.matplotlib/matplotlibrc。

动态配置

程序中配置代码

To finetune settings only for that execution; this overwrites every configuration file.

配置方法的优先级为:

Matplotlib functions in Python code

matplotlibrc file in the current directory

User matplotlibrc file

Global matplotlibrc file

rcParams方法

通过rcParams字典访问并修改所有已经加载的配置项


讲的很好

https://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html

--********************************************************************************************************************************

--import------decimal  模块---相关----------------------------------------------------------------------------

--********************************************************************************************************************************

Python提供了decimal模块用于十进制数学计算,它具有以下特点:


提供十进制数据类型,并且存储为十进制数序列;

有界精度:  用于存储数字的位数是固定的,可以通过decimal.getcontext().prec=x 来设定,不同的数字可以有不同的精度

浮点:  十进制小数点的位置不固定(但位数是固定的)


decimal的构建:


可以通过整数、字符串或者元组构建decimal.Decimal,对于浮点数需要先将其转换为字符串



decimal的context:


decimal在一个独立的context下工作,可以通过getcontext来获取当前环境。例如前面提到的可以通过decimal.getcontext().prec来设定小数点精度(默认为28):


1

2

3

4

5

6

7

>>> from decimal import Decimal as D

>>> from decimal import getcontext

>>> getcontext()

Context(prec=6, rounding=ROUND_HALF_EVEN, Emin=-999999999, Emax=999999999, capitals=1, flags=[Rounded, Inexact], traps=[DivisionByZero, InvalidOperation, Overflow])

>>> getcontext().prec = 6

>>> D(1)/D(3)

Decimal('0.333333')

decimal和float性能对比:


1

2

$: python -mtimeit -s 'from decimal import Decimal as D' 'D("1.2")+D("3.4")'

$: python -mtimeit -s 'from decimal import Decimal as D' '1.2+3.4'

我在虚拟机中测试前者耗时是后者的1.7k倍,但这在某些运算(例如财务运算)中是值得的,但如果要对非整数做上百次的运算,应坚持使用float。