Python 編程實用技巧

1、小數保留指定位小數

1.%f 方法

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

打印python

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

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

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'>

同理,這種方法也會進行四捨五入,可是將浮點型轉化成了字符串值,已再也不是原始的數值。svg

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。ui

2、判斷變量的數據類型的兩種方法

1.type():

a = 1.23
print(type(a))

打印<class 'float'>編碼

2.isinstance()

原型爲isinstance(x, A_tuple)spa

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

打印True.net

3、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不必定須要。

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

具體可參考http://www.javashuo.com/article/p-wwwjhemp-gs.html