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])
参考: