Python 程式設計實用技巧

cupyter發表於2020-01-13

一、小數保留指定位小數

1.%f 方法

f = 1.23456
f1 = '%.4f' % f
f2 = '%.2f' % f
print(f1,type(f1))
print(f2,type(f2))

列印

1.2346 <class 'str'>
1.23 <class 'str'>

易知,這種方法會進行四捨五入,但是將浮點型轉化成了字串值,已不再是原始的數值。

2.format函式

f = 1.23456
f1 = 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.23456
b = 2.355
c = 3.5
d = 2.5
a1 = 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) / 1000
print(a)

列印1.234
這種方法簡單粗暴,直接去掉後邊的,不管是否大於5。

二、判斷變數的資料型別的兩種方法

1.type():

a = 1.23
print(type(a))

列印<class 'float'>

2.isinstance()

原型為isinstance(x, A_tuple)

a = 1.23
tp = isinstance(a,float)
print(tp)

列印True

三、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)

列印

1
2

對Man這個類進行例項化2次,每個例項的id都不一樣。這就依靠類方法來實現了:首先,用@classmethod描述類方法,然後用"cls"代表本類。類方法對類屬性進行的處理是有記憶性的。

需要注意的是,類方法處理的變數一定要是類變數。因為在類方法裡你用不了self來定址例項變數,所以需要把類變數放到最前面描述,如上面的"id=0"所示。類變數是可以被self訪問的,所以,在類變數定義好了以後,不需要在_init_函式裡對類變數再一次描述。所以,上面程式碼裡self.id不一定需要。

四、str.format與製表符\t關於中文對齊

str.format對字串進行格式化,{:<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

相關文章