以下是一些Python面试题:
一、基础语法
Python中的列表(list)和元组(tuple)有什么区别?
答案:
- 可变性:列表是可变的,可以修改列表中的元素、添加或删除元素;元组是不可变的,一旦创建就不能修改。
- 语法:列表使用方括号
[]
定义,元组使用圆括号()
定义(单个元素的元组需要在元素后面加逗号,如(1,)
)。 - 性能:由于元组的不可变性,在某些情况下元组的性能比列表略高,例如在用作字典的键时(字典的键必须是不可变类型)。
如何在Python中实现多态?
答案:
可以通过定义基类并在基类中声明抽象方法(使用
abc
模块中的ABC
类和abstractmethod
装饰器),然后让不同的子类继承基类并实现抽象方法来实现多态。例如:from abc import ABC, abstractmethod class Animal(ABC): @abstractmethod def make_sound(self): pass class Dog(Animal): def make_sound(self): return "Woof!" class Cat(Animal): def make_sound(self): return "Meow!"
二、数据结构与算法
如何对一个未排序的整数列表进行快速排序?
答案:
- 快速排序的基本思想是选择一个基准元素,将列表分为两部分,一部分比基准元素小,另一部分比基准元素大,然后对这两部分分别递归进行快速排序。
示例代码:
def quicksort(lst): if len(lst) <= 1: return lst pivot = lst[0] less = [x for x in lst[1:] if x < pivot] greater = [x for x in lst[1:] if x >= pivot] return quicksort(less) + [pivot] + quicksort(greater)
Python中的字典(dict)是如何实现查找效率较高的?
答案:
- 字典是基于哈希表实现的。当查找一个键时,通过计算键的哈希值,然后根据哈希值直接定位到存储对应值的内存位置,所以平均查找时间复杂度为$O(1)$。
三、高级特性
什么是Python中的装饰器(decorator)?如何使用?
答案:
- 装饰器是一种用于修改函数或方法行为的高级函数。它接受一个函数作为参数,并返回一个新的函数。
示例用法:
def my_decorator(func): def wrapper(): print("Before function call") func() print("After function call") return wrapper @my_decorator def say_hello(): print("Hello!") say_hello()
Python中的生成器(generator)有什么作用?如何创建?
答案:
- 生成器可以按需生成数据,节省内存。它允许逐个地生成值而不是一次性生成所有值。
创建生成器有两种方式:
- 使用生成器表达式,例如
(x * x for x in range(10))
。 定义一个包含
yield
关键字的函数,例如:def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b
- 使用生成器表达式,例如
四、框架相关(以Django为例)
Django中的MVC模式是如何体现的?
答案:
- 在Django中,模型(Model)负责数据存储和管理,相当于MVC中的模型;视图(View)负责处理业务逻辑并返回响应,类似于MVC中的控制器;模板(Template)负责呈现数据给用户,相当于MVC中的视图。不过Django的这种模式更准确地说是MTV(Model - Template - View)模式。
如何在Django中进行数据库迁移?
答案:
- 首先在模型类中对数据库结构进行修改,然后运行
python manage.py makemigrations
命令来创建迁移文件,这个文件记录了模型的变化。最后运行python manage.py migrate
命令将迁移应用到数据库中。
- 首先在模型类中对数据库结构进行修改,然后运行
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。