LAST UPDATE: August 18th 2018, 7:40:15 PM
最新的Python Weekly
(issue 347)推了edabit给我,那就平推一下,记一些有趣的/不会的/忘了的东西。
这个网站题目分类好像是做完题目投票的,这样子对各个阶段的人好像都很友好吧。
提了问题基本都有回复,好评。
还没改用最新Python
这个有点不开心。
题目加载页面有点慢……
map
vslist comprehension
- 虽然用
dis
反编译出来一模一样但是时间上有差别 map
和list comprehension
都需要调用相同的自定义函数时,map
快大概1/3
map
和list comprehension
都需要调用相同的内置函数时,有时候map
快2/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判长度是最方便的?