【Python基础知识】面试基础知识

本文为个人学习总结,无任何商业用途,若涉及侵权,联系删除。

文章目录

  • Python的变量类型
  • Python函数是值传递还是引用传递?
  • python中可作为字典key的类型
  • Python是否可重载
  • Python中的字典Dictionary详解
  • python is和==的区别
  • list和tuple的区别?
  • range和xrange的区别
  • python中/和//的区别
  • python传参会改变原值吗?
  • python里lambda条件表达式?
  • Python里面的三元运算符
  • 字符串


Python的变量类型

Python的变量类型可以分为两类:可变和不可变数据类型

  1. 不可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,就称不可变数据类型,包括:int(整型)、string(字符串)、tuple(元组);
  2. 可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,就称可变数据类型。包括:set(集合)、list(列表)、dict(字典)。

Python函数是值传递还是引用传递?

Python参数传递采用的是“传对象引用”的方式,这种方式相当于值传递和引用传递的一种综合。
3. 不可变参数类型是值传递:如果函数收到的是一个不可变数据类型(比如数字、字符或者元组)的引用,就不能直接修改原始对象,相当于通过“传值’来传递对象。
4. 可变参数类型是引用传递:如果函数收到的是一个可变数据类型(比如字典或者列表)的引用,就能修改对象的原始值,相当于通过“传引用”来传递对象。

python中可作为字典key的类型

  1. 一个对象能不能作为字典的key,就取决于其有没有hash方法。
  2. 字典的键可以是任意不可变数据类型,需要注意的是tuple元组作为键时,tuple不能以任何方式包含可变对象。

Python是否可重载

重载定义:多个相同函数名的函数,根据传入的参数个数、参数类型而执行不同的功能。所以函数重载实质上是为了解决编程中参数可变不统一的问题。
在python中,具有重载的思想却没有重载的概念,因为python并不需要重载。python是一门动态语言,不需要声明变量类型,函数中可以接受任何类型的参数也就无法根据参数类型来支持重载,python没有必要去考虑参数的类型问题,这些都可以在函数内部判断处理,并无必要去在写一个函数。python有多种传参方式,默认参数/可变参数/可变关键字参数可以处理函数参数中参数可变的问题。

Python中的字典Dictionary详解

  • Dictionary内部是如何实现的?
    Dictionary字典相当于一个HashMap,是通过散列表或说哈希表实现的。字典也是一个数组,但数组的索引是键经过哈希函数处理后得到的散列值。哈希函数的目的是使键均匀地分布在数组中,并且可以在内存中以O(1)的时间复杂度进行寻址,从而实现快速查找和修改。
  • hash表怎么解决冲突?
    哈希表中哈希函数的设计困难在于将数据均匀分布在哈希表中,从而尽量减少哈希碰撞和冲突。由于不同的键可能具有相同的哈希值,即可能出现冲突,高级的哈希函数能够使冲突数目最小化。
    哈希函数就是一个映射,因此哈希函数的设定很灵活,只要使得任何关键字由此所得的哈希函数值都落在表长允许的范围之内即可。本质上看哈希函数不可能做成一个一对一的映射关系,其本质是一个多对一的映射,这也就引出了一个概念:哈希冲突或者说哈希碰撞。哈希碰撞是不可避免的,但是一个好的哈希函数的设计需要尽量避免哈希碰撞。

Python2中使用开放地址法解决冲突。
CPython使用伪随机探测(pseudo-random probing)的散列表(hash table)作为字典的底层数据结构。由于这个实现细节,只有可哈希的对象才能作为字典的键。字典的三个基本操作(添加元素,获取元素和删除元素)的平均事件复杂度为O(1)。

  • 可变数据类型为什么不能作为字典的键?
    Python中所有不可变的内置类型都是可哈希的。可变数据类型(如列表,字典和集合)就是不可哈希的,因此不能作为字典的键。
  • 常见的哈希碰撞解决方法
    ①开放寻址法
    开放寻址法中,所有的元素都存放在散列表里,当产生哈希冲突时,通过一个探测函数计算出下一个候选位置,如果下一个获选位置还是有冲突,那么不断通过探测函数往下找,直到找个一个空槽来存放待插入元素。
    开放地址的意思是除了哈希函数得出的地址可用,当出现冲突的时候其他的地址也一样可用,常见的开放地址思想的方法有线性探测再散列,二次探测再散列等,这些方法都是在第一选择被占用的情况下的解决方法。
    ②再哈希法
    这个方法是按顺序规定多个哈希函数,每次查询的时候按顺序调用哈希函数,调用到第一个为空的时候返回不存在,调用到此键的时候返回其值。
    ③链地址法
    将所有关键字哈希值相同的记录都存在同一线性链表中,这样不需要占用其他的哈希地址,相同的哈希值在一条链表上,按顺序遍历就可以找到。
    ④公共溢出区
    其基本思想是:所有关键字和基本表中关键字为相同哈希值的记录,不管他们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。
  • Python里面的字典的key可以用list吗?可以用tuple吗?可以用set吗?
    一个对象能不能作为字典的key,就取决于其有没有hash方法。 所以所有python自带类型中,除了list、dict、 set和内部至少带有上述三种类型之-的tuple之外,其余的对象都能当key。

python is和==的区别

is是用来判断两个变量引用的对象是否为同一个, ==用于判断引用对象的值是否相等。可以通过id()函数查看引用对象的地址。

list和tuple的区别?

  • list是一种有序的集合,可以随时添加和删除其中的元素。tuple是一种有序列表,它和list非常相似。tuple一旦初始化就不能修改,而且没有append() insert()这些方法,可以获取元素但不能赋值变成另外的元素。
  • 不同点: list是可更改的,所以,可以insert, pop等 ,但是tuple是不可更改的,所以没有增减函数,但是其余的查询len(), index()等函数都是一样的。

range和xrange的区别

1、range 是生成一个列表
2、xrange用法与range完全相同,不同的是生成的不是一个list对象,只是返回的是一个"xrange object"对象
3、在生成很大的数字序列时候,用xrange会比range性能优很多,xrange则不会直接生成一个list,而是每次调用返回其中的一个值,内存空间使用极少,因而性能非常好。
4、xrange和range都在循环的时候使用。

python中/和//的区别

  • / "表示浮点数除法,返回浮点结果;
  • // "表示整数除法,返回不大于结果的一个最大的整数

python传参会改变原值吗?

  • 当我们传的参数是int、字符串(string)、 float、 (数值型number) 、 元组(tuple) 时,无论函数中对其做什么操作,都不会改变函数外这个参数的值;
  • 当传的是字典型(dictionary)、列表型(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()

你可能感兴趣的:(python,面试,开发语言)