python面试题总结(一)基础知识

1.      Python是如何进行内存管理的?

(1)对象的引用计数机制

Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。

引用计数增加的情况:

1.      一个对象分配一个新名称

2.      将其放入一个容器中

引用计数减少的情况:

1.      使用del语句对对象别名显示的销毁

2.      引用超出作用域或被重新赋值

使用sys.getrefcount()函数可以获得对象的当前引用计数

对于不可变数据(数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

(2)垃圾回收

1.当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。

2.del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。当a和b两个对象相互引用时,因此引用计数不会归零,对象不会销毁。(从而导致内存泄漏)为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

(3)内存池机制

         Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回个操作系统。

2.什么是lambda函数?它有什么好处?

 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是值匿名函数。

   a =lambda x,y:x+y  a(3,11)

3.      Python里面如何实现tuplelist的转换?

可以使用tuple和list函数,type函数可以判断对象的类型。

4.      请写出一段Python代码实现删除一个list里面的重复元素

(1)    使用set函数,set(list)变成了一个集合,然后用list()变成了列表

(2)    使用字典函数 a=[1,2,3,4,1,2,3] b=b.fromkeys(a)  c=list(b.keys())

5.      编程用sort进行排序,然后从最后一个元素开始判断如果有重复的元素删除

a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]

a.sort()

last=a[-1]

for i inrange(len(a)-2,-1,-1):

    if last==a[i]:

        del a[i]

    else:

        last=a[i]

        print(a)

6.      Python里面如何拷贝一个对象

赋值:只是复制了新对象的引用,不会开辟新的内存空间。

浅拷贝:创建新对象,其内容是原对象的引用。

深拷贝:深拷贝出来的对象是一个全新的对象,不在与原来的对象有任何关联。

pass一般作为占位符或者创建占位程序

7.      如何用Python来进行查询和替换一个文本字符串?

使用Python中的正则表达式。

Import re p=re.compile(‘bule|white|red’)  p.sub(‘color’,’blue socks and red shoes’)

8.      Python里面match()search()的区别

re 模块中的match检查string开头是否与pattern匹配。

re 模块中的search在string中搜索pattern的第一个匹配值。

         <.*>贪婪匹配<.*?>非贪婪匹配

xrange 返回一个xrange对象range返回一个列表

9.      Python中的负索引是什么?

python中的序列索引可以是正也可以是负。

10.生成器和迭代器

这些可以用在for语句进行循环的对象就是可迭代对象。我们自己创建一个容器,包含一系列元素,可以通过for语句依次循环取出每一个元素,这种容器就是迭代器。

创建一个迭代器方法

1.      为容器添加__iter__()和__next__()方法,__iter__()返回迭代器对象本身,__next__()返回每次调用next()或迭代时的元素

2.      内置函数iter()可以将可迭代对象转化为迭代器。

#迭代器

classiteration_1:

    def __init__(self,start=0,end=0):

        self.start=start

        self.end=end

    def __iter__(self):

        return self

    def __next__(self):

        if self.start

            i=self.start

            self.start=self.start+1

            return i

        else:

            raise StopIteration()

 

c=iteration_1(0,3)

for i inc:

    print(i)

生成器

生成器通过yield语句快速生成迭代器

简单来说,yield语句可以将普通函数变成一个生成器,并且相应的__next__()方法返回的是yield后边的值,程序执行到yield会返回值并暂停,在次调用next()时会从上次暂停的地方继续开始执行。

#生成器

defcontainer(start,end):

    while start

        yield start

        start=start+1

 

c=container(0,4)

 

for i inc:

print(i)

闭包是引用了自由变量的函数,这个被引用的自由变量将和这个函数一同存在。所以,闭包是由函数和与其相关的引用环境组合而成的实体。Python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,好处是在不用更改原函数的代码前提下给函数添加新的功能。

11.@property

Python中内置的@property装饰器就是负责把一个方法变成属性调用的。@property本身又创建了另一个装饰器@名字.setter,负责把一个setter方法变成属性赋值。

12.单例模式

单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。保证在系统中某个类的对象只能存在一个。一个类无论你实例化多少次,他的对象始终都是一个内存地址。

四种方法实现单例模式

1.      使用模块

2.      使用__new__

3.      使用装饰器

4.      使用元类

 

13.Python中的__init____new__方法

实例化一个类的时候最先调用的方法是__new__方法,然后调用__init__方法。

__init__是在类实例创建之后调用的,而__new__方法正是创建这个类实例的方法。

__new__方法主要是当你继承一些不可变的class时,提供给你一个自定义这些类的实例化过程的途径。

元类创建了这些类对象,元类为创建类的工厂,typepython内置的元类

当你写下class Fooobject)的时候,类对象Foo并不会在内存中创建,Python首先会看类定义中的metaclass。如果找到,就会使用它创建类对象Foo,否则,就使用type来创建。

 


你可能感兴趣的:(Python常见面试题)