python晦涩知识点(二)

声明:一些很无聊的Python填空题,要是面试遇到,不要犹豫,一巴掌甩过去,然后说:“老子大老远跑过来面试,衣服都湿了,你就给我看这个?”开玩笑啦,反正很不爽就是了

1.count和len

>>> x, y = ???, ???
>>> x.count(y) > len(x)
True
意思是说有没有合适的x,y使得y在x中出现的次数大于x的长度。一般来说,字符串长度为5,我们会认为最多5个字母一样,出现5次,不会有多的。即"aaaaa".count("a")等于“aaaaa”长度

事实上x, y = "a", ""满足题意。因为任意字符串count("")等于其长度加1.
x = "任意字符串"
x.count("") == len(x)+1 > len(x)

2.max和in

>>> x, y = ???, ???
>>> y in x and y > max(x)
True
 一般来说,y in x成立,那么y应该<=max(x).因为y in x说明y是x子集,子集小于等于全集的最大值,y==max(x)是十分好实现好理解的,y>max(x)就比较难了。解题思路在于max,max返回的是一个元素,数量或者说长度为1,只要y长度比1大,并且某种类型比较大小时,长度参与计算,长的比短的大,如此推理,答案就出来了
x, y = "aaaaaaaaaaaaaaaaaa", "aa"
显然y in x成立。max(x)是"a", "aa">"a", 所以 y > max(x)成立。

3. 乘法顺序影响结果

>>> x, y, z = ???, ???, ???
>>> x * (y * z) != (x * y) * z
True
第一反应就是y和z都是负数,yz先乘变正数,接下来就是要找合适的x,满足x*1 != x*-1即可。很荣幸告诉你,Python里有,比如列表。[1] * n表示列表重复(翻倍)n次,但是n<=0时,当作清空列表。

x, y, z = [0,0], -1, -1

x * (y * z)结果是[0, 0], 但(x * y) * z结果是[].所以不等。

这只是站在Python层面解决问题,利用列表的冷门特例。下面给的答案,更有水平

x, y, z = float("nan"), 任意整数, 任意整数.

(float("nan")*2)*3 != float("nan")*(2*3)原因是RFCXXX,自己去看,很无聊。总之就是浮点数有个特殊值nan,TM的自己跟自己都不等

4. 集合冷门

>>> x, s = ???, ???
>>> s.add(x)
>>> type(x) not in map(type, s)
True
意思是说x添加进s,但是查找s里面所有元素的类型,却发现没有x的类型。不好推理出答案,直接给答案。x, s = True, {1},至于解释看一步步结果便知
>>> x, s = True, {1}
>>> True in s
True
>>> 1 in s
True
>>> s.add(x)
>>> s
set([1])
>>> type(x)
< type 'bool'>
>>> map(type, s)
[< type 'int'>]
明白了没,对于集合,是计算hash的,True和1他认为是一个东西,所以不再把True添加进去,对于type而言,True和1是两个类型。其实这个可以认为是Python的bug,True应该和1有不同的hash值

5.min冷门

>>> x, y = ???, ???
>>> min(x, y) != min(y, x)
True
直接来第一个答案x, y = {5}, {4, 2}。xy是随意两个集合就行,min(x, y)始终返回x,至于为什么没找到解释。大神可赐教

第二个答案当然是万能的float("nan"),管你大爷的min返回啥,自个都不等,你还能不成立?

6.自身比较

>>> x = ???
>>> x < x//自己比自己小
True
很好想咯,重写__lt__.答案x = type("", (), {"__lt__": lambda a, b: True})()。看不懂就查查type元类等关键词。粗略说下,type("", (), {"__lt__": lambda a, b: True})构建一个类,不继承谁,也不要类名,反正把__lt__方法给我强行覆盖就完事了,后面一对圆括号,就是用这个类实例化对象咯

同理自己大于自己,自己不等于自己,类似实现
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值