好程序员 Python 培训分享 Python 面试宝典之基础篇 -03
题目011:Python中为什么没有函数重载?
点评 :C++、Java、C#等诸多编程语言都支持函数重载,所谓函数重载指的是在同一个作用域中有多个同名函数,它们拥有不同的参数列表(参数个数不同或参数类型不同或二者皆不同),可以相互区分。重载也是一种多态性,因为通常是在编译时通过参数的个数和类型来确定到底调用哪个重载函数,所以也被称为编译时多态性或者叫前绑定。这个问题的潜台词其实是问面试者是否有其他编程语言的经验,是否理解Python是动态类型语言,是否知道Python中函数的可变参数、关键字参数这些概念。
首先Python是解释型语言,函数重载现象通常出现在编译型语言中。其次Python是动态类型语言,函数的参数没有类型约束,也就无法根据参数类型来区分重载。再者Python中函数的参数可以有默认值,可以使用可变参数和关键字参数,因此即便没有函数重载,也要可以让一个函数根据调用者传入的参数产生不同的行为。
点评 :这个题目看似简单,但实际上还是比较考察面试者的功底。因为Python内置的 max 函数既可以传入可迭代对象找出最大,又可以传入两个或多个参数找出最大;最为关键的是还可以通过命名关键字参数 key 来指定一个用于元素比较的函数,还可以通过 default 命名关键字参数来指定当可迭代对象为空时返回的默认值。
下面的代码仅供参考:
def my_max ( * args, key = None , default = None ):
""" 获取可迭代对象中最大的元素或两个及以上实参中最大的元素 :param args: 一个可迭代对象或多个元素 :param key: 提取用于元素比较的特征值的函数,默认为None :param default: 如果可迭代对象为空则返回该默认值,如果没有给默认值则引发ValueError异常 :return: 返回可迭代对象或多个元素中的最大元素 """
if len (args) == 1 and len (args[ 0 ]) == 0 :
if default:
return default
else :
raise ValueError ( 'max() arg is an empty sequence' )
items = args[ 0 ] if len (args) == 1 else args
max_elem, max_value = items[ 0 ], items[ 0 ]
if key:
max_value = key(max_value)
for item in items:
value = item
if key:
value = key(item)
if value > max_value:
max_elem, max_value = item, value
return max_elem
点评 :送人头的题目,不解释。
def count_letters (items):
result = {}
for item in items:
if isinstance (item, ( int , float )):
result[item] = result . get(item, 0 ) + 1
return result
也可以直接使用Python标准库中 collections 模块的 Counter 类来解决这个问题, Counter 是 dict 的子类,它会将传入的序列中的每个元素作为键,元素出现的次数作为值来构造字典。
from collections import Counter
def count_letters (items):
counter = Counter(items)
return {key: value for key, value in counter . items() \
if isinstance (key, ( int , float ))}
Python标准库 os 模块的 walk 函数提供了遍历一个文件夹的功能,它返回一个生成器。可以通过这个生成器来获得文件夹下所有的文件和文件夹。
import os
g = os . walk( '/Users/Hao/Downloads/' ) for path, dir_list, file_list in g:
for dir_name in dir_list:
print (os . path . join(path, dir_name))
for file_name in file_list:
print (os . path . join(path, file_name))
说明 : os.path 模块提供了很多进行路径操作的工具函数,在项目开发中也是经常会用到的。
点评 :还有一个非常类似的题目:“一个小朋友走楼梯,一次可以走1个台阶、2个台阶或3个台阶,问走完10个台阶一共有多少种走法?”,这两个题目的思路是一样,如果用递归函数来写的话非常简单。
from functools import lru_cache
@lru_cache() def change_money (total):
if total == 0 :
return 1
if total < 0 :
return 0
return change_money(total - 2 ) + change_money(total - 3 ) + change_money(total - 5 )
说明
:在上面的代码中,我们用
lru_cache
装饰器装饰了递归函数
change_money
,如果不做这个优化,上面代码的渐近时间复杂度将会是
,而如果参数
total
的值是
99
,这个运算量是非常巨大的。
lru_cache
装饰器会缓存函数的执行结果,这样就可以减少重复运算所造成的开销,这是空间换时间的策略,也是动态规划的编程思想。
温馨提示
:Python面试宝典会持续更新,从基础到项目实战的内容都会慢慢覆盖到。虽然每天只更新5个题目,但是每道题扩散出的信息量还是比较大的,希望对找工作的小伙伴所有帮助。
你的点赞、收藏和评论都是我继续创建的动力,请不要吝惜你的赞美
。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69913864/viewspace-2687420/ ,如需转载,请注明出处,否则将追究法律责任。