Python 面试题一

参考文章:https://www.cnblogs.com/sui776265233/p/9714271.html#_label2
一、基础知识
1.1 在python中,strings, tuples, 和numbers是不可更改的对象,而 list, dict, set 等则是可以修改的对象。
1.2 问: 将列表生成式中[]改成() 之后数据结构是否改变? 答案:是,从列表变为生成器


1.3 新式类和旧式类
参考文章:https://www.cnblogs.com/btchenguang/archive/2012/09/17/2689146.html
函数:指的是第一个参数不是self的函数,不在类中定义的函数
方法:指是的第一个参数是self的函数
实例:类的对象,instance
对象模型:就是实现对象行为的整个框架,这里分为经典和新的两种
——新式类和旧式类 区别
新式类是在创建的时候继承内置object对象(或者是从内置类型,如list,dict等),而经典类是直
接声明的。
使用dir()方法也可以看出新式类中定义很多新的属性和方法,而经典类好像就2个
新式类定义的新的属性和方法:
[‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘new’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’]
new__是一个静态方法,而__init__是一个实例方法.
new__方法会返回一个创建的实例,而__init__什么都不返回.
只有在__new__返回一个cls的实例时后面的__init__才能被调用.
当创建一个新实例时调用__new
,初始化一个实例时用__init
.


1.4 单例模式(常考)
参考文章:https://www.cnblogs.com/huchong/p/8244279.html
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
单例模式 的设计方法:
1、使用_new_ 方法
2、共享属性 (创建实例时把所有实例的__dict__指向同一个字典,这样它们具有相同的属性和方法)
3、装饰器
4、使用类
5、基于metaclass方式实现


1.5 Python中的作用域
Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。
本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)

1.6 协程 ???
协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态.最常见的yield就是协程的思想!

1.7 闭包
参考文章:https://www.cnblogs.com/Lin-Yi/p/7305364.html
闭包(closure)是函数式编程的重要的语法结构。当一个内嵌函数引用其外部作作用域的变量,我们就会得到一个闭包.
创建一个闭包必须满足以下几点:
必须有一个内嵌函数 —— 内嵌函数必须引用外部函数中的变量 —— 外部函数的返回值必须是内嵌函数
引用类似于c语言里的指针,


1.8 引用和copy(),deepcopy()的区别 ?
c = copy.copy(a) #对象拷贝,浅拷贝,只拷贝父对象,不会拷贝对象的内部的子对象。浅拷⻉是对于⼀个对象的顶层拷⻉:拷⻉了引⽤,并没有拷⻉内容
d = copy.deepcopy(a) #对象拷贝,深拷贝,拷贝对象及其子对象,深拷⻉是对于⼀个对象所有层次的拷⻉(递归)


1.9 Python垃圾回收机制
Python GC主要使用引用计数(reference counting)来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”(mark and sweep)解决容器对象可能产生的循环引用问题,通过“分代回收”(generation collection)以空间换时间的方法提高垃圾回收效率
——引用计数
PyObject是每个对象必有的内容,其中ob_refcnt就是做为引用计数。当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少.引用计数为0时,该对象生命就结束了。
——标记-清除机制
基本思路是先按需分配,等到没有空闲内存的时候从寄存器和程序栈上的引用出发,遍历以对象为节点、以引用为边构成的图,把所有可以访问到的对象打上标记,然后清扫一遍内存空间,把所有没标记的对象释放。
——分代技术
分代回收的整体思想是:将系统中的所有内存块根据其存活时间划分为不同的集合,每个集合就成为一个“代”,垃圾收集频率随着“代”的存活时间的增大而减小,存活时间通常利用经过几次垃圾回收来度量。


1.20 read,readline和readlines??:
read 读取整个文件
readline 读取下一行,使用生成器方法
readlines 读取整个文件到一个迭代器以供我们遍历

1.21 Python2和3的区别
参考文章:http://chenqx.github.io/2014/11/10/Key-differences-between-Python-2-7-x-and-Python-3-x/


二、 常考内容:
2.1 简述解释型和编译型编程语言?
将由高级语言编写的程序文件转换为可执行文件(二进制的)有两种方式,编译和解释,编译是在程序运行前,已经将程序全部转换成二进制码,而解释是在程序执行的时候,边翻译边执行。

2.2 Python解释器器种类以及特点?
——CPython ,是使用最广的Python解释器。
——IPython ,是基于CPython之上的一个交互式解释器;
——Jython ,Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
——IronPython,是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。

2.3 位和字节的关系、b、B、KB、MB、GB 的关系?
1B(byte字节) =8b(比特位)
  1KB = 1024B
  1MB = 1024KB
  1GB = 1024MB

2.4 请编写一个函数实现将IP地址转换成一个整数。
def ip_to_int(s):
L = ‘0b’+’’.join([bin(int(i)) for i in s.split(’.’)]).replace(‘0b’,’’)
print(int(L,2))
if name == ‘main’:
s = “10.3.9.12”
ip_to_int(s)

2.5 xrange和range的区别
xrange 用法与 range 完全相同,所不同的是生成的不是一个list对象,而是一个生成器。
2.6 *arg和 * * kwarg作用
args代表位置参数,它会接收任意多个参数并把这些参数作为元组传递给函数。**kwargs代表的关键字参数,允许你使用没有事先定义的参数名,另外,位置参数一定要放在关键字参数的前面。 星号把序列或者集合解包(unpack)成位置参数,两个星号 * * 把字典解包成关键词参数。
2.7 is和==的区别

  is 是⽐较两个引⽤是否指向了同⼀个对象(引⽤⽐较)。

== 是⽐较两个对象的值是否相等

2.8 列举常见的内置函数?
最常见的内置函数是:
print(“Hello World!”)
数学运算
abs(-5) # 取绝对值,也就是5
round(2.6) # 四舍五入取整,也就是3.0
pow(2, 3) # 相当于23,如果是pow(2, 3, 5),相当于23 % 5
cmp(2.3, 3.2) # 比较两个数的大小
divmod(9,2) # 返回除法结果和余数
max([1,5,2,9]) # 求最大值
min([9,2,-4,2]) # 求最小值
sum([2,-1,9,12]) # 求和
类型转换
int(“5”) # 转换为整数 integer
float(2) # 转换为浮点数 float
long(“23”) # 转换为长整数 long integer
str(2.3) # 转换为字符串 string
complex(3, 9) # 返回复数 3 + 9i
ord(“A”) # “A"字符对应的数值
chr(65) # 数值65对应的字符
unichr(65) # 数值65对应的unicode字符
bool(0) # 转换为相应的真假值,在Python中,0相当于False
在Python中,下列对象都相当于False:[], (),{},0, None,0.0,’’
bin(56) # 返回一个字符串,表示56的二进制数
hex(56) # 返回一个字符串,表示56的十六进制数
oct(56) # 返回一个字符串,表示56的八进制数
list((1,2,3)) # 转换为表 list
tuple([2,3,4]) # 转换为定值表 tuple
slice(5,2,-1) # 构建下标对象 slice
dict(a=1,b=“hello”,c=[1,2,3]) # 构建词典 dictionary
序列操作
all([True, 1, “hello!”]) # 是否所有的元素都相当于True值
any([”", 0, False, [], None]) # 是否有任意一个元素相当于True值
sorted([1,5,3]) # 返回正序的序列,也就是[1,3,5]
reversed([1,5,3]) # 返回反序的序列,也就是[3,5,1]
编译,执行
repr(me) # 返回对象的字符串表达
compile(“print(‘Hello’)”,‘test.py’,‘exec’) # 编译字符串成为code对象
eval(“1 + 1”) # 解释字符串表达式。参数也可以是compile()返回的code对象
exec(“print(‘Hello’)”) # 解释并执行字符串,print(‘Hello’)。参数也可以是compile()返回的code对象

2.9 一行代码实现99乘法表?
*print("\n".join("\t".join(["%s%s=%s" % (y, x, x
y) for y in range(1, x + 1)]) for x in range(1, 10)))**

2.10 .如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
“1,2,3”.split(’,’)
2.11 如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
[int(i) for i in “1,2,3”.split(’,’)]
2.12 如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
[pow(i,2) for i in range(1,11)]

2.13 列表生成式、生成器(Generator)、可迭代对象(Iterable)、迭代器Itertor
参考文章:https://www.cnblogs.com/yyds/p/6281453.html
——列表生成式:
语法格式:[exp for iter_var in iterable]
带过滤功能语法格式: [exp for iter_var in iterable if_exp]
循环嵌套语法格式 :[exp for iter_var_A in iterable_A for iter_var_B in iterable_B], 每迭代iterable_A中的一个元素,就把ierable_B中的所有元素都迭代一遍。
它最主要的应用场景是:根据已存在的可迭代对象推导出一个新的list。
案例1:把一个列表中所有的字符串转换成小写,非字符串元素原样保留
L = [‘TOM’, ‘Peter’, 10, ‘Jerry’]
#用列表生成式实现
list1 = [x.lower() if isinstance(x, str) else x for x in L]
#用map()函数实现
list2 = list(map(lambda x: x.lower() if isinstance(x, str) else x, L))

——生成器(Generator):作用按照某种算法不断生成新的数据,直到满足某一个指定的条件结束。
生成器的构造方法:一是使用类似列表生成式的方式生成;使用包含yield的函数来生成。
生成器的特性: 只有在调用时才会生成相应的数据;只记录当前的位置;只能next,不能prev。
生成器的调用方式:使用循环对生成器对象进行遍历(推荐);调用内置的next()方法;调用生成器对象的send()方法。
注意:如果生成器函数有返回值,要获取该返回值的话,只能通过在一个while循环中不断的next(),最后通过捕获StopIteration异常;第一次调用生成器的send()方法时,参数只能为None,否则会抛出异常。当然也可以在调用send()方法之前先调用一次next()方法,目的是让生成器先进入yield表达式。

——可迭代对象(Iterable)
:可直接用于for循环的对象统称为可迭代对象(Iterable)。
可迭代(可用于for循环)的数据类型有: 集合数据类型:如list、tuple、dict、set、str等;生成器(Generator)。
使用isinstance()来判断一个对象是否是Iterable对象:
from collections import Iterable
print(isinstance([], Iterable))

——迭代器(Iterator)
:可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。 (生成器也是迭代器)

——Iterable、Iterator与Generator之间的关系?
生成器对象既是可迭代对象,也是迭代器;
迭代器对象一定是可迭代对象,反之则不一定:例如list、dict、str等集合数据类型是可迭代对象,但不是迭代器,但是它们可以通过iter()函数生成一个迭代器对象。
迭代器、生成器和可迭代对象都可以用for循环去迭代,生成器和迭代器还可以被next()方函数调用并返回下一个值。

2.14 os和sys模块的作用?
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;
sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。

2.15 什么是反射?
反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

2.16 关于Python的函数Method 与方法(Function)的区别!
先上结论:
函数(function)是Python中一个可调用对象(callable), 方法(method)是一种特殊的函数。
一个可调用对象是方法还是函数,和这个对象无关,仅和这个对象是否与类或实例绑定有关(bound method)。
实例方法,在类中未和类绑定,是函数;在实例中,此实例方法与实例绑定,即变成方法。
静态方法没有和任何类或实例绑定,所以静态方法是个函数。
装饰器不会改变被装饰函数或方法的类型。
类实现__call__方法,其实例也不会变成方法或函数,依旧是类的实例。
使用callalble() 只能判断对象是否可调用,不能判断是不是函数或方法。
判断对象是函数或方法应该使用type(obj)。

2.17 简述__new__和__init__的区别
创建一个新实例时调用__new__,初始化一个实例时用__init__,这是它们最本质的区别。
new方法会返回所构造的对象,init则不会.
new函数必须以cls作为第一个参数,而init则以self作为其第一个参数.

2.18 .有用过withstatement吗?它的好处是什么?具体如何实现?
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

2.19 查看主机安装了哪些模块,及版本?
#]# pip freeze

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值