华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(一)_字节跳动社招leader面经测试python

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

解释型语言逐行执行它的语句。Python、Javascript、R、PHP 和 Ruby 等语言是解释型语言的主要例子。用解释型语言编写的程序直接从源代码运行,没有中间的编译步骤。

4. PEP 8 是什么?为什么它很重要?

PEP 8 是 Python 官方推荐的编码规范。其中 PEP 是 Python Enhancement Proposal(Python 增强建议书)的缩写,8 代表的是 Python 代码的样式指南。PEP 8 是向 Python 社区提供信息的官方设计文档,或者描述 Python 或其进程的新特性。PEP 8 特别重要,因为它记录了Python 代码的样式指南。显然,为使代码易读、易懂、易维护需要真诚而严格地遵循这些样式指南。

5. Python 中的作用域是什么?

Python 中的每个对象都在一个作用域内运行。作用域是 Python 中对象保持相关的代码块。命名空间唯一地标识程序中的所有对象。但是,这些名称空间也有一个为它们定义的作用域,可以在没有任何前缀的情况下使用它们的对象。Python 代码执行过程中创建作用域的几个例子如下:

  • 局部作用域指的是当前函数中可用的局部对象。
  • 全局作用域指的是自开始以来在整个代码执行过程中可用的对象。
  • 模块级作用域指的是程序中可访问的当前模块的全局对象。
  • 最外层作用域指的是程序中可调用的所有内置名称。最后搜索此范围内的对象以查找引用的名称。

注意:局部作用域对象可以使用 global 关键字与全局作用域对象同步。

6. 什么是列表和元组?两者的主要区别是什么?

列表和元组都是序列数据类型,可以在 Python 中存储数据。存储在这两个序列中的数据可以具有不同的数据类型。列表用方括号表示,而元组用圆括号表示。

但两者的真正区别是什么呢?两者之间的关键区别在于,列表是可变的,而元组是不可变的对象。这意味着列表可以随时修改、追加或切片,但元组保持不变。可以在 Python IDLE 上运行以下示例来确认差异:

my_tuple = ('sara', 6, 5, 0.97)
my_list = ['sara', 6, 5, 0.97]
print(my_tuple[0])     # output => 'sara'
print(my_list[0])     # output => 'sara'
my_tuple[0] = 'ansh'    # modifying tuple => throws an error
my_list[0] = 'ansh'    # modifying list => list modified
print(my_tuple[0])     # output => 'sara'
print(my_list[0])     # output => 'ansh'

7. Python 中常见的内置数据类型有哪些?

Python 中有几种内置数据类型。虽然 Python 不要求在变量声明期间显式定义数据类型,但如果忽略数据类型的知识及其相互兼容性,则可能会发生类型错误。Python 提供 type()isinstance() 函数来检查这些变量的类型。这些数据类型可分为以下几类:

  • None Type:

关键字 None 表示 Python 中的空值。可以使用这些 NoneType 对象执行布尔相等运算。

类名描述
NoneType表示 Python 中的 NULL 值。
  • 数值类型:

有三种不同的数值类型——整数、浮点数和复数。此外,布尔类型是整数类型的子类型。

类名描述
整型将整数文本(包括十六进制、八进制和二进制数)存储为整数。
浮点型将包含十进制值和/或指数符号的文本存储为浮点数。
复数型以(A+Bj)的形式存储复数,并具有属性:realimag
布尔型存储布尔值(True 或 False)。
  • 序列类型:

根据 Python 文档,有三种基本的序列类型—— 列表、元组和 range 对象。序列类型定义了用于遍历其元素的 innot in 运算符。这些运算符与比较操作具有相同的优先级。

类名描述
列表通常用于存放同类项目集合的可变序列。
元组通常用于储存异构数据多项集的不可变序列。
range 对象在执行期间生成的不可变的数字序列。
字符串由 Unicode 码位构成的不可变序列。

注意: 标准库还包括用于处理的其他类型:二进制数据,如 bytes、bytearray 和 memoryview。

  • 映射类型:

映射对象可以将可哈希值映射到 Python 中的随机对象。映射对象是可变的,目前只有一种标准映射类型,即字典。

类名描述
字典存储以逗号分隔的键:值对列表。
  • 集合类型:

目前,Python 有两种内置的集合类型—— set 和 frozenset。 set 类型是可变的,其内容可以使用 add()remove() 这样的方法来改变。 由于是可变类型,它没有哈希值,且不能被用作字典的键或其他集合的元素。 frozenset 类型是不可变并且为 hashable,其内容在被创建后不能再改变,因此它可以被用作字典的键或其他集合的元素。

类名描述
set不同可哈希对象的可变无序集合。
frozenset不同可哈希对象的不可变集合。
  • 模块:

模块是 Python 解释器支持的附加内置类型。模块唯一的特殊操作是属性访问:m.name,这里 m 为一个模块而 name为定义在 m 的符号表中的一个名称。 模块属性可以被赋值。

  • 可调用类型:

可调用类型是可以应用函数调用的类型。它们可以是用户定义的函数、实例方法、生成器函数以及其他一些内置函数、方法和类。

有关 Python 中数据类型的详细,可以参阅 docs.python.org 中的文档。

8. 什么是 Python 中的 pass?

关键字 pass 表示 Python 中的空操作。它通常用于填充可能在运行时执行但尚未编写的空代码块。如果没有以下代码中的 pass 语句,我们可能会在代码执行过程中遇到一些错误。

def myEmptyFunc():		
	# do nothing
	pass
myEmptyFunc()    # nothing happens
## Without the pass keyword
# File "<stdin>", line 3
# IndentationError: expected an indented block

9. 什么是 Python 中的模块和包?

Python 包和模块是允许在 Python 中进行模块化编程的两种机制。模块化有几个优点:

  • 简单性:处理单个模块可以帮助专注于手头问题的相对较小的一部分。这使得开发更容易,更不容易出错。
  • 可维护性:模块被设计为在不同的问题域之间强制执行逻辑边界。如果它们是以一种减少相互依赖的方式编写的,那么模块中的修改不太可能影响程序的其他部分。
  • 可重用性:在模块中定义的函数可以很容易地被应用程序的其他部分重用。
  • 作用域:模块通常定义一个单独的命名空间,这有助于避免来自程序其他部分的标识符之间的混淆。

一般来说,模块只是具有 .py 扩展名的 Python 文件,可以定义和实现一组函数、类或变量。它们可以使用语句导入并初始化一次。如果需要部分功能,使用 import ... from ... 导入必需的类或函数

包允许使用点符号对模块命名空间进行分层结构。模块有助于避免全局变量名之间的冲突,同样,包有助于避免模块名之间的冲突。创建包很容易,因为它利用了系统固有的文件结构。所以只要把模块塞进一个文件夹,就可以了,文件夹名就是包名。从这个包中导入模块或其内容需要将包名作为模块名的前缀,并加上一个点。

10. Python 中的全局属性、受保护属性和私有属性是什么?

  • 全局变量是在全局范围内定义的公共变量。要在函数内的全局范围内使用该变量,我们使用关键字 global
  • 受保护属性是用前缀在其标识符上的下划线定义的属性,例如。_萨拉。仍然可以从定义它们的类之外访问和修改它们,但负责任的开发人员应避免这样做。
  • 私有属性是在其标识符上带有双下划线前缀的属性,例如,__ansh。它们不能直接从外部访问或修改,如果进行此类尝试,将导致 AttributeError。

11. self 在 Python 中有什么用?

self 在 Python 中是一个特殊的参数,用于表示对象自身。它通常作为方法的第一个参数传递,并用于访问对象的属性和方法。

在类定义中,我们可以使用 self 来引用当前实例对象的属性和方法。通过 self,我们可以在类的方法中操作对象的状态,并将其封装起来以供其他方法调用。

举个例子,在一个 Person 类中,我们可以定义一个名为 set_name 的方法,使用 self 参数来设置对象的姓名属性:

class Person:
    def set\_name(self, name):
        self.name = name

在这个例子中,self 参数表示当前实例对象,我们可以通过 self.name 来访问该对象的 name 属性。

总而言之,self 在 Python 中用于表示对象自身,在类的方法中使用 self 可以方便地访问和操作对象的属性和方法。

12. 什么是__init__?

__init__是Python中的一个特殊方法,用于在创建类的实例时进行初始化操作。它被称为构造函数或初始化方法。

当我们使用类创建对象时,Python 会自动调用该类的__init__方法来执行一些初始化任务。在__init__方法中,我们可以定义对象的属性并给它们赋初始值。

举个例子,假设我们有一个 Person 类,希望在创建 Person 对象时可以设置姓名和年龄。可以在类中定义一个__init__方法,并接受 name 和 age 两个参数来初始化对象的属性:

class Person:
    def \_\_init\_\_(self, name, age):
        self.name = name
        self.age = age

当我们创建一个 Person 对象时,可以传递相应的参数来初始化对象的属性:

person = Person("Alice", 25)

在这个例子中,当我们执行 Person("Alice", 25) 时,Python 会自动调用 Person 类的__init__方法,并将 “Aliice” 和 25 作为参数传递给该方法。在__init__方法中,通过 self.name 和 self.age 来分别初始化对象的 name 和 age 属性。

13. 什么是 Python 中的 break、continue 和 pass?

breakbreak 语句立即终止循环,控制程序运行到循环体后面的语句。
continuecontinue 语句是 break 语句的小版本,跳过当前迭代中的其余代码,控制程序运行到循环的下一个迭代。
pass如上所述,Python 中的 pass 关键字通常用于填充空块,类似于 Java、C++、Javascript 等语言中由分号表示的空语句。
pat = [1, 3, 2, 1, 2, 3, 1, 0, 1, 3]
for p in pat:
   pass
   if (p == 0):
       current = p
       break
   elif (p % 2 == 0):
       continue
   print(p)    # output => 1 3 1 3 1
print(current)    # output => 0

14. 什么是 Python 中的单元测试?

Python 中的单元测试是一种侧重于验证软件系统中单个单元或组件的正确性的测试。单元通常指的是一小段独立的代码,如函数、方法或类。

单元测试的目的是确保每个代码单元按预期执行,并在给定特定输入的情况下产生所需的输出。通过编写和运行单元测试,开发人员可以在开发过程的早期检测和修复错误,在进行更改时最小化引入新错误的风险,并提高代码库的整体质量和可靠性。

在 Python 中,单元测试通常使用测试框架(如 unittest、pytest 或 nose)创建。这些框架为定义测试用例、执行测试用例和报告结果提供了实用工具和断言。

典型的单元测试包括:

  • 定义测试用例:这包括创建函数或方法,这些函数或方法定义了具有已知输入和预期输出的特定测试用例。
  • 执行测试用例:测试框架自动运行定义的测试用例,并检查实际输出是否与预期输出匹配。
  • 报告结果:测试框架提供关于测试通过、失败或遇到错误的详细报告。

通过定期运行单元测试,开发人员可以获得对代码行为的信心,促进团队成员之间的协作,并确保对代码库的修改或添加不会引入回档。

15. 什么是 Python 中的文档字符串?

  • 文档字符串(docstring)是用于记录特定代码段的多行字符串。
  • Python 的 docstring 约定建议使用三引号(“”")来定义 docstring。文档字符串可以在模块、函数、类或方法定义之后立即写入,并包含在各自的代码块中。
  • 文档字符串应描述函数或方法的作用。

下面是一个带有 docstring 的函数示例:

def add(a, b):
    """
 Adds two numbers and returns the result.
 
 Args:
 a (int): The first number.
 b (int): The second number.
 
 Returns:
 int: The sum of the two numbers.
 """
    return a + b

16. 什么是 Python 中的切片?

  • 顾名思义,“切片” 是其中的一部分。
  • 切片的语法是 [start : end : step]
  • start 是要从中对列表或元组进行切片的起始索引
  • end 是结束索引或停止的地方。。
  • step 是跳跃的步数。
  • start 的默认值为 0,end 为项目数,step 为 1。
  • 切片可以在字符串、数组、列表和元组上完成。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(numbers[1 : : 2])		# output : [2, 4, 6, 8, 10]

17. 解释如何在 Unix 上使 Python 脚本可执行?

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ix 上使 Python 脚本可执行?

[外链图片转存中…(img-qrgloBbk-1715078344077)]
[外链图片转存中…(img-M2M6V6E7-1715078344078)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值