python3-cookbook中每個小節以問題、解決方案和討論三個部分探討了Python3在某類問題中的最優解決方式,或者說是探討Python3本身的資料結構、函式、類等特性在某類問題上如何更好地使用,這本書對于加深Python3的理解和提升Python編程能力的都有顯著幫助,特別是對怎么提高Python程式的性能會有很好的幫助,如果有時間的話強烈建議看一下,
本文為學習筆記,文中的內容只是根據自己的作業需要和平時使用寫了書中的部分內容,并且文中的示例代碼大多直接貼的原文代碼,當然,代碼多數都在Python3.6的環境上都驗證過了的,不同領域的編程關注點也會有所不同,有興趣的可以去看全文,
python3-cookbook:https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html
3.2 執行精確的浮點數運算
Python的浮點數計算是存在誤差的,但是在大多數領域這種誤差是被允許的,并且在性能上也是最快的,但是如果你的程式需要提供非常精確的計算,并且可以容忍一定的性能損耗,比如金融領域的計算,那么可以使用Decimal模塊,需要注意的是,Decimal模塊需要用字串的形式表示數字,
另外提一下,如果是進行舍入運算或其他計算操作,可以考慮使用內置函式round或者math模塊中的方法,
>>> a = 4.2 >>> b = 2.1 >>> a + b 6.300000000000001 >>> (a + b) == 6.3 False >>> (a + b) > 6.3 True >>> >>> from decimal import Decimal >>> a = Decimal('4.2') >>> b = Decimal('2.1') >>> a + b Decimal('6.3') >>> print(a + b) 6.3 >>> (a + b) == Decimal('6.3') True >>> >>> # decimal的舍入運算 >>> from decimal import localcontext >>> a = Decimal(1.3) >>> a Decimal('1.3000000000000000444089209850062616169452667236328125') >>> a = Decimal('1.3') >>> a Decimal('1.3') >>> b = Decimal('1.7') >>> print(a / b) 0.7647058823529411764705882353 >>> with localcontext() as ctx: ctx.prec = 3 print(a / b) 0.765 >>>
3.3 數字的格式化輸出
數字的格式化操作,包括浮點數和Decimal數字物件,可以使用內置的format函式或字串的format方法,指定寬度和精度的一般形式為[<>^]?width[,]?(.digits)?,?表示它前面的部分是可選的,<>^為對齊方式,width為寬度,逗號為千位符,.digits為精度,
>>> x = 1234.56789 >>> format(x, '0.2f') '1234.57' >>> format(x, '>10.1f') ' 1234.6' >>> format(x, '<10.1f') '1234.6 ' >>> format(x, '^10.1f') ' 1234.6 ' >>> format(x, ',') '1,234.56789' >>> format(x, '0,.1f') '1,234.6' >>> format(x, 'e') '1.234568e+03' >>> format(x, '0.2E') '1.23E+03' >>> 'The value is {:0,.2f}'.format(x) 'The value is 1,234.57' >>>
3.4 二八十六進制整數
如果想要將整數轉換為二進制、八進制或十六進制的數字字串,使用內置的bin()、oct()或hex()函式即可,或者使用format函式進行轉換,當然,反過來,想要將對應進制的數轉換為十進制的整數,直接使用int()即可,
>>> x = 1234 >>> # 帶有對應進制表示前綴:0b,0o,0x >>> bin(x) '0b10011010010' >>> oct(x) '0o2322' >>> hex(x) '0x4d2' >>> # 沒有對應進制表示前綴:0b,0o,0x >>> format(x, 'b') '10011010010' >>> format(x, 'o') '2322' >>> format(x, 'x') '4d2' >>> # 轉換為十進制 >>> int('4d2', 16) 1234 >>> int('10011010010', 2) 1234 >>> int('2322', 8) 1234 >>>
3.5 位元組到大整數的打包與解包
位元組字串到整數之間的轉換并不常用,但是遇到了,也可以考慮這種解決方案,即使用int.from_bytes()方法和int.to_bytes()方法,
>>> data = https://www.cnblogs.com/guyuyun/p/b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004' >>> int.from_bytes(data, 'little') 69120565665751139577663547927094891008 >>> int.from_bytes(data, 'big') 94522842520747284487117727783387188 >>> x = 94522842520747284487117727783387188 >>> x.bit_length() / 8 14.625 >>> x.to_bytes(15, 'little') b'4\x00#\x00\x01\xef\xcd\x00\xab\x90x\x00V4\x12' >>> x.to_bytes(15, 'big') b'\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004' >>>
3.15 字串轉換為日期
將字串轉為日期,可以使用datetime中的strptime()方法,但是專門記下這小節,是因為文中說這個方法是用純Python實作,并且效率并不是很好,如果是已知字串的格式,推薦自己寫一套決議轉換的代碼,我在平時的使用中也是有這種體驗,特別是轉換次數多了后感受就特別明顯,
>>> from datetime import datetime >>> text = '2012-09-20' >>> datetime.strptime(text, '%Y-%m-%d') datetime.datetime(2012, 9, 20, 0, 0) >>>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/190811.html
標籤:Python
