您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Python編程開發技巧的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一、小數保留指定位小數
1.%f 方法
f = 1.23456f1 = '%.4f' % f f2 = '%.2f' % fprint(f1,type(f1))print(f2,type(f2))
打印
1.2346 <class 'str'>1.23 <class 'str'>
易知,這種方法會進行四舍五入,但是將浮點型轉化成了字符串值,已不再是原始的數值。
2.format函數
f = 1.23456f1 = format(f,'.4f')f2 = format(f,'.2f')print(f1,type(f1))print(f2,type(f2))
打印
1.2346 <class 'str'>1.23 <class 'str'>
同理,這種方法也會進行四舍五入,但是將浮點型轉化成了字符串值,已不再是原始的數值。
3.round()函數
a = 1.23456b = 2.355c = 3.5d = 2.5a1 = round(a, 3)b1 = round(b, 2)c1 = round(c)d1 = round(d)print(a1,type(a1))print(b1,type(b1))print(c1,type(c1))print(d1,type(d1))
打印
1.235 <class 'float'>2.35 <class 'float'>4 <class 'int'>2 <class 'int'>
可以看出,round()函數最后得到的是數值(浮點型或整型),但是在“舍”和“入”的規律上不一定:
(1)round(x,n)函數中,是否進位或四舍五入,取決于n位以及n+1位小數的值
(2)只有當n+1位數字是5的時候,容易混淆,如果n為偶數,則n+1位數是5,則進位,例如round(1.23456,3)最終變為1.235
(3)如果n為奇數,則n+1位是數5,那不進位,例如round(2.355,2),最終為2.35
(4)如果n為0,即沒有填寫n的時候,最終結果與上面相反,即整數部分為偶數的時候,小數位5不進位,例如(round(2.5)變為2)。
(5)整數部分為奇數的時候,小數位5進位。(round(3.5)變為4)
4.直接截斷
a = int(1.23456 * 1000) / 1000print(a)
打印1.234
這種方法簡單粗暴,直接去掉后邊的,不管是否大于5。
二、判斷變量的數據類型
1.type():
a = 1.23print(type(a))
打印<class 'float'>
。
2.isinstance()
原型為isinstance(x, A_tuple)
,
a = 1.23tp = isinstance(a,float)print(tp)
打印True
。
3.class.__name__屬性
使用變量的__class__.__name__
屬性 ,這也是type()
方法的實質:
num = 1.23print(num.__class__.__name__)
打印:
float
三、Python中的類方法(@classmethod)
python做面向對象編程的時候,經常需要使用classmethod
類方法,這并不是類中的方法。
類方法也算一種實用的技巧,簡單描述之:“類方法讓類模板具有記憶力”。
類模板就是我們所定義的類。在普通情況下,不使用類方法對類進行實例化,類本身是不具有記憶性的。只是當一個靜態模板被套用多次而已。如果我們想讓類在每一次實例化之后,都能記載一些記憶,會對很多操作很有用。
class Man: id = 0 # 類變量 def __init__(self, name): self.name = name self.id = self.id_number() @classmethod def id_number(cls): cls.id += 1 return cls.id a = Man('A')print(a.id)b = Man('B')print(b.id)
打印
12
對Man這個類進行實例化2次,每個實例的id都不一樣。這就依靠類方法來實現了:首先,用@classmethod
描述類方法,然后用"cls"代表本類。類方法對類屬性進行的處理是有記憶性的。
需要注意的是,類方法處理的變量一定要是類變量。因為在類方法里你用不了self來尋址實例變量,所以需要把類變量放到最前面描述,如上面的"id=0"所示。類變量是可以被self訪問的,所以,在類變量定義好了以后,不需要在_init_函數里對類變量再一次描述。所以,上面代碼里self.id不一定需要。
四、str.format與制表符\t設置中文對齊
str.format對字符串進行格式化,{:<x}
的語法表示左對齊,{:>x}
為右對齊,{:^x}
為居中),少于x位自動補齊(默認為空格補齊),但是對于中文字符并不能很好地支持,所以會導致有多行中文字符串時出現不能對齊的現象,需要考慮到字符串所占長度并將中文字符串進行編碼后再計算。
#name是包含中文的字符串,22是整個字符串一行的總長度,一般要顧及測試才能得到,\t后的x是一標記字符,可換為別的所需的字符串print('[{string:<{len}}\tx'.format(string=string+']',len=22-len(string.encode('GBK'))+len(string)))
具體可參考https://blog.csdn.net/excaliburrr/article/details/76794451
五、datetime模塊timedelta類的使用
timedelta對象表示兩個不同時間之間的差值, 這個差值的單位可以是:天、秒、微秒、毫秒、分鐘、小時、周。
如果使用time模塊對時間進行算術運算,只能將字符串格式的時間和struct_time格式的時間對象先轉換為時間戳格式,然后對該時間戳加上或減去n秒,最后再轉換回struct_time格式或字符串格式,這顯然很不方便。而datetime模塊提供的timedelta類可以讓我們很方面的對datetime.date
, datetime.time
和datetime.datetime
對象做算術運算,且兩個時間之間的差值單位也更加容易控制。
datetime.timedelta類的定義:
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, hours=0, weeks=0)
所有參數都是默認參數,因此都是可選參數。參數的值可以是整數或浮點數,也可以是正數或負數。內部值存儲days、seconds 和 microseconds,其他所有參數都將被轉換成這3個單位:
1毫秒轉換為1000微秒
1分鐘轉換為60秒
1小時轉換為3600秒
1周轉換為7天
然后對這3個值進行標準化,使得它們的表示是唯一的:
microseconds : [0, 999999]
seconds : [0, 86399]
days : [-999999999, 999999999]
類屬性:
類屬性名稱 | 描述 |
---|---|
timedelta.min | timedelta(-999999999) |
timedelta.max | timedelta(days=999999999, hours=23, minutes=59, seconds=59, microseconds=999999) |
timedelta.resolution | timedelta(microseconds=1) |
實例方法和屬性:
實例方法/屬性名稱 | 描述 |
---|---|
td.days | 天 [-999999999, 999999999] |
td.seconds | 秒 [0, 86399] |
td.microseconds | 微秒 [0, 999999] |
td.total_seconds() | 時間差中包含的總秒數,等價于: td / timedelta(seconds=1) |
方法/屬性 | 描述 |
---|---|
datetime.datetime.now() | 返回當前本地時間(datetime.datetime對象實例) |
datetime.datetime.fromtimestamp(timestamp) | 返回指定時間戳對應的時間(datetime.datetime對象實例) |
datetime.timedelta() | 返回一個時間間隔對象,可以直接與datetime.datetime對象做加減操作 |
>>> import datetime>>>>>> datetime.timedelta(365).total_seconds() # 一年包含的總秒數31536000.0>>> dt = datetime.datetime.now()>>> dt + datetime.timedelta(3) # 3天后datetime.datetime(2020, 1, 22, 11, 17, 0, 214877)>>> dt + datetime.timedelta(-3) # 3天前datetime.datetime(2020, 1, 16, 11, 17, 0, 214877)>>> dt + datetime.timedelta(hours=3) # 3小時后datetime.datetime(2020, 1, 19, 14, 17, 0, 214877)>>> dt + datetime.timedelta(hours=-3) # 3小時前datetime.datetime(2020, 1, 19, 8, 17, 0, 214877)>>> dt + datetime.timedelta(hours=3, seconds=30) # 3小時30秒后 datetime.datetime(2020, 1, 19, 14, 17, 30, 214877)
更多關于Python對日期、時間的處理可參考https://www.jb51.net/article/105840.htm。
六、獲取拋出的異常具體信息
很多時候,在Python運行拋出異常并接收到之后需要顯示異常的具體信息,包括異常內容、異常所在的行數和異常所在的Python文件等等,分別使用args[0]
、__traceback__.tb_lineno
和__traceback__.tb_frame.f_globals["__file__"]
屬性即可,示意如下:
def get_exception_info(): try: s = 2 / 0 except Exception as e: print('異常內容:', e.args[0]) print('異常行數:', e.__traceback__.tb_lineno) print('異常文件:', e.__traceback__.tb_frame.f_globals["__file__"])get_exception_info()
打印:
異常內容: pision by zero 異常行數: 8異常文件: XXX/test.py
七、使用BeautifulSoup庫去掉字符串中的HTML標簽
有時候,字符串中含有HTML標簽,如
text = """<p> <h2>Title</h2> <p>A long text........ </p> <a href=""> a link </a> </p>"""
需要得到'\nTitle\nA long text........ \n a link \n'
,可以使用正則表達式匹配,但是稍嫌麻煩,此時可以直接使用BeautifulSoup庫進行轉化,更加簡單,如下:
from bs4 import BeautifulSoup text = """<p> <h2>Title</h2> <p>A long text........ </p> <a href=""> a link </a> </p>"""clean_text = BeautifulSoup(text, "lxml").textprint(clean_text)
打印:
Title A long text........ a link
顯然,此時已經去掉了字符串中的HTML標簽。
感謝各位的閱讀!關于“Python編程開發技巧”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。