最近参加了几场招聘,发现好多人的一些基础知识不是很扎实,做的题很多都是错误的,因此找了一些我们公司面试过程中的一些最基本的面试题供大家参考,希望各位都能找到一个好的工作。今天给大家先分享的是关于Python语言方面的一些面试题,后续我会跟大家分享数据库,网路,操作系统以及数据结构方面的一些面试题,希望大家可以持续的关注。
1、为什么学习Python?
高级语言 :无需考虑如何管理你的程序使用的内存一类的底层细节等。 可移植性 :由于Python的开源本质,它已经被移植在许多平台上。 面向对象 :Python既支持面向过程的编程也支持面向对象的编程。 可扩展性 :Python编辑的程序中可以直接调用部分C或C++ 开发的程序。 可嵌入性 :可以把Python嵌入C/C++程序,从而向程序用户提供脚本功能。 丰富的库 : Python庞大的标准库可以帮助处理各种工作,几乎无所不能。 规范的代码 : Python不需要编译成二进制代码的强制缩进方式,使得代码具有较好的可读性。
2、简述解释型和编译型编程语言?
1.编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。编译型语言,执行速度快、效率高;依赖编译器、跨平台性差些。如C、C++、Delphi、Pascal,Fortran。 2.解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!解释型语言,执行速度慢、效率低;依赖解释器、跨平台性好。如Java、Basic 3.通俗的讲,编译语言是在编译后可以直接运行,而解释语言的执行需要一个解释环境。
3、位和字节的关系?
-
最小的存储单位称为位(bit):
只能容纳两个值(0或1)之一,不能在一个位中存储更多的信息。位是计算机存储的基本单位。
-
字节(byte)是常用的计算机存储单位。
字节的标准定义:一个字节均为8位。由于上述所讲每个位或者是0或者是1,所以一个8位的字节包含256种可能的0,1组合
4、b、B、KB、MB、GB 的关系?
1024B=1KB,1024KB=1MB, 1024MB=1GB,1024GB=1TB. 他们是计算机中表示容量的单位。都是2的10次方进制的。 他们可以用来表示内存、硬盘等的容量。
5、请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
10 00001010 3 00000011 9 00001001 12 00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
def ipTodec(ip): """ :param ip: char IP地址:192.168.1.1 :return: """ dec_ips = ip.split('.') bin_ips = " " for decnum in dec_ips: bin_ele = bin(int(decnum))[2::] bin_ips += bin_ele print(bin_ips) print(int(bin_ips, 2))
6、python递归的最大层数?
Python确实有递归次数限制,默认最大次数为1000 但可以使用下面的方法来指定次数。
sys.setrecursionlimit(limit)
7、求结果:
v1 = 1 or 3 v2 = 1 and 3 v3 = 0 and 2 and 1 v4 = 0 and 2 or 1 v5 = 0 and 2 or 1 or 4 v6 = 0 or False and 1 结果: 1 3 0 1 1 False
8、ascii、unicode、utf-8、gbk 区别?
最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码, 比如大写字母A的编码是65,小写字母z的编码是122。 但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里, 各国有各国的标准,就会不可避免地出现冲突, 结果就是,在多语言混合的文本中,显示出来会有乱码。因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。新的问题又出现了:如果统一成Unicode编码,乱码问题从此消失了。但是,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
所以,本着节约的精神,又出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。
如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分, 所以,大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作。
9、用一行代码实现数值交换:
a = 1 b = 2 a, b = b, a
10、xrange和range的区别?
range产生的是一个列表,而xrange产生的是一个生成器器的。 所以对于较大的集合时候,xrange比range性能好。 因为range一次把所以数据都返回,而xrange每次调用返回其中的一个值
11、列举布尔值为False的常见值?
False None 0 ‘’ “” [] {} ()
12、字符串、列表、元组、字典每个常用的5个方法?
str .join() .split() .lower() .upper() .strip()
list .append() .pop() .reverse() .sort() .remove()
tuple .index() .count() len(atuple) max(atuple) min(tuple)
dict .get() .keys() .values() .iters() .update()
13、lambda表达式格式以及应用场景?
python 使用 lambda 表达式来创建匿名函数 lambda只是一个表达式,函数体比def简单很多
14、 *arg
和 **kwarg
作用?
可变参数
*args
允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple,而 关键字参数**kwargs
允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
15、简述Python的深浅拷贝以及应用场景?
= 赋值:数据完全共享(=赋值是在内存中指向同一个对象,如果是可变(mutable)类型,比如列表,修改其中一个,另一个必定改变, 如果是不可变类型(immutable),比如字符串,修改了其中一个,另一个并不会变 浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层) 深拷贝:数据完全不共享(复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享)
16、Python垃圾回收机制?
Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率。
17、求结果:
v = dict.fromkeys(['k1','k2'],[]) v['k1'].append(666) print(v) v[‘k1’] = 777 print(v) {'k1': [666], 'k2': [666]} {'k1': 777, 'k2': [666]}
18、一行代码实现9*9乘法表?
1 print(" ".join(" ".join(["%s*%s=%s" % (x, y, x * y) for y in range(1, x + 1)]) for x in range(1, 10)))
19、至少列举8个常用模块都有哪些?
os , sys, time, random, logging
20、re的match和search区别?
re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。 re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。
21、求结果:
1 a: [ i % 2 for i in range(10) ] 2 3 b: ( i % 2 for i in range(10) ) 4 5 a: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1] 6 7 b: <generator object <genexpr> at 0x011A3E40>
22、如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
1 astring = “1,2,3” 2 list(astring.split(','))
23、如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
map(int, [‘1’,’2’,’3’])
25、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
[x*x for x in range(1, 11)]
26、一行代码实现删除列表中重复的值 ?
alist = [6,9,3,6,5,4,78,5,4,4,4]
print(list(set(alist)))
27、请用代码解答实现stack(堆栈)
Python: 3.x class stack(object): def __init__(self): self.items = [] def isEmpty(self): return self.items == [] def push(self, item): self.items.append(item) def pop(self): return self.items.pop() def peek(self): return self.items[-1] def size(self): return len(self.items)
28、用Python实现一个二分查找的函数。
def binary_search(alist, key): low, high = 0, 0 mid = len(alist) - 1 time = 0 while low < high: time += 1 mid = (low + high) // 2 if alist[mid] < key: low = mid + 1 elif alist[mid] > key: high = mid - 1 else: print("Search {} times! ".format(time)) return mid print("No Search {} times! ".format(time))
29、os和sys模块的作用?
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口, sys模块负责程序与Python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。
30、如何生成一个随机数?
Python中使用Random模块来生成随机数 常用的方法有:.randint(), .random(), .randrange(), .sample(), .seed(), .uniform()
31、如何使用python删除一个文件?
使用os模块中的remove方法,注意判断文件是否存在,是否具有权限。
32、面向对象中super的作用?
super() 函数是用于调用父类(超类)的一个方法。 super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
33、列举面向对象中带双下划线的特殊方法
-
_init__(self,...) 、__del__(self) 、__call__(self, *args) 、__str__(self, 方法)
-
__add__、__dic__、__getitem__、__setitem__、__delitem__、__iter__
34、静态方法和类方法区别?
实例方法只能被实例对象调用,静态方法(由@staticmethod装饰的方法)、类方法(由@classmethod装饰的方法),可以被类或类的实例对象调用。 实例方法,第一个参数必须要默认传实例对象,一般习惯用self。 静态方法,参数没有要求。 类方法,第一个参数必须要默认传类,一般习惯用cls。
35、列举面向对象中的特殊成员以及应用场景?
1.__doc__ :打印类的描述信息 2.__module__:表示当前操作的对象在那个模块 3.__class__:表示当前操作的对象的类是什么 4.__init__ :构造方法,通过类创建对象时,自动触发执行 5.__del__:析构方法,当对象在内存中被释放时,自动触发执行 6.__call__:对象后面加括号,触发执行 7.__dict__:查看类或对象中的所有成员 8.__str__:如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值 9.__getitem__、__setitem__、__delitem__: 注:用于索引操作,如字典。以上分别表示获取、设置、删除数据 10.__new____metaclass__ *(自定义类) __new__:是用来创建实例的,对类实例化之前进行定制,可以用到。 __metaclass__:定义一个类如何被创建
36、什么是反射?以及应用场景?
解释一: python的反射,它的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动。
解释二: 需要执行对象里的某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,
几个重要方法:
hasattr: 判断对象中是否有这个方法或变量
getattr: 获取对象中的方法或变量的内存地址
setattr: 为对象添加变量或方法
elattr: 删除对象中的变量。注意:不能用于删除方法
37、装饰器的写法以及应用场景。
装饰器是一个很著名的设计模式,经常被用于有切面需求的场景, 较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计, 有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。 概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
1 def decorator(func): 2 def wapper(*args, **kwargs): 3 print("This is a defcorator!") 4 reture func(*args, **kwargs) 5 return wapper
38、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
-
import json
-
a=json.dumps({"ddf":"你好"},ensure_ascii=False)
-
print(a) #{"ddf": "你好"}
以上,就是我们整理的一些关于Python纯语言的面试题,但是面试的时候肯定不止这些,因此后续我们会持续更新关于数据结构,算法,操作系统,网络相关的面试题,大家可以持续关注我们的公众号,最后,再给大家留一道百度的面试题,各位可以试着想一下: