ITPub博客

首页 > 应用开发 > Python > 好程序员Python培训分享Python面试宝典之基础篇-03

好程序员Python培训分享Python面试宝典之基础篇-03

原创 Python 作者:好程序员 时间:2020-04-21 15:18:37 0 删除 编辑

好程序员 Python 培训分享 Python 面试宝典之基础篇 -03

 

题目011:Python中为什么没有函数重载?

点评 :C++、Java、C#等诸多编程语言都支持函数重载,所谓函数重载指的是在同一个作用域中有多个同名函数,它们拥有不同的参数列表(参数个数不同或参数类型不同或二者皆不同),可以相互区分。重载也是一种多态性,因为通常是在编译时通过参数的个数和类型来确定到底调用哪个重载函数,所以也被称为编译时多态性或者叫前绑定。这个问题的潜台词其实是问面试者是否有其他编程语言的经验,是否理解Python是动态类型语言,是否知道Python中函数的可变参数、关键字参数这些概念。

首先Python是解释型语言,函数重载现象通常出现在编译型语言中。其次Python是动态类型语言,函数的参数没有类型约束,也就无法根据参数类型来区分重载。再者Python中函数的参数可以有默认值,可以使用可变参数和关键字参数,因此即便没有函数重载,也要可以让一个函数根据调用者传入的参数产生不同的行为。

题目012:用Python代码实现Python内置函数max。

点评 :这个题目看似简单,但实际上还是比较考察面试者的功底。因为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

题目013:写一个函数统计传入的列表中每个数字出现的次数并返回对应的字典。

点评 :送人头的题目,不解释。

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 ))}

题目014:使用Python代码实现遍历一个文件夹的操作。

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 模块提供了很多进行路径操作的工具函数,在项目开发中也是经常会用到的。

题目015:现有2元、3元、5元共三种面额的货币,如果需要找零99元,一共有多少种找零的方式?

点评 :还有一个非常类似的题目:“一个小朋友走楼梯,一次可以走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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-03-20

  • 博文量
    342
  • 访问量
    195010