0%

python-cookbook-ch3

Chapter 3

Numbers, Dates, and Times

  1. 舍入小数到某一指定小数点

    1
    2
    round(1.23, 1) # 1.2
    round(1.27, 1) # 1.3

    采用四舍五入,如果第二个参数为负数,那么就会指示十位百位,,,以此类错

    1
    round(1627731, -1) # 1627730
  2. 进行准确的十进制计算

    1
    2
    3
    4
    5
    # Python, js等语言均有类似的问题
    a = 4.2
    b = 2.1
    a + b # 6.300000000000001
    (a + b) == 6.3 # False

    想要避免这种问题,使用Decimal

    1
    2
    3
    4
    5
    6
    from decimal import Decimal
    a = Decimal('4.2')
    b = Decimal('2.1')
    a + b # Deciaml('6.3')
    (a + b) == Decimal('6.3') # True
    (a + b) == 6.3 # False
  3. Python中的8进制与其他的语言不太相同
    二进制以0b开头
    十六进制以0x开头
    八进制以0o开头
    所以

    1
    2
    3
    os.chmod('script.py', 0755) # error
    ## 改为以下
    os.chmod('script.py', 0o755) # error
  4. 不仅仅可以从math中引入inf,也可以直接使用float('inf')来创建,同样的还有

    • float('nan')
    • float('-inf')
      但是需要注意的是,nan之间无法进行相等判断(inf可以),如
      1
      2
      3
      4
      a = float('nan')
      b = float('nan')
      a == b # False
      a is b # False
      所以如果要测试某一个数是否是nan,最好的办法就是使用math.isnan,虽然inf本身可以比较,但是也可以使用math.isinf来判断
  5. 使用Fraction来进行分数计算

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    from fractions import Fraction
    a = Fraction(5, 4)
    b = Fraction(7, 16)
    a + b # 27/16

    # 转化为小数
    float(a)
    # 获得分子与分母
    ## 分子
    a.numerator # 5
    a.denominator # 4

    # 创建时,如果可以约分将自动约分,且通过`numerator`/`denominator`获得的分子分母也为约分之后的分子分母
    c = Fraction(4, 18) # 等同于 c = Fraction(2, 9)
    # 可以将一个小数直接转化为分数
    d = 3.75
    y = Fraction(*x.as_integer_ratio()) # Fraction(15, 4)
    ## 但是同样有可能遇到问题
    Fraction(*1.2.as_integer_ratio()) # Fraction(5404319552844595, 4503599627370496)
    ## 可以通过上述的Decimal来获得正确的结果
    d = Decimal('1.2')
    Fraction(*d.as_integer_ration()) # (6,5)
  6. Python中的list可以通过乘法来扩展

    1
    2
    a = [1]
    a * 10 # [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

    同样可以扩展到字符串

    1
    2
    a = '123'
    a * 2 # '123123'

    有时候会很有用,尤其是字符串

  7. 日期相关
    用到再看,虽然csp里面好几次有相关的题目,奈何确实太繁琐