數學--import--math--cmath--random--PIL--

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

--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 <b, 則 b <= n <= 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 <b, 則 b <= n <= 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。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章