• 主页
  • 相册
  • 随笔
  • 目录
  • 存档
Total 244
Search AboutMe

  • 主页
  • 相册
  • 随笔
  • 目录
  • 存档

Python厨书笔记-4

2019-12-19

数字日期和时间

1. 数字的四舍五入

  • 字符串

    1
    2
    3
    4
    5
    >>> x = 1234.56789
    >>> format(x, '0.2f')
    '1234.57'
    >>> format(x, 'e')
    '1.234568e+03
  • 数值

    1
    2
    >>> round(1.23, 1)
    1.2
    • 传给 round() 函数的 ndigits 参数可以是负数

      1
      2
      3
      4
      5
      >>> a = 1731
      >>> round(a, -1)
      730
      >>> round(a, -2)
      700
    • 要试着去舍入浮点值来”修正”表面上看起来正确的问题

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      In [1]: a=2.1

      In [2]: b=4.2

      In [3]: c=a+b

      In [4]: c
      Out[4]: 6.300000000000001

      In [5]: True if c == 6.3 else False
      Out[5]: False

      In [6]: True if a+b == 6.3 else False
      Out[6]: False

      # 没有必要👇
      # c = round(c, 2)
      • 这些错误是由底层CPU和IEEE 754标准通过自己的浮点单位去执行算术时的特征
    • decimal.Decimal

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      # 需要的话
      >>> from decimal import Decimal
      >>> a = Decimal('4.2')
      >>> b = Decimal('2.1')
      >>> a + b
      Decimal('6.3')
      >>> print(a + b)
      6.3
      >>> (a + b) == Decimal('6.3')
      True
      • 控制精度

        1
        2
        3
        4
        5
        6
        7
        8
        9
        >>> a = Decimal('1.3')
        >>> b = Decimal('1.7')
        >>> print(a / b)
        0.7647058823529411764705882353
        >>> with localcontext() as ctx:
        ... ctx.prec = 3
        ... print(a / b)
        ...
        0.765
      • decimal 模块实现了IBM的”通用小数运算规范”

    • math.fsum()

      1
      2
      3
      4
      5
      >>> nums = [1.23e+18, 1, -1.23e+18]
      >>> sum(nums) # Notice how 1 disappears
      0.0
      >>> math.fsum(nums)
      1.0

2. 进制转换

  • 带前缀

    1
    2
    3
    bin()
    oct()
    hex()
  • 不带

    1
    format(x,'b'/'o'/'x')
  • 无符号(本来是有符号的)

    如果你想产生一个无符号值,你需要增加一个指示最大位长度的值。比如为了显示32位的值,可以像下面这样写:

    1
    2
    3
    4
    5
    6
    >>> x = -1234
    >>> format(2**32 + x, 'b')
    '11111111111111111111101100101110'
    >>> format(2**32 + x, 'x')
    'fffffb2e'
    >>>

3. 随机数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 随机选择
>>> values = [1, 2, 3, 4, 5, 6]
>>> random.choice(values)
2
# 随机样本
>>> random.sample(values, 2)
[6, 2]
# 随机顺序
>>> random.shuffle(values)
>>> values
[2, 4, 6, 5, 3, 1]
# 随机整数
>>> random.randint(0,10)
2
# 0-1随机浮点数
>>> random.random()
0.9406677561675867
# 随机数种子
random.seed() # Seed based on system time or os.urandom()
random.seed(12345) # Seed based on integer given
random.seed(b'bytedata') # Seed based on byte data

4. 字符串改日期

还有一点需要注意的是, strptime() 的性能要比你想象中的差很多, 因为它是使用纯Python实现,并且必须处理所有的系统本地设置。 如果你要在代码中需要解析大量的日期并且已经知道了日期字符串的确切格式,可以自己实现一套解析方案来获取更好的性能。 比如,如果你已经知道所以日期格式是 YYYY-MM-DD ,你可以像下面这样实现一个解析函数

1
2
3
def parse_ymd(s):
year_s, mon_s, day_s = s.split('-')
return datetime(int(year_s), int(mon_s), int(day_s))
  • Cookbook
  • Program Language
  • Python
  • Cookbook
webserver搭建及sql注入
搭建简易XSS实验环境
  1. 1. 1. 数字的四舍五入
    1. 1.1. 2. 进制转换
  2. 2. 3. 随机数
  3. 3. 4. 字符串改日期
© 2024 何决云 载入天数...