写在之前
Python 面试的时候会涉及到很多的八股文,我准备连载一个新的系列【最新Python面试题】
这些面试题是我结合自身经验,以及搜集整理的企业面试真题,主要有以下几个方面:
- Python基础
- Python机制
- Python面向对象
- Python笔试题
- Python算法
- Django框架
- Flask框架
- 其他开源框架
- Scrapy数据爬虫
- Python正则式
- Python数据分析
- Pandas框架
- Python拓展知识(数据结构,常见算法,数据库原理及调优,中间件…)
虽然这些是面试“八股文”,但是只会背答案与流畅的并能结合自身思考的回答,对于面试官来说还是有很大区别的。
所以除了在每道面试题后会提供仔细整理和验证后的答案以外,在每篇文章中会挑选一道难度高且重点的题目做详细的讲解。
希望大家不但能知其然也可以知其所以然,在面试的时候让面试官眼前一亮,这样白花花的offer不就到手了嘛
每天会更新10道题左右,无论是准备面试还是自己学习,这份面试题绝对值得你去看
大家可以关注我,再关注我,使劲关注我,不要错过每天的更新~
1.Python如何定义函数?
在 Python 中,定义函数使用 def 关键字,后跟函数名和括号内的参数列表。函数体则跟在冒号后面,并且必须缩进。
以下是定义函数的基本语法:
def function_name(parameters):
"""函数的文档字符串(可选)"""
# 函数体
return expression # 返回值(可选)
function_name:这是函数的名称,它应该遵循 Python 的命名规则(通常使用小写字母和下划线)。parameters:这是函数的参数列表,参数之间用逗号分隔。参数可以有默认值。"""函数的文档字符串(可选)""":这是一个可选的文档字符串,用于描述函数的作用。它应该紧跟在函数定义之后,并且用三引号括起来。return expression:这是函数的返回值,它表示函数执行完成后返回给调用者的值。return语句是可选的,如果没有return语句,函数默认返回None。
2.Python 如何进行字符串插值?
-
百分号格式化(
%操作符):
这是较早的字符串格式化方法,通过在字符串中使用%操作符和格式化占位符来实现。name = "Alice" greeting = "Hello, %s!" % name print(greeting) # 输出: Hello, Alice! -
str.format()方法:
这种方法在 Python 2.6 及以后的版本中引入,提供了更多的灵活性和强大的格式化选项。name = "Alice" greeting = "Hello, {}!".format(name) print(greeting) # 输出: Hello, Alice!format()方法还可以进行更复杂的格式化,如设置宽度、填充字符、对齐方式等。 -
f-字符串(格式化字符串字面量):
在 Python 3.6 及以后的版本中引入,是当前推荐的字符串插值方法。f-字符串通过在字符串前加上字母f或F,并在大括号{}中直接嵌入变量或表达式。name = "Alice" greeting = f"Hello, {name}!" print(greeting) # 输出: Hello, Alice!f-字符串不仅简洁,而且执行效率高,因为它在运行时会直接将变量的值插入字符串中。
-
模板字符串:
string.Template类提供了另一种字符串插值的方法,它使用$符号来引用变量。from string import Template template = Template('Hello, $name!') greeting = template.substitute(name="Alice") print(greeting) # 输出: Hello, Alice!
3." is"和" =="有什么区别?
is:is操作符用于比较两个对象的身份,即它们是否为同一个对象(即是否位于内存中的同一个位置)。- 它检查两个变量是否引用同一个对象。
is对于确定两个变量是否指向同一个可变对象非常有用,例如列表、字典、类实例等。
==:==操作符用于比较两个对象的值是否相等。- 它检查两个对象的内容是否相同。
==通常用于比较两个不可变对象,如整数、浮点数、字符串和元组等。
4." func"和" func()"有什么区别?
func:这表示对函数的引用,而不是函数的调用。它指向函数对象本身,而不是函数的执行结果。在这种情况下,func变量存储了函数的内存地址,你可以使用它来访问函数的属性或者将其作为参数传递给其他函数。func():这表示调用函数func。当你在函数名后面加上括号时,Python 解释器会执行这个函数,并返回函数体内部return语句的结果(如果函数中有return语句)。如果没有return语句或者return语句没有返回值,那么函数默认返回None。
5.简述 Map功能的工作方式?
map() 函数是 Python 的内置函数之一。
用于对可迭代对象的每个元素应用一个函数,并将结果收集到一个新的迭代器中。
map() 函数通常用于将一个函数应用于一个序列的每个元素,或者将多个序列的对应元素应用到一个函数上。
6.Python是按引用调用还是按值调用?
- Python 中的函数调用可以被认为是按引用调用,但这里的“引用”指的是对象的引用,而不是内存地址。
- 对于可变对象,函数内部的修改会影响原始对象。
- 对于不可变对象,函数内部的修改不会影响原始对象,除非显式地将参数重新赋值为一个新的对象。
7.解释 Python filter功能如何工作?
filter()函数是 Python 的内置函数之一,用于过滤序列,从中提取符合特定条件的元素。filter()函数接受两个参数:一个函数和一个可迭代对象。
传入的函数用于判断可迭代对象中的每个元素是否符合条件,返回布尔值(True 或 False)。filter() 会返回一个迭代器,包含所有使函数返回 True 的元素。
8.字符串乘法如何工作?
'cat' * 3
#=> 'catcatcat'
#该字符串将自身连接3次
d9.列表乘法如何工作?
[1,2,3] * 2
#=> [1, 2, 3, 1, 2, 3]
#输出包含重复两次的[1,2,3]内容的列表。
重点题详解
.解释reduce函数的工作原理?
reduce() 函数是 Python 的 functools 模块中的一个函数,它用于将一个函数应用于可迭代对象的元素,从而将其缩减(reduce)为单一的值。reduce() 函数通常用于更复杂的数据处理,比如累加、累乘或者更复杂的数据聚合操作。
工作原理
reduce() 函数的基本语法如下:
reduce(function, iterable[, initializer])
function是一个接受两个参数的函数,它将被应用到iterable的元素上。iterable是一个可迭代对象,比如列表、元组等。initializer是可选的,如果提供,它将作为reduce()函数的初始值。
工作步骤
-
初始化:如果提供了
initializer,则将其作为第一个累积值。如果没有提供initializer,则从iterable中取出第一个元素作为累积值。 -
迭代:
reduce()函数将function应用到累积值和iterable的下一个元素上。每次应用后,function的返回值成为下一次迭代的累积值。 -
继续应用:这个过程一直持续到
iterable中的所有元素都被处理完毕。 -
返回结果:最终的累积值就是
reduce()函数的返回值。
示例
假设我们有一个列表 [1, 2, 3, 4],我们想要计算所有元素的累加和。
from functools import reduce
numbers = [1, 2, 3, 4]
sum = reduce(lambda x, y: x + y, numbers)
print(sum) # 输出: 10
在这个例子中:
function是一个匿名函数lambda x, y: x + y,它接受两个参数x和y,并返回它们的和。iterable是列表[1, 2, 3, 4]。- 没有提供
initializer,所以reduce()会从列表中取出第一个元素(1)作为初始累积值。
工作流程如下:
- 第一次迭代:
function(1, 2)返回 3,累积值为 3。 - 第二次迭代:
function(3, 3)返回 6,累积值为 6。 - 第三次迭代:
function(6, 4)返回 10,累积值为 10。
最终,reduce() 返回 10。
注意事项
- 如果
iterable为空,并且没有提供initializer,reduce()会引发TypeError。 reduce()函数通常用于更复杂的数据处理,而不是简单的累加或累乘,因为这些操作可以直接使用内置的sum()或map()函数。
实现逻辑详解
reduce() 函数的实现逻辑可以通过迭代地应用一个二元函数(即接受两个参数的函数)来实现。下面是一个简化的 reduce() 函数的实现,展示了其基本逻辑:
from functools import reduce
def my_reduce(function, iterable, initializer=None):
# 如果提供了 initializer,则将其作为累积值
if initializer is not None:
accumulator = initializer
iter_iterable = iter(iterable)
else:
# 没有提供 initializer,从 iterable 中取出第一个元素作为累积值
accumulator = next(iter(iterable))
iter_iterable = iter(iterable)
# 迭代地应用 function 到累积值和 iterable 的下一个元素
for element in iter_iterable:
accumulator = function(accumulator, element)
return accumulator
# 示例使用
numbers = [1, 2, 3, 4]
print(my_reduce(lambda x, y: x + y, numbers)) # 输出: 10
-
初始化累积值:
- 如果提供了
initializer参数,那么直接使用它作为累积值(accumulator)。 - 如果没有提供
initializer,那么使用iter()函数将iterable转换为迭代器,并使用next()函数从迭代器中取出第一个元素作为累积值。
- 如果提供了
-
迭代应用函数:
- 使用
iter()函数将iterable转换为迭代器(如果已经取出了第一个元素,那么直接使用剩余的迭代器)。 - 使用
for循环遍历迭代器中的每个元素。 - 在每次迭代中,将
function应用到累积值和当前的元素上,并将结果更新为新的累积值。
- 使用
-
返回结果:
- 循环结束后,返回最终的累积值。
错误处理
- 如果
iterable为空,并且没有提供initializer,那么在尝试使用next()函数获取第一个元素时,会抛出StopIteration异常。在实际的reduce()函数实现中,这种情况会引发TypeError。
这个简化的实现展示了 reduce() 函数的核心逻辑,即通过迭代地应用一个二元函数来逐步缩减 iterable 为一个单一的值。这种模式在处理复杂的数据聚合操作时非常有用。
更多资料干货、行业内幕 长期免费更新中!



被折叠的 条评论
为什么被折叠?



