Python面试笔记

news2025/3/11 0:41:47

Python面试笔记

  • Python
    • Q. Python中可变数据类型与不可变数据类型,浅拷贝与深拷贝详解
    • Q. 解释什么是lambda函数?它有什么好处?
    • Q. 什么是装饰器?
    • Q. 什么是Python的垃圾回收机制?
    • Q. Python内置函数dir的用法?
    • Q. Python中两边都有下划线的方法有什么含义?
    • Q. Python中单下划线和双下划线的区别
    • Q. __new__和__init__区别
    • Q. 什么是迭代器和⽣成器?
    • Q. 什么是异常处理?
    • Q. Python断言(assert)
    • Q. Python中`*` 和 `**`用法?

Python

Q. Python中可变数据类型与不可变数据类型,浅拷贝与深拷贝详解

【Python基础】Python的深浅拷贝讲解
在这里插入图片描述

Q. 解释什么是lambda函数?它有什么好处?

Lambda函数是Python中的匿名函数

Lambda函数在Python中被广泛使用,主要是因为它们提供了一种快速定义单行最小函数的方式,而无需使用常规的def关键字。这种函数通常用于需要一个简单操作的地方,例如在列表推导式、map()、filter()等高阶函数中作为参数传递。Lambda函数的基本语法结构是:lambda parameters_list: expression,其中parameters_list是函数的参数列表,而expression则是基于这些参数的表达式,该表达式的结果将被返回。

Lambda函数的优点主要包括代码简洁、无需增加额外变量、即时定义与使用。具体内容如下:

  • 代码简洁:由于lambda函数通常只包含一个表达式,因此代码非常简洁,可以提高代码的可读性。
  • 无需增加额外变量:因为lambda函数是匿名的,所以不需要为其分配一个名字,这有助于减少程序中的变量数量,避免命名冲突。
  • 即时定义与使用:可以在需要时立刻定义并使用,不必像常规函数那样先定义再调用。
# case 1
add = lambda x, y: x + y
result = add(3, 5)
print(result) # 输出:8
# case 2
students = [("Alice", 25), ("Bob", 20), ("Charlie", 30)]
students.sort(key=lambda student: student[1])
print(students) # 输出:[('Bob', 20), ('Alice', 25), ('Charlie', 30)]
# case 3
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 输出:[2, 4, 6]

Lambda表达式通常⽤于需要传递函数作为参数的函数(例如 mapfiltersorted 等),或
者在需要定义⾮常简单的匿名函数时。

总之,尽管lambda函数有许多优点,但它们也受到一些限制,如只能包含一个表达式,不能包含复杂的逻辑或语句,且没有文档字符串和名称。因此,在决定是否使用lambda函数时,应当根据实际需求和上下文进行权衡。

Q. 什么是装饰器?

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用

def my_decorator(func):  
    def wrapper():  
        print("Something is happening before the function is called.")  
        func()  
        print("Something is happening after the function is called.")  
    return wrapper  
  
@my_decorator  
def say_hello():  
    print("Hello!")  
  
# 当调用 say_hello 时,实际上是调用了装饰器返回的 wrapper 函数  
say_hello()

输出:
Something is happening before the function is called.  
Hello!  
Something is happening after the function is called.

Q. 什么是Python的垃圾回收机制?

Python的垃圾回收机制主要负责自动管理内存,释放不再使用的对象所占用的内存空间。
Python的垃圾回收机制主要包括以下几种:

  • 引用计数(Reference Counting)。这是Python中最基本的垃圾回收方法。每个对象都有一个引用计数,记录有多少个变量指向该对象。当引用计数为0时,表示该对象不再被使用,可以被回收。
  • 标记-清除(Mark and Sweep)。这种方法用于处理循环引用的情况。当内存空间即将被占满时,Python会暂停程序,从头到尾扫描所有对象,并标记所有可达的对象。然后,清除所有未被标记的对象,回收它们占用的内存空间。
  • 分代回收(Generational Collection)。为了提高垃圾回收的效率,Python引入了分代回收机制。对象被分为不同的代,如第0代和第1代等。新创建的对象通常放在第0代,而经过多次垃圾回收仍然存活的对象会被提升到更高的代。垃圾回收器会更多地检查低代中的对象,而对高代中的对象进行较少的检查,从而提高垃圾回收的效率。

需要注意的是,Python的垃圾回收机制是自动进行的,开发者不需要手动管理内存。垃圾回收器会根据需要定期启动,并在合适的时机回收不再使用的对象。

Q. Python内置函数dir的用法?

在 Python 中,dir() 是一个内置函数,用于查找对象的所有属性和方法。它返回一个字符串列表,包含了对象的所有属性和方法的名称。

class MyClass:
    def __init__(self):
        self.name = "John"
    
    def say_hello(self):
        print("Hello, world!")
 
obj = MyClass()
 
print("对象 obj 的属性和方法:", dir(obj))

输出:
对象 obj 的属性和方法: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_hello']

Q. Python中两边都有下划线的方法有什么含义?

在Python中,两边都有双下划线的方法名被称为魔法方法(magic methods)。这些方法是Python语言的基础,它们为Python提供了强大的内置功能。例如,__init__ 方法是类的构造函数,__str__ 方法定义了对象被转换为字符串时的行为。

以下是一个简单的类示例,它定义了一个带有两边都有双下划线的方法:

class MyClass:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return f"MyClass with value: {self.value}"

# 使用类
obj = MyClass(10)
print(obj)  # 输出: MyClass with value: 10

Python中还有很多其他的魔法方法,以下是一些常用的魔法方法:

__init__:构造函数,当一个对象被创建时会自动调用。
__del__:析构函数,当一个对象被销毁时会自动调用。
__str__:返回一个对象的字符串表示,通常用于print函数。
__repr__:返回一个对象的官方字符串表示,通常用于调试。
__call__:允许一个对象像函数那样被调用。
__getitem____setitem____delitem__:用于自定义索引操作,如obj[key]。
__len__:返回对象的长度,常用于len()函数。
__iter__:返回一个迭代器,用于遍历对象。
__enter____exit__:用于实现上下文管理协议,如with语句。
__add____sub____mul__ 等:用于自定义算术运算符的行为。

这些魔法方法允许你自定义Python对象的行为,使其更符合你的需求。你可以根据需要实现这些方法来扩展Python类的功能。

Q. Python中单下划线和双下划线的区别

  • 单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;
  • 双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。仍然可以通过_{classname}__name来访问__name变量。但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。

Q. __new__和__init__区别

__new__与__init__区别总共有四个方面:

  1. 功能上的区别: 前者生成类实例对象空间的,后者是初始化对象空间并给对象赋值的;
  2. 执行顺序: 先执行__new__方法生成类对象空间才能执行后者
  3. 返回值: 前者有返回值,后者没有返回值
  4. 前者是静态方法, 后者是构造方法
    在这里插入图片描述

Q. 什么是迭代器和⽣成器?

迭代器(Iterator)和⽣成器(Generator)都是Python中⽤于处理迭代的重要概念,允许逐个访问数据项,⽽⽆需将所有数据加载到内存中,这在处理⼤型数据集合时⾮常有⽤。尽管有⼀些相似之处,但在实现和⽤法上有⼀些关键的区别。

1.迭代器(Iterator)

迭代器是⼀个对象,它可以通过调⽤ __next__() ⽅法逐个返回集合中的元素。迭代器通常⽤于遍
历集合,如列表、元组、字典等,以及⾃定义的可迭代对象。的核⼼特点是惰性计算,即只在需要时才计算下⼀个元素。

Python的内置函数 iter() 可以⽤于将可迭代对象转换为迭代器,⽽ next() 函数⽤于获取迭代
器的下⼀个元素。当没有更多元素可供迭代时,迭代器会引发 StopIteration 异常。

numbers = [1, 2, 3, 4, 5]
iter_numbers = iter(numbers)
print(next(iter_numbers)) # 输出:1
print(next(iter_numbers)) # 输出:2

2.生成器(Generator)

生成器是⼀种特殊的迭代器,它可以通过函数来创建。⽣成器函数使⽤ yield 关键字来产⽣值,并且会保持函数的状态,以便在下⼀次调⽤时继续执⾏。⽣成器允许按需⽣成数据,⽽不必将所有数据存储在内存中。

⽣成器有两种创建⽅式:

  • 使⽤⽣成器函数:定义⼀个函数,其中包含 yield 语句来⽣成值。
def countdown(n):
	while n > 0:
		yield n
		n -= 1
gen = countdown(5)
for num in gen:
	print(num)
  • 使⽤⽣成器表达式:类似于列表推导式,但是使⽤圆括号⽽不是⽅括号,并且按需⽣成数据。
gen = (x for x in range(5))
for num in gen:
	print(num)

⽣成器通常⽤于处理⼤型数据集或需要逐个⽣成数据的情况,因为不需要⼀次性加载所有数据到内存中,从⽽节省了内存资源。

总之,迭代器和⽣成器都是处理迭代的强⼤⼯具,允许⾼效地处理⼤型数据集和按需⽣成数据。可以根据任务的需求选择使⽤哪种⽅式。

Q. 什么是异常处理?

异常处理是⼀种编程技术,⽤于在程序执⾏期间捕获、处理和处理可能发⽣的异常情况或错误。异常是指在程序执⾏过程中出现的不正常情况,可能导致程序崩溃或产⽣不可预料的结果。异常处理的⽬标是使程序能够优雅地应对异常情况,⽽不是因异常⽽终⽌或崩溃。

在Python中,异常处理通常使⽤ try 和 except 语句来实现。基本的异常处理结构如下:

try:
	# 可能引发异常的代码块
except ExceptionType:
	# 处理异常的代码块
  • try 语句块包含可能引发异常的代码,它会被监视以检查是否发⽣异常。
  • 如果在 try 块中的代码引发了指定类型的异常( ExceptionType ),则程序将跳转到与该异常匹配的 except 块,执⾏异常处理代码。
  • 如果在 try 块中没有引发异常,则 except 块将被跳过,程序将继续执⾏ try 块之后的代码。
try:
	num = int(input("请输⼊⼀个整数:"))
	result = 10 / num
except ZeroDivisionError:
	print("除以零错误")
except ValueError:
	print("输⼊不是有效的整数")
else:
	print("结果是:", result)
finally:
	print("结束")
  • else语句块中的代码会在try块没有抛出任何异常的情况下运行。
  • finally语句块中的代码无论是否发生异常都会被执行。

Q. Python断言(assert)

Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常

断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况,例如我们的代码只能在 Linux 系统下运行,可以先判断当前系统是否符合条件。

语法格式如下:

assert expression
#等价于:
if not expression:
    raise AssertionError
    
#assert后面也可以紧跟参数:

assert expression [, arguments]
#等价于:
if not expression:
    raise AssertionError(arguments)

例子:

>>> assert True     # 条件为 true 正常执行
>>> assert False    # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> assert 1==1    # 条件为 true 正常执行
>>> assert 1==2    # 条件为 false 触发异常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
 
>>> assert 1==2, '1 不等于 2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: 1 不等于 2
>>>

Q. Python中***用法?

在 Python 中,*** 具有语法多义性,具体来说是有四类用法。

1.算数运算

>>> 2 * 5 #乘法
//10
>>> 2 ** 5 #乘方
//32

2.函数形参

*args**kwargs 主要用于函数定义。

你可以将不定数量的参数传递给一个函数。不定的意思是:预先并不知道, 函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。其实并不是必须写成 *args**kwargs。 *(星号) 才是必须的. 你也可以写成 *ar**k 。而写成 *args**kwargs 只是一个通俗的命名约定。

python函数传递参数的方式有两种:

  • 位置参数(positional argument)
  • 关键词参数(keyword argument)

*args**kwargs 的区别,两者都是 python 中的可变参数:

  • *args 表示任何多个无名参数,它本质是一个 tuple
  • **kwargs 表示关键字参数,它本质上是一个 dict

如果同时使用 *args**kwargs 时,必须 *args 参数列要在 **kwargs 之前。

>>> def fun(*args, **kwargs):
...     print('args=', args)
...     print('kwargs=', kwargs)
... 
>>> fun(1, 2, 3, 4, A='a', B='b', C='c', D='d')
//args= (1, 2, 3, 4)
//kwargs= {'A': 'a', 'B': 'b', 'C': 'c', 'D': 'd'}

使用*args

>>> def fun(name, *args):
...     print('你好:', name)
...     for i in args:
...         print("你的宠物有:", i)
... 
>>> fun("Geek", "dog", "cat")
//你好: Geek
//你的宠物有: dog
//你的宠物有: cat

使用 **kwargs

>>> def fun(**kwargs):
...     for key, value in kwargs.items():
...         print("{0} 喜欢 {1}".format(key, value))
... 
>>> fun(Geek="cat", cat="box")
//Geek 喜欢 cat
//cat 喜欢 box

3.函数实参(解引用)
如果函数的形参是定长参数,也可以使用 *args**kwargs 调用函数,类似对元组和字典进行解引用

>>> def fun(data1, data2, data3):
...     print("data1: ", data1)
...     print("data2: ", data2)
...     print("data3: ", data3)
... 
>>> args = ("one", 2, 3)
>>> fun(*args)
data1:  one
data2:  2
data3:  3
>>> kwargs = {"data3": "one", "data2": 2, "data1": 3}
>>> fun(**kwargs)
data1:  3
data2:  2
data3:  one

4.序列解包
序列解包没有**

>>> a, b, *c = 0, 1, 2, 3  
>>> a  
0  
>>> b  
1  
>>> c  
[2, 3]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1519543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

10、MongoDB -- MongoDB 的 MongoTemplate 的功能和用法介绍

目录 MongoTemplate 的功能和用法演示前提&#xff1a;登录单机模式的 mongodb 服务器命令登录【test】数据库的 mongodb 客户端命令登录【admin】数据库的 mongodb 客户端命令 为 MongoDB 提供的两个 Starterspring-boot-starter-data-mongodb&#xff08;为以同步方式操作 Mo…

Java毕业设计-基于springboot开发的在线考试平台-毕业论文+答辩PPT(附源代码+演示视频)

文章目录 前言一、毕设成果演示&#xff08;源代码在文末&#xff09;二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、系统功能模块2、后台登录2.1管理员功能2.2教师功能2.3学生功能 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发…

VSSM VMamba实现

文章目录 VSSM维度变换初始化模型参数初始化模型搭建def_make_layerdef _make_downsample patch embed第一至四阶段分类器 VSSBlockdef __ init__ssm分支mlp分支 def forward VSSM Mamba实现可以参照之前的 mamba_minimal系列 论文地址&#xff1a; VMamba 论文阅读&#xff1…

Redis 的常用基本全局命令【小林优选】

前言 Redis 常用的有 5 种数据结构&#xff0c;字符串&#xff0c;列表&#xff0c;哈希表&#xff0c;集合&#xff0c;有序集合&#xff0c;每一种数据结构都有自己独特的命令&#xff0c;但也有些通用的全局命令&#xff0c;本文所提到的是最基本的命令&#xff0c;Redis 的…

CIDR网络地址、广播地址、网段区间计算说明与计算工具

文章目录 开始问题参考答案 答案解析计算工具测试 开始 好久没有看计算网络&#xff0c;感觉已经完全返给老师了。 最近&#xff0c;有同事遇到个问题&#xff0c;网络一直不对&#xff0c;又开始重新看一下。 相信很多朋友长时间不看也忘了&#xff0c;所以&#xff0c;这里…

TCP机械臂控制

通过w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 注意&#xff1a;关闭计算机的杀毒软件&#xff0c;电脑管家&#xff0c;防火墙 1&#xff09;基于TCP服务器…

数据泄露态势(2024年2月)

监控说明&#xff1a;以下数据由零零信安0.zone安全开源情报系统提供&#xff0c;该系统监控范围包括约10万个明网、深网、暗网、匿名社交社群威胁源。在进行抽样事件分析时&#xff0c;涉及到我国的数据不会选取任何政府、安全与公共事务的事件进行分析。如遇到影响较大的伪造…

专业款希亦、小米、必胜、云鲸洗地机怎么样?深度测评利弊

洗地机可以说是一种非常实用的清洁工具&#xff0c;尤其是对于那些需要经常给家里地板清洁的人来说。它能够高效、彻底清洁地板&#xff0c;去除顽固污渍、灰尘和细菌&#xff0c;让家居环境更加洁净卫生。可是面对型号繁多的洗地机&#xff0c;我们应该怎么挑选呢&#xff1f;…

架构设计-复杂度来源:高性能

对性能孜孜不倦的追求是整个人类技术不断发展的根本驱动力。例如计算机&#xff0c;从电子管计算机到晶体管计算机再到集成电路计算机&#xff0c;运算性能从每秒几次提升到每秒几亿次。但伴随性能越来越高&#xff0c;相应的方法和系统复杂度也是越来越高。现代的计算机 CPU 集…

实现elasticsearch和数据库的数据同步

1. 数据同步 elasticsearch中的酒店数据来自于mysql数据库&#xff0c;因此mysql数据发生改变时&#xff0c;elasticsearch也必须跟着改变&#xff0c;这个就是elasticsearch与mysql之间的数据同步。 1.1. 思路分析 常见的数据同步方案有三种&#xff1a; 同步调用 异步通知…

element-plus表格,多样本比较,动态渲染表头

问题&#xff1a; 公司给了个excel表格&#xff0c;让比较两个样本之间的数据&#xff0c;并且动态渲染&#xff0c;搞了半天没搞出来&#xff0c;最后让大佬解决了&#xff0c;特此写篇博客记录一下。 我之前的思路是合并行&#xff0c;大概效果是这样&#xff1a; 但是最终…

微服务学习day02 -- nacos配置管理 -- Feign远程调用 -- Gateway服务网关

0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就会让人抓狂&#xff0c;而且很容易出错。我们需要一种统一配置管理…

雷卯有多种封装的超低电容ESD供您选择

1.应用 HDMI 1.3、1.4、2.0、2.1 接口 LCD、HDTV MIPI 接口 手机、 天线&#xff08;手机、GPS...&#xff09; 高速以太网 100/1000 以太网 USB 2.0 和 USB3.0、DVI、LVDS、IEEE 1394 接口 车载信息箱、VN&#xff08;车载导航&#xff09; 卫星导航、便携式导航 …

3.2网安学习第三阶段第二周回顾(个人学习记录使用)

本周重点 ①SQL语句的基本用法 ②SQL注入的基本概念和原理 ③SQL注入类型(**重点) ④SQL注入的防御和绕过手段 本周主要内容–SQL 一、SQL语句的基本用法 limit用法&#xff1a;显示查询结果中从第n条开始显示m条记录 select * from tb_user limit 1,2union用法&#x…

构建部署_Docker常用命令

构建部署_Docker常见命令 启动命令镜像命令容器命令 启动命令 启动docker&#xff1a;systemctl start docker 停止docker&#xff1a;systemctl stop docker 重启docker&#xff1a;systemctl restart docker 查看docker状态&#xff1a;systemctl status docker 开机启动&…

【Shiro反序列化漏洞】Shiro-550反序列化漏洞复现

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

腾讯云4核8G服务器性能怎么样?搭建网站够用吗?

腾讯云轻量4核8G12M服务器配置446元一年&#xff0c;646元12个月&#xff0c;腾讯云轻量应用服务器具有100%CPU性能&#xff0c;系统盘为180GB SSD盘&#xff0c;12M带宽下载速度1536KB/秒&#xff0c;月流量2000GB&#xff0c;折合每天66.6GB流量&#xff0c;超出月流量包的流…

【Datawhale组队学习:Sora原理与技术实战】训练一个 sora 模型的准备工作,video caption 和算力评估

训练 Sora 模型 在 Sora 的技术报告中&#xff0c;Sora 使用视频压缩网络将各种大小的视频压缩为潜在空间中的时空 patches sequence&#xff0c;然后使用 Diffusion Transformer 进行去噪&#xff0c;最后解码生成视频。 Open-Sora 在下图中总结了 Sora 可能使用的训练流程。…

快手发布革命性视频运动控制技术 DragAnything,拖动锚点精准控制视频物体和镜头运动

快手联合浙江大学、新加坡国立大学发布了DragAnything &#xff0c;利用实体表示实现对任何物体的运动控制。该技术可以精确控制物体的运动&#xff0c;包括前景、背景和相机等不同元素。 该项目提供了对实体级别运动控制的新见解&#xff0c;通过实体表示揭示了像素级运动和实…

layuiAdmin-通用型后台模板框架【广泛用于各类管理平台】

1. 主页 1.1 控制台 2. 组件 3. 页面 3.1 个人主页 3.2 通讯录 3.3 客户列表 3.4 商品列表 3.5 留言板 3.6 搜索结果 3.7 注册 3.8 登入 3.9 忘记密码 4. 应用 4.1 内容系统 4.1.1 文章列表 4.1.2 分类管理 4.1.3 评论管理 4.2 社区系统 4.2.1 帖子列表 4.2.2 回…