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