python面试题

1.多进程和多线程 

(1)、python下多线程的限制以及多进程中传递参数的方式

python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一个线程使用解释器,跟单cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不是“并行”。
  多进程间共享数据,可以使用 multiprocessing.Value 和 multiprocessing.Arra2y

(2)、python多线程与多进程的区别  

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

(1)、Python引入了一个机制:引用计数

python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。

总结一下对象会在一下情况下引用计数加1:

- 1.对象被创建:x=4

- 2.另外的别人被创建:y=x

- 3.被作为参数传递给函数:foo(x)

- 4.作为容器对象的一个元素:a=[1,x,'33']

引用计数减少情况

- 1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。

- 2.对象的别名被显式的销毁:del x ;或者del y

- 3.对象的一个别名被赋值给其他对象:x=789

- 4.对象从一个窗口对象中移除:myList.remove(x)

- 5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

(2)、垃圾回收

1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。

2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。

 

在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

(3)、内存池机制

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

Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。


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

lambda 函数是一个可以接收任意多个参数(包括可选参数)并且返回单个表达式值的匿名函数

好处:
1、lambda 函数比较轻便,即用即删除,很适合需要完成一项功能,但是此功能只在此一处使用,
连名字都很随意的情况下;
2、匿名函数,一般用来给 filter, map 这样的函数式编程服务;
3、作为回调函数,传递给某些应用,比如消息处理

4.如何用Python输出一个Fibonacci数列?

a,b = 0, 1

while b<100:

   print (b)

   a, b = b, a+b

5.Python如何实现单例模式?其他23种设计模式python如何实现?

6.Python里面如何拷贝一个对象?
标准库中的copy模块提供了两个方法来实现拷贝.一个方法是copy,它返回和参数包含内容一样的对象.
使用deepcopy方法,对象中的属性也被复制.

7.如何用Python来进行查询和替换一个文本字符串?
可以使用sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, string[, count=0])
replacement是被替换成的文本
string是需要被替换的文本
count是一个可选参数,指最大被替换的数量

8.Python里面search()和match()的区别?
match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配, 也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none

9.用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别?
前者是贪婪匹配,会从头到尾匹配 <a>xyz</a>,而后者是非贪婪匹配,只匹配到第一个 >。

10.有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
1. 分别计算a,b序列的和;
2. 求a序列和与b序列和的差值的一半,记为half;
3. 在和值大的序列中找出一个与和值小的序列中的元素max的差值最接近half的元素,记为min;
4. 将max与min互换即可。

11.python代码得到列表list的交集与差集
交集

b1=[1,2,3]
b2=[2,3,4]
b3 = [val for val in b1 if val in b2]
print(b3)

差集

b1=[1,2,3]
b2=[2,3,4]
b3 = [val for val in b1 if val not in b2]
print(b3) 

12.写一个简单的python socket编程

服务器端:

1、创建套接字对象

2、绑定端口

3、监听

4、等待连接

5、处理阶段

客户端

13.python如何捕获异常
(1)使用try和except语句来捕获异常

 try:  
          block  
 3     except [exception,[data…]]:  
 4        block  
 5      
 6     try:  
 7        block  
 8     except [exception,[data...]]:  
 9        block  
10     else:  
11        block  

捕获到的IOError错误的详细原因会被放置在对象e中,然后运行该python 异常处理的except代码块捕获所有的异常

(2)用raise语句手工引发一个异常:

复制代码

      raise [exception[,data]]  
2      
3     try:  
4         raise MyError #自己抛出一个异常  
5     except MyError:  
6         print ('a error')  
7      
8     raise ValueError,’invalid argument’  

复制代码

(3)采用sys模块回溯最后的异常

1     import sys  
2     try:  
3        block  
4     except:  
5        info=sys.exc_info()  
6        print info[0],":",info[1]  

14.src = "security/afafsff/?ip=123.4.56.78&id=45",请写一段代码用正则匹配出ip

import re
src = "security/afafsff/?ip=123.4.56.78&id=45"
se = re.search('\d+.\d+.\d+.\d+', src).group()
print(type(se))
print(se)

15.平衡点问题 
平衡点:比如numbers = [1,3,5,7,8,25,4,20], 25前面的总和为24,25后面的总和也是24,25这个点就是平衡点;假如一个数组中的元素,其前面的部分等于后面的部分,那么这个点的位序就是平衡点 
要求:返回任何一个平衡点;

使用sum函数累加所有的数。
使用一个变量fore来累加序列的前部。直到满足条件fore<(total-number)/2;

numbers = [1, 3, 5, 7, 7, 2, 4, 20]

total = sum(numbers)

fore = 0
for number in numbers:
   if fore < (total - number)/2:
      fore += number
   elif fore == (total - number)/2:
       print(number)
       break
   else:
       print('not found')
       break
16.支配点问题: 
支配数:数组中某个元素出现的次数大于数组总数的一半时就成为支配数,其所在位序成为支配点;比如a = [3,3,1,2,3];3为支配数,0,1,4分别为支配点; 
要求:返回任何一个支配点
def dominate_point(a):
    # set_b = (3,0)
    set_b = set(a)
    for set_value in set_b:
        canditae_dominate = set_value
        count = 0
        for key, value in enumerate(a):
            if canditae_dominate == value:
                count += 1
            if count >= len(a)/2 and value == canditae_dominate:
                print("下标位置:", key) # 最后一些出现的位置
                print("出现最多的数", canditae_dominate)
                print("出现的次数", count)
dominate_point([3,3,0,3,3,6])

 

 

 

 

参考:

(1)、https://www.cnblogs.com/goodhacker/p/3366618.html

(2)、https://www.cnblogs.com/wangyuhangboke/p/7802253.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值