为啥考官喜欢拿一个排序来考面试者,因为一个好的排序完全可以体现一个程序员的编程素养
看一个程序员的编程素养,一段代码就够了
场景设置
假如你想入职一家你非常心仪的单位,现实很残酷,你想去人家也想去,竞争很激烈,面试官只能择优录取。然而你的面试官是你姐的男朋友,摆在你面前的是:一个老掉牙的冒泡排序(面试官亲自出的题)要求:电脑实操,现场编码,具体如下:
给你一个列表items用python实现一个冒泡排序,写出代码
你心想冒泡排序不就是前后两两比较,前面比后面大就交换位置么?so easy! 😂
你废话不多说三下五除二上代码:👌
def bubble_sort(items: list)->list:
for i in range(1, len(items)):
# 每次遍历可以确定一个元素的位置
for j in range(0, len(items)-i):
if items[j] > items[j+1]:
items[j], items[j+1] = items[j+1], items[j]
# 测试
if __name__ == '__main__':
nums = [34,45,24,47,23,46,25,12]
bubble_sort(nums)
print(nums)
面试官看了你的代码小声对你说,你这个代码毫无竞争力你第一个就会被淘汰,要改改!!
他小声对你说如果list本来就是一个有序列表你这样不是白费半天劲白跑代码?你恍然大悟,于是修改代码
def bubble_sort(items: list)->list:
for i in range(1, len(items)):
swapped = False #假设默认不需要交换(有序)
# 每次遍历可以确定一个元素的位置
for j in range(0, len(items)-i):
if items[j] > items[j+1]:
items[j], items[j+1] = items[j+1], items[j]
swapped = True #首次循环发现元素有换位置就置为True
if not swapped:
break
# 测试
if __name__ == '__main__':
nums = [34,45,24,47,23,46,25,12]
bubble_sort(nums)
print(nums)
你姐夫看了你的代码,感觉还可以,但是其他人也都想到了这一步,还是没办法保送你!
于是他又对你小声说,你有两个地方要改改,1. 可以做成正向反向都可以排序 2. 如果别人调了你函数你把人家传给你的参数改了,人家的list如果在其他地方用到怎么办? 岂不是数据乱了?于是你又改…
def bubble_sort(items: list, ascending=True)->list:
items = items[:] # 利用列表切片重新构造一个新列表,保持原列表不变
for i in range(1, len(items)):
swapped = False #假设默认不需要交换(有序)
# 每次遍历可以确定一个元素的位置
for j in range(0, len(items)-i):
if items[j] > items[j+1]:
items[j], items[j+1] = items[j+1], items[j]
swapped = True #首次循环发现元素有换位置就置为True
if not swapped:
break
if not ascending: # 利用列表的切片功能倒序 list[start:stop:step]
items = items[::-1]
return items
# 测试
if __name__ == '__main__':
nums = [34,45,24,47,23,46,25,12]
new_nums = bubble_sort(nums) #返回值
print(new_nums)
print(nums) #原来列表
延伸:别人调了你的函数而不对调用者的入参有改动叫做函数的无副作用性(调用函数不影响调用者)业内很多程序员都想不到这一点。这是软件工程项目解耦的重大思想。
这个时候你姐夫看到你的代码,脸上不觉露出阴险的微笑,保送有进了一步。此时一大部分竞争者都被淘汰!但是姐夫深知目前仍然有4个人也做到了这一步,不得不憋出姐夫的大招杀手锏!他小声对你说:“现在还有人竞争呢!我给你说如果列表不是数字怎么办,赶紧使用高阶函数功能 "。此时你倒吸一口凉气,没想到竞争如此激烈,🤔幸亏这几天恶补了python编程课,于是你费劲脑汁使出吃奶的力气又对代码进行改造
def bubble_sort(items: list, ascending=True, gt=lambda x,y:x>y)->list:
items = items[:] # 利用列表切片重新构造一个新列表,保持原列表不变
for i in range(1, len(items)):
swapped = False #假设默认不需要交换(有序)
# 每次遍历可以确定一个元素的位置
for j in range(0, len(items)-i):
if gt(items[j] , items[j+1]): #使用传入的函数计算大小
items[j], items[j+1] = items[j+1], items[j]
swapped = True #首次循环发现元素有换位置就置为True
if not swapped:
break
if not ascending: # 利用列表的切片功能倒序 list[start:stop:step]
items = items[::-1]
return items
# 测试
if __name__ == '__main__':
nums = [34,45,24,47,23,46,25,12]
nums = ['张三','李四','王五','赵六','钱七','孙er八']
new_nums = bubble_sort(nums,True, lambda x,y: len(x)<len(y)) #返回值
print(new_nums)
print(nums) #原来列表
至此姐夫看到这段代码满意的点了点头,心想,没想到还真让这小子做出来了,牛👍。姐夫拿到这份代码自豪的向领导推荐,这小子代码可以说的鹤立鸡群,无懈可击,是一位难得的人才啊,最终你顺利进入到公司
高阶函数的运用是代码功能大增,同时做到代码解耦,应该是程序员追求的编码方式
通过本故事,对你编码之路可有启发?,有的话加个好友,关注下。
chatgpt免费上
