LAST UPDATE: August 18th 2018, 7:40:15 PM

最新的Python Weekly(issue 347)推了edabit给我,那就平推一下,记一些有趣的/不会的/忘了的东西。

这个网站题目分类好像是做完题目投票的,这样子对各个阶段的人好像都很友好吧。
提了问题基本都有回复,好评。
还没改用最新Python这个有点不开心。
题目加载页面有点慢……

  • map vs list comprehension

    • 虽然用dis反编译出来一模一样但是时间上有差别
    • maplist comprehension都需要调用相同的自定义函数时,map快大概1/3
    • maplist comprehension都需要调用相同的内置函数时,有时候map2/3(eg: abs),有时候速度基本相同(eg: max),这个是基于自己的测试得出的结论,有点迷……
  • 浮点数四舍五入:round

    • round(x[, n]) x四舍五入保留n位
  • Python中统计32位负数二进制位1的个数新姿势:bin(num & 0xffffffff).count('1')

  • 字符串乘以非正数得到空串

  • format格式化数字,还有各种填充啊对齐啊宽度啊不记了

数字 格式 输出 描述
1000000 {:,} 1,000,000 以逗号分隔数字
0.25 {:.2%} 25.00% 百分比格式
11 {:b} 1011 二进制
11 {:d} 11 十进制
11 {:o} 13 八进制
11 {:x} b 十六进制
11 {:b} 0b1011 带前缀二进制,相当于bin
11 {:#o} 0o13 带前缀八进制,相当于oct
11 {:#x} 0xb 带前缀十六进制,相当于hex
11 {:#X} 0Xb 带前缀十六进制
  • math.sqrt(x)x ** .5慢,毕竟是运算符和调用函数的差别

  • 求中位数statistics.median

    • 这可是个好东西啊,找时间 顺便学一波(计划 +1)
    • statistics的函数分两部分,下面这部分用于计算样本的平均值或特定值,没有记录的那部分主要用于计算标准差和方差
mean() 算术平均数
harmonic_mean() 调和平均数
median() 中位数
median_low() 中位数,序列长度为偶数时取较小值
median_high() 中位数,序列长度为偶数时取较大值
median_grouped() 中位数,具体没看懂
mode() 众数,序列中有多个众数时抛出StatisticsError

众数有多个的时候可以考虑用collections.Counter统计后进行处理

  • 前缀和itertools.accumulate

  • list.remove(x)只移除最前面一个x

  • itertools.groupby(iterable, key=None)

    • 按顺序迭代过程中,将key函数应用于每一项后,若相连的项值相同,则分为一组,每一组为(item_key, iterator)item_key为应用key函数后的值
    • eg:去除相连的重复项
      from itertools import groupby
      def unique_in_order(sequence):
          return [k for k, _ in groupby(sequence)]
      
    • itertools 是个好东西啊,找时间整理一下
  • bool值能直接运算,True -> 1, False -> 0

  • itertools.zip_longest可以把两个不等长列表合并,用None填充空缺的值

  • zip内置函数返回一个迭代器,用于聚合来自每个迭代器的元素

    • zip不止用来dict(zip(x, y)),这大概是以前不看文档造成的锅
    • zip中的第k个迭代器按顺序包含每个元素中的第k个
  • 求你记住range第三个参数……

  • 虽然不是什么优秀的东西但是这个调了很久的正则我还是想记一下啊,总之到现在在edabit两次写比较复杂的正则算是有收获吧

    ^(rgb\((?:\s*(?:([1-9]?\d%?)|(1\d\d)|(2[0-4]\d)|(25[0-5])|(100%))\s*)(?:,\s*(?:([1-9]?\d%?)|(1\d\d)|(2[0-4]\d)|(25[0-5])|(100%))\s*){2}\))|(rgba\((?:\s*(?:([1-9]?\d%?)|(1\d\d)|(2[0-4]\d)|(25[0-5])|(100%))\s*)(?:,\s*(?:([1-9]?\d%?)|(1\d\d)|(2[0-4]\d)|(25[0-5])|(100%))\s*){2},\s*(?:([01])|(0?\.\d+)|([1-9]?\d%)|(100%))\s*\))$
    
  • 用位运算符和加号求数字的逻辑反(这条用来膜超级无敌强的发发,真是太强啦)

    • ((~(x & ((~x) + 1)) + 1) >> 31) & 1 ^ 1
    • 另外答案里还有俩不错的
      • ((x >> 31) | ((~x + 1) >> 31)) + 1
        • 这个是将x-x用各自的符号位填充然后或起来,非0的数字得到0b11...11,加上1溢出到0
      • 1 >> ((~x >> 1) ^ ~x)
        • 这个当x = -1时是错的,但是想法应该是对的,把负数转正数,用1右移,类似1 >> (x * x)
    • 然后就发现了Python位运算左移右移位数最多不能超过C语言LLONG_MAX,否则OverflowError,当然左移这么多先是MemoryError
  • get请求参数转成字典可以使用urllib.parse.parse_qs

  • 连续比较多个数互不相等,直接a != b != c是错的,存在a == c的情况,三个数可以用c != a != b != c,但是当有更多个数的时候没办法这样写,大概转成set判长度是最方便的?