系列文章目录
个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页
Python面试专栏:《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读,一起进步!🌟🌟🌟
码字不易,如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!😊😊😊
本文是Python面试专栏的第一篇。在本专栏中,我将总结华为、阿里巴巴、字节跳动等互联网公司 Python 面试中最常见的 100+ 问题。每道题都提供参考答案,希望能够帮助你在求职面试中脱颖而出,找到一份高薪工作。这些面试题涉及 Python 基础知识、Python 编程、数据分析以及 Python 函数库等多个方面。
Python 面试的基础问题
1. 什么是 Python?使用 Python 的好处是什么
Python 是一种高级的、解释型的、通用的编程语言。作为一种通用语言,它可以使用合适的工具/库来构建几乎任何类型的应用程序。此外,Python 还支持对象、模块、线程、异常处理和自动内存管理,这有助于对现实世界的问题进行建模,并构建应用程序来解决这些问题。
使用 Python 的好处:
- Python 是一种通用编程语言,它具有简单、易于学习的语法,强调可读性,从而降低了程序维护的成本。此外,该语言能够编写脚本,是完全开源的,并支持鼓励模块化和代码重用的第三方包。
- 它的高级数据结构与动态类型和动态绑定相结合,吸引了大量开发人员进行快速应用程序开发和部署。
2. 什么是强动态类型语言?
什么是动态类型/静态类型?
在理解动态类型语言之前,我们应该先了解什么是类型检查。
类型检查是一个验证和施加类型约束的过程,编译器或解释器通常在编译或运行阶段做类型检查。用更简单的术语,类型检查仅仅就是查看变量和它们的类型,然后说这个表达式是合理的。
因此,现在我们知道类型检查是什么,明白这些术语真的很简单。
- 在静态类型语言(statically typed languages)中,类型检查发生在编译阶段(compile time),即代码执行前;
- 在动态类型语言(dynamically typed languages)中,类型检查发生在运行阶段(run time),即代码执行期间。
性能
- 静态类型:编译阶段做更多处理,但是运行时性能更好
- 动态类型:编译阶段更高效,但是运行时的类型检查会影响到性能
灵活性和出错
- 静态类型:运行时出错机会更小,但是提供给程序员的灵活性不好
- 动态类型:提供更多的灵活性但是运行时出错机会相对更大
什么是强类型/弱类型?
首先看下什么是强类型,在强类型中,不管在编译时还是运行时,一旦某个类型赋值给某个变量,它会持有这个类型,并且不能同其他类型在计算某个表达式时混合计算
然而,在弱类型中,它是很容易与其他类型混合计算的。
例如,在 Python 中,“1”+ 2 将导致类型错误,因为这些语言不允许 “类型强制转换”(数据类型的隐式转换)。然而,在另一门同样伟大的语言 Javascript 中,将简单地输出 “12” 作为结果。
记住
各种语言按照动态/静态,强/弱类型的划分:
结论
- 类型检查确保一个表达式中的变量类型是合法的。在静态类型语言中,类型检查发生在编译阶段;动态类型语言,类型检查发生在运行阶段。
- 强类型语言有更强的类型检查机制,表达式计算中会做严格的类型检查;而弱类型语言允许各种变量类型间做一些运算。
- Python 是一门强动态类型的语言
3.什么是解释型语言?
解释型语言逐行执行它的语句。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)的形式存储复数,并具有属性:real 和 imag 。 |
布尔型 | 存储布尔值(True 或 False)。 |
- 序列类型:
根据 Python 文档,有三种基本的序列类型—— 列表、元组和 range 对象。序列类型定义了用于遍历其元素的in
和not 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 中的文档。