python面试题(51~60)

51. 举一个递推式构造字典(dictionary comprehension)的例子。

import string
list(string.ascii_lowercase)
alphabet = list(string.ascii_lowercase)
comprehensiond = {val:idx for idx,val in enumerate(alphabet)}
print(comprehensiond)#=> {'a': 0,#=> 'b': 1,#=> 'c': 2,#=> ...#=> 'x': 23, #=> 'y': 24,#=> 'z': 25}

52、Python中的异常处理是如何进行的?

①在Python中,异常处理通过try-except语句实现。try块用于包含可能会抛出异常的代码,而except块则用于捕获并处理这些异常。

try:
    # 可能会引发异常的代码
    x = 10 / 0
except ZeroDivisionError:
    # 处理ZeroDivisionError异常的代码
    print("除数不能为零")

②除了except语句外,还可以使用else和finally语句。else语句在try块中的代码没有引发任何异常时执行,而finally语句无论try块中的代码是否引发异常,都会执行。

try:
    x = 10 / 2
except ZeroDivisionError:
    print("除数不能为零")
else:
    print("结果为:", x)
finally:
    print("这段代码总会执行")

53、在Python中如何实现单例模式。 

Python实现单例模式-CSDN博客

54、Lambda函数是什么,举例说明的它的应用场景。

①Lambda函数的基本语法是使用关键字lambda,后面跟着参数列表和一个表达式,表达式的结果就是函数的返回值。Lambda函数可以有多个参数,但只能有一个表达式。

add = lambda x, y: x + y
print(add(3, 5))  # 输出结果为 8

②Lambda函数的应用场景包括:

1、在函数式编程中,Lambda函数可以作为参数传递给高阶函数,如map、filter、sorted等。

2、在需要定义简单函数的地方,可以使用Lambda函数代替完整的函数定义,使代码更简洁易读。

3、在列表推导式、字典推导式等地方,Lambda函数可以用于生成新的元素或键值对。

# 例如,在使用map函数对列表进行元素平方的操作中,可以使用Lambda函数:
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(squared)  # 输出结果为 [1, 4, 9, 16, 25]

55、Python是如何实现内存管理的? 

Python的内存管理主要依靠两个机制:自动引用计数(Automatic Reference Counting,简称ARC)和垃圾回收(Garbage Collection,简称GC)。

①自动引用计数(ARC)

1、Python使用引用计数来追踪对象的引用数量。每当一个对象被引用时,其引用计数加1,每当一个引用被删除时,其引用计数减1。当对象的引用计数为0时,Python会自动销毁该对象并释放其占用的内存。

2、引用计数的优点是简单高效,大部分对象的内存管理可以在对象生命周期内完成,避免了显式的内存管理开销。

②垃圾回收(GC):

1、虽然引用计数可以解决大部分的内存管理问题,但是存在循环引用的情况,即两个或多个对象之间互相引用,导致它们的引用计数都不为0,但是又无法被访问到,这样会导致内存泄漏。

2、Python的垃圾回收机制主要解决循环引用的问题。Python的GC模块实现了几种不同的垃圾回收算法,包括标记-清除(mark and sweep)、分代回收(generational)、引用计数加标记(incremental reference counting with marking)等。其中,最常用的是分代回收算法,将对象按照生存周期划分为不同的代,垃圾回收频率随着代数的增加而降低,从而提高了性能。

3、Python的垃圾回收机制主要针对循环引用等特殊情况,一般情况下并不频繁触发,因此大部分情况下内存管理主要还是依赖引用计数。

56、说一下你对Python中迭代器和生成器的理解。

python中的迭代器和生成器-CSDN博客

# 扩展:面试中经常让写生成斐波那契数列的迭代器,大家可以参考下面的代码。
class Fib(object):
    
    def __init__(self, num):
        self.num = num
        self.a, self.b = 0, 1
        self.idx = 0
   
    def __iter__(self):
        return self

    def __next__(self):
        if self.idx < self.num:
            self.a, self.b = self.b, self.a + self.b
            self.idx += 1
            return self.a
        raise StopIteration()
# 如果用生成器的语法来改写上面的代码,代码会简单优雅很多。
def fib(num):
    a, b = 0, 1
    for _ in range(num):
        a, b = b, a + b
        yield a

57、正则表达式的match方法和search方法有什么区别?

在 Python 的正则表达式模块 re 中,match() 方法和 search() 方法都用于在字符串中搜索匹配指定模式的文本,但它们之间有一些区别:

①match() 方法只会在字符串的开头位置开始匹配,如果开头不匹配,则返回 None。它只会匹配目标字符串的开头部分。

②search() 方法会在整个字符串中搜索匹配指定模式的文本,如果找到匹配的文本,则返回第一个匹配对象;如果没有找到,则返回 None。它会搜索整个字符串,而不是只在开头位置匹配。

58、Python中为什么没有函数重载?

①首先Python是解释型语言,函数重载现象通常出现在编译型语言中。

②其次Python是动态类型语言,函数的参数没有类型约束,也就无法根据参数类型来区分重载。

③再者Python中函数的参数可以有默认值,可以使用可变参数和关键字参数,因此即便没有函数重载,也要可以让一个函数根据调用者传入的参数产生不同的行为。

59、说说你用过Python标准库中的哪些模块。

①sys,跟Python解释器相关的变量和函数,例如:sys.version、sys.exit()

②os,和操作系统相关的功能,例如:os.listdir()、os.remove()

③re,和正则表达式相关的功能,例如:re.compile()、re.search()

④math,和数学运算相关的功能,例如:math.pi、math.e、math.cos

⑤logging,和日志系统相关的类和函数,例如:logging.Logger、logging.Handler

⑥json / pickle, 实现对象序列化和反序列的模块,例如:json.loads、json.dumps

60、__init____new__方法有什么区别?

①__new__方法是类方法,第一个参数是类,返回值是创建好的Python对象(的引用),负责创建对象。

②__init__是对象方法,它的第一个参数是对象,负责初始化对象。

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值