声明:一些很无聊的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__方法给我强行覆盖就完事了,后面一对圆括号,就是用这个类实例化对象咯
同理自己大于自己,自己不等于自己,类似实现