【Python基础知识】面试基础知识
本文为个人学习总结,无任何商业用途,若涉及侵权,联系删除。
文章目录
探讨Python中的变量类型体系。
分析Python函数参数传递机制。
解析Python字典键支持的数据类型。
说明Python中的重载机制及其应用。
详细阐述Python字典(Dictionary)的相关特性及使用场景。
区分Python中is与==运算符的作用。
比较列表与元组在数据存储上的差异。
探讨在不同版本间rangexrange存在的意义及其使用区别。
解析整除操作符/与//在实现层面的不同表现形式。
探讨函数参数是否会修改原始数据这一关键问题。
介绍Lambda表达式中的条件语法结构及其实际应用方式。
分析三元表达式的功能特性以及如何灵活运用其简化代码逻辑设计过程。
Python的变量类型
Python的变量类型可以分为两类:可变和不可变数据类型
- Immutable data types: When the value of a variable associated with a data type changes, its corresponding memory address also changes. These are referred to as immutable data types, which include int (integer), string (string), and tuple.
- Mutable data types: When the value of a variable associated with a data type changes, its corresponding memory address does not change. These are known as mutable data types, comprising set (set), list (list), and dict (dictionary).
Python函数是值传递还是引用传递?
Python参数传递被选中使用"传对象引用"这一途径进行操作。这种做法本质上结合了值传递与引用传递的特点。
对于不可变数据类型的引用来讲,在函数体内无法直接更改其原始内容;这类似于仅进行"传值"的操作以实现信息传输的效果。
当一个可变数据类型的引用于函数中时,则能够直接更新其原始内容;这与"传引用"的操作原理是一致的。
python中可作为字典key的类型
- 一个对象能否作为字典的关键字(key),主要看它是否具备hash值能力。
- 字典的键必须满足不可变数据类型的条件。特别指出的是,在使用tuple元组作为键时,则必须保证tuple本身不可变,并且其中不能包含任何可变对象。
Python是否可重载
所谓重载定义 是指多个具有相同名称但接收不同输入参数数量或数据类型的函数。由此可见,在程序设计中实现这一目标的过程中就涉及到了对功能模块划分和实现策略的设计。有趣的是,在Python语言体系中虽然具备类似思想但并未真正实现这一概念。值得注意的是,在这种情况下无需特意引入额外的机制或机制来支持这种特性。由于其特性的动态性质,并非必须预先指定变量的数据类型即可满足需求。因此不具备通过判别不同数据类型的机制来实现功能区分的能力。在这种情况下无需特意关注变量的数据类型问题,并且所有的这类逻辑判断和处理操作都可以由单个函数完成而不必特意将它们分散到不同的模块或层次结构里。
Python中的字典Dictionary详解
-
从技术角度来看,Dictionary的具体实现细节是什么?
从数据结构角度来看,在底层实现上, Dictionary 字典采用了哈希表技术。其核心数据结构基于散列映射机制,在实际应用中能够高效地存储和检索键值对。需要注意的是,在某些编程语言中,默认情况下 Dictionary 会采用线性探测冲突解决策略,默认负载因子设置为 0.75 以便保证较好的性能表现。从性能层面分析,在平均情况下 Dictionary 的查找操作能够在 O(1) 时间复杂度内完成。- hash表怎么解决冲突?
哈希表中哈希函数的设计困难在于将数据均匀分布在哈希表中,从而尽量减少哈希碰撞和冲突。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。
哈希函数就是一个映射,因此哈希函数的设定很灵活,只要使得任何关键字由此所得的哈希函数值都落在表长允许的范围之内即可。本质上看哈希函数不可能做成一个一对一的映射关系,其本质是一个多对一的映射,这也就引出了一个概念:哈希冲突或者说哈希碰撞 。哈希碰撞是不可避免的,但是一个好的哈希函数的设计需要尽量避免哈希碰撞。
- hash表怎么解决冲突?
在Python 2中采用开放地址法来解决冲突是一种常见策略。
CPython采用伪随机探测(pseudo-random probing)的散列表(hash table)作为字典底层数据结构的一种关键实现细节。
基于这一实现细节,在字典中仅允许可哈希的对象作为键。
字典的基本操作包括添加元素、获取元素和删除元素(三种操作),其平均事件复杂度均为O(1),体现了高效的性能特点。
在Python中,在字典中仅允许可哈希的对象作为键。
在Python中,在构建字典时使用这些数据结构会导致错误或性能问题。对于可变数据类型(如列表、元组、集合)而言,在Python中它们无法被有效地哈希。因此,在构建字典时使用这些数据结构会导致错误或性能问题。
- 常见的哈希碰撞解决方法
①开放寻址法
开放寻址法中,所有的元素都存放在散列表里,当产生哈希冲突时,通过一个探测函数计算出下一个候选位置,如果下一个获选位置还是有冲突,那么不断通过探测函数往下找,直到找个一个空槽来存放待插入元素。
开放地址的意思是除了哈希函数得出的地址可用,当出现冲突的时候其他的地址也一样可用,常见的开放地址思想的方法有线性探测再散列,二次探测再散列等,这些方法都是在第一选择被占用的情况下的解决方法。
②再哈希法
这个方法是按顺序规定多个哈希函数,每次查询的时候按顺序调用哈希函数,调用到第一个为空的时候返回不存在,调用到此键的时候返回其值。
③链地址法
将所有关键字哈希值相同的记录都存在同一线性链表中,这样不需要占用其他的哈希地址,相同的哈希值在一条链表上,按顺序遍历就可以找到。
④公共溢出区
其基本思想是:所有关键字和基本表中关键字为相同哈希值的记录,不管他们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。
在Python中, 字典的关键字(keyword)是否能使用列表(list)、元组(tuple)或集合(set)作为其键(key)?实际上, 一个对象能否成为字典的关键字, 就取决于该对象是否具有哈希属性(hashtable attribute)。具体来说, 所有Python内置的数据类型中, 除了列表(list)、字典(dict)和集合(set)这三类数据结构外, 其他内置类型都能够在满足条件的情况下被用作字典的关键值。此外需要注意的是, 元组(tuple)作为一种不可变数据结构, 只有在其同时具备至少包含上述三种数据类型的组合时才能被允许作为字典的关键值;否则将无法被接受为有效的键值。
python is和==的区别
is用于区分两个变量所指向的对象是否是同一个内存块, ==则用于比较两个变量引用对象的实际值是否一致。通过调用id()函数能够获取到变量所占用内存的位置信息
list和tuple的区别?
- list作为一种顺序容器,在任何时间都可以方便地追加或删除其元素。Tuple作为另一种顺序数据结构,在功能上与List十分相似。一旦创建了Tuple对象,则无法对其进行任何修改操作。不提供append()或insert()等增删操作的方法。允许访问其存储的所有元素,并支持通过索引等方式引用特定项。
- List具备可变性,在实际使用中可以通过调用insert()或pop()方法来实现新增或移除指定项。The Tuple type is immutable. For other basic functional operations such as getting the length or finding the index, both data structures behave identically.
range和xrange的区别
- range 用于生成列表结构
- xrange 的用法与 range 完全一致, 其区别在于它不会直接生成 list 类型的对象, 而是返回的是一个 "xrange object" 对象。
- 当处理大规模的数字序列时, 使用 xrange 比 range 更高效。其优势在于不会立即生成整个 list 而是逐项调用, 这使得内存占用极低, 性能表现优异。
- 在循环操作中两者都能被调用。
python中/和//的区别
- / "表示浮点运算, 得到一个浮点数值;
- // 表示整数运算, 计算后得到的结果取不大于该值的最大整数值。
python传参会改变原值吗?
- 当参数为int、str、float、number或tuple时,在函数内部对其实施任何操作都不会影响到函数外部该变量的值;
- 当参数为dict或list时:
如果对该变量进行重新赋值,则函数外部变量的引用关系会发生变化;
但若对其进行操作(如修改其内容),则会通过引用传递给外部变量;
因此,在函数体外存储的是原始内存地址及其对应的数据;
只有当对变量进行复制并修改其内容时才会引起外部变量值的变化。
- 当参数为dict或list时:
python里lambda条件表达式?
sum = lambda num1, num2: num1 + num2
larger_num = lambda num1, num2: num1 if num1 > num2 else (num2 if num1 < num2 else 'They are equal')
Python里面的三元运算符
x = 1 if x>y else 0
字符串
// python种一般将字符串s: str存入列表方便后续操作
res = list(s)
// 将列表转化回字符串
''.join(res)
// 将列表res扩展那n个空格
res.extend([' '] * n)
// 列表res加上字符串'A'
res.append('A')
//翻转字符串s前n个字符
reversed(s[0:n])
//翻转整个字符串s
s.reverse()
s.count(' ') //统计字符串内的空格数
//取最后一位并删除
res.pop()
//将字符串变成表达式
eval()
