1、對數值進行取整git
將浮點數取整到固定的小數位:roung(value, ndigits),ndigits能夠是負數,取整到十位、百位、千位等。算法
>>> round(1.456, 2) # 1.46dom
>>> round(16743, -3) # 17000函數
>>> format(1.2345, '0.3f') # 1.235性能
2、精確的小數計算spa
浮點數沒法精確表達出全部的十進制小數位。設計
0.3的二進制表示是無限循環,因此若是要精確表示0.3,計算機須要無限個二進制位才能作到。code
然而計算機的內存、CPU寄存器等等硬件單元都是有限的,只能表示有限的二進制位。orm
>>> from decimal import Decimal對象
>>> Decimal('4.2') + Decimal('2.1') # Decimal('6.3')
3、數值作格式化輸出
使用內建的format()函數便可。
>>> 'The value is {:0,.2f}'.format(123456.789) # 123,456.79
4、二進制、八進制和十六進制數
將一個整數轉換爲二進制、八進制和十六進制的文本字符串形式,分別使用內建的bin()、oct()、hex()函數便可。
>>> x = 1234
>>> bin(x) # '0b10011010010'
>>> oct(x) # '0o2322'
>>> hex(x) # '0x4d2'
不但願出現0b、0o、0x這樣的前綴,能夠使用format()函數
>>> format(x, 'b'), format(x, 'o'), format(x, 'x')
轉換回10進制:
>>> int('4d2', 16) # 1234
確保八進制數前添加0o前綴:
>>> os.chmod('script.py'. 0o755)
5、字節串中打包和解包大整數
>>> int.from_bytes(data, 'little')
>>> x.to_bytes(16, 'big')
6、複數運算
複數經過complex(real, imag)函數來指定,或者經過浮點數再加上後綴j來指定。
>>> a = complex(2, 4) # (2+4j)
>>> b = 3 - 5j
>>> a.real, a.imag, a.conjugate() # 實部、虛部以及共軛值
求正弦、餘弦或平方根使用cmath模塊
>>> cmath.sin(a), cmath.cos(a), smath.exp(a)
7、處理無窮大和 NaN(Not a number)
檢測是否出現該值用math.isinf()和math.isnan()函數
>>> float('inf'), float('-inf'), float('nan')
(1)無窮大值在數學計算中會進行傳播
(2)某些特定的操做會致使未定義的行爲併產生NaN的結果
(3)NaN會經過全部的操做進行傳播
8、分數的計算
fractions模塊處理設計分數的數學計算問題
>>> form fractions import Fraction
>>> a = Fraction(5, 4) # 5/4
>>> a.numerator, a.denominator # 5, 4
>>> float(a)
>>> x = 3.75
>>> y = Fraction(*x.as_integer_ratio()) # Fraction(15, 4)
11、隨機選擇
(1)從序列中挑選元素:
>>> random.choice([1, 2, 3, 4, 5])
(2)序列中隨機取N個元素:
>>> random.sample(values, N)
(3)打亂序列順序:
>>> random.shuffle(values)
(4)產生隨機整數
>>> random.randint(0,10) # 0~10範圍
(5)產生0~1均勻分佈的浮點數值:
>>> random.random()
(6)由N個隨機比特位所表示的整數:
>>> random.getrandbits(N)
(7)random模塊採用馬特賽特旋轉算法,這是一個肯定性算法,可是能夠經過 random.seed() 函數修改初始的種子值。
12、時間換算
利用 datetime 模塊來完成不一樣時間單位間的換算。
>>> from datetime import timedelta
>>> a = timedelta(days=2, hours=6, minutes=6)
>>> from datetime import datetime
>>> b = datetime(2019, 9, 11)
>>> c = b - a
>>> datetime.today()
處理時區、模糊時間範圍、計算節日的日期使用 dateutil 模塊,同時解決datetime不能計算月份的問題。
>>> from dateutil.relativedelta import relativedelta
>>> a + relativedelta(months=+1)
>>> d = relativedelta(b, a) # 計算相差的天數
>>> d.months, d.days
十3、計算上週 X的日期
使用datetime模塊完成計算例子:
def get_previous_byday(dayname, start_date=None): weekdays = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'] if start_date is None: start_date = datetime.today() day_num = start_date.weekday() day_num_target = weekdays.index(dayname) day_ago = (7 + day_num - day_num_target) % 7 if day_ago == 0: day_ago = 7 target_day = start_date - timedelta(days=day_ago) return target_day
使用dateutil模塊計算
>>> from datetime import datetime
>>> from dateutil.relativedelta import relativedelta
>>> from dateutil.rrule import *
>>> d = datetime.today()
>>> d+relativedelta(weekday=FR) # Next Friday
>>> d+relativedelta(weekday=FR(-1)) # Last Friday
十4、找出當月的日期範圍
循環迭代當月中的每一個日期。
from datetime import datetime,timedelta import calendar def get_month_range(start_day=None): if start_day is None: start_day = datetime.today().replace(day=1) _, days_in_month = calendar.monthrange(start_day.year, start_day.month) end_date = start_day + timedelta(days=days_in_month) return (start_day,end_date) a_day = timedelta(days=1) first_date, last_date = get_month_range() while first_date < last_date: print(first_date) first_date += a_day
(1)計算出月份中第一天的日期:datetime對象的replace(day=1)方法進行替換。
(2)calendat.monthrange() 函數,找出待求解的月份中有多少天,返回第一個工做日的星期(返回值0~6)和當月的天數(28~31)。
生成器實現例子:
from datetime import datetime,timedelta def get_range(start_day,end_day,step): while start_day < end_day: yield start_day start_day += step for k in get_range(datetime.today(),datetime(2019,10,1),timedelta(days=1)): print(k)
十5、將字符串轉換爲日期
datetime.strptime()方法支持許多格式化代碼,如%Y表明4爲數字表示的年份,%m表明2位數字月份,%d表明日期。
>>> from datetime import datetime
>>> text = '2019-9-11'
>>> datetime.strptime(text, ‘%Y-%m-%d’)
可是datetime.strptime()性能表現糟糕體如今處理各類各樣的系統區域設置。若是事先知道日期格式,能夠本身編寫代碼:
def parse_ymd(str_date): year_s, mon_s, day_s = str_date.split('-') return datetime(int(year_s), int(mon_s), int(day_s))
十6、涉及時區的日期處理
時區名稱:pyzt.country_timezones,這是一個字典,使用ISO3166國家代碼做爲key來查詢所屬時區。
>>> pyzt.country_timezones['CN'] # ['Asia/Shanghai', 'Asia/Urumqi']
時區計算:先將本地時間-》UTC時間,UTC時間進行運算-》本地時間
>>> from pytz import timezone
>>> central = timezone('Asia/Shanghai')
>>> loc_d = central.localize(datetime.today())
>>> utc_d = loc_d.astimezone(pytz.utc)
>>> utc_d + timedelta(minutes=30)
>>> later_utc = utc_d + timedelta(minutes=30)
>>> later_utc.astimezone(central)