python面试题

2023-11-09

文章目录

Python面试基础题小汇总

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

答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制

一、对象的引用计数机制

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

引用计数增加的情况:

1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)

引用计数减少的情况:

1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值

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

多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。

二、垃圾回收

1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

三、内存池机制

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

1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

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

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

lambda函数:首要用途是指点短小的回调函数

lambda [arguments]:expression
 a=lambdax,y:x+y
 a(3,11)

3. Python里面如何实现tuple和list的转换?

答:直接使用tuple和list函数就行了,type()可以判断对象的类型

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

答:
1, 使用set函数,set(list)
2,使用字典函数,

>>>a=[1,2,4,2,4,5,6,5,7,8,9,0]
>>> b={}
>>>b=b.fromkeys(a)
>>>c=list(b.keys())
>>> c

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 in range(len(a)-2,-1,-1):
	if last==a[i]:
		del a[i]
	else:
		last=a[i]
	print(a)

6. Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)

答:

赋值(=):就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。

浅拷贝: 创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}

深拷贝: 创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}

7. 介绍一下except的用法和作用?

答:

try:
<语句>        #运行别的代码
except <名字><语句>        #如果在try部份引发了'name'异常
except <名字><数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。

try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行
如果存在finally语句,最后总是会执行。

8. Python中pass语句的作用是什么?

答:pass语句不会执行任何操作,一般作为占位符或者创建占位程序,whileFalse:pass

9. 介绍一下Python下range()函数的用法?

答:列出一组数据,经常用在for in range()循环中

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

答:可以使用re模块中的sub()函数或者subn()函数来进行查询和替换,

格式:sub(replacement, string[,count=0])

(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)

>>> import re
>>>p=re.compile(‘blue|white|red’)
>>>print(p.sub(‘colour’,'blue socks and red shoes’))
colour socks and colourshoes
>>>print(p.sub(‘colour’,'blue socks and red shoes’,count=1))
colour socks and redshoes

subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量

11. Python里面match()和search()的区别?

答:re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。
re模块中research(pattern,string[,flags]),在string搜索pattern的第一个匹配值。

>>>print(re.match(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.match(‘super’, ‘insuperable’))
None
>>>print(re.search(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.search(‘super’, ‘insuperable’).span())
(2, 7)

12. 用Python匹配HTML tag的时候,<.>和<.?>有什么区别?

答:术语叫贪婪匹配( <.> )和非贪婪匹配(<.?> )

例如:

<div><span>test</span></div>
<.*> :<div><span>test</span></div>
<.*?> :<div>

13. Python里面如何生成随机数?

答:random模块

随机整数:random.randint(a,b):返回随机整数x,a<=x<=b

random.randrange(start,stop,[,step]):返回一个范围在(start,stop,step)之间的随机整数,不包括结束值。

随机实数:random.random( ):返回0到1之间的浮点数

random.uniform(a,b):返回指定范围内的浮点数。

14. 有没有一个工具可以帮助查找python的bug和进行静态的代码分析?

答:

PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告

Pylint是另外一个工具可以进行codingstandard检查

15. 如何在一个function里面设置一个全局的变量?

答:解决方法是在function的开始插入一个global声明:

def f()
global x

16. 单引号,双引号,三引号的区别

答:

单引号和双引号是等效的,如果要换行,需要符号(),三引号则可以直接换行,并且可以包含注释

如果要表示Let’s Go 这个字符串

单引号:s4 = ‘Let\’s go’
双引号:s5 = “Let’s go”
s6 = ‘I realy like“python”!’
这就是单引号和双引号都可以表示字符串的原因了

17. 如何用Python来发送邮件?

可以使用smtplib标准库。

以下代码可以在支持SMTP监听器的服务器上执行。

import sys, smtplib
fromaddr =raw_input(“From:)
toaddrs = raw_input(“To:).split(,)
print “Enter message, end with ^D:”
msg =while 1:
line = sys.stdin.readline()
if not line:
break
msg = msg + line
# 发送邮件部分
server = smtplib.SMTP(‘localhost’)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

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

Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模式:

1.

class Singleton(type):
def __init__(cls, name, bases, dict):
super(Singleton, cls).__init__(name, bases, dict)
cls.instance = None
def __call__(cls, *args,**kw):
if cls.instance is None:
cls.instance = super(Singleton, cls).__call__(*args, **kw)
return cls.instance
class MyClass(object):
__metaclass__ = Singleton
print MyClass()

2. 使用decorator来实现单例模式

def singleton(cls):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance
@singleton
class MyClass:

19. 华为一道编程

有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

  1. 将两序列合并为一个序列,并排序,为序列Source
  2. 拿出最大元素Big,次大的元素Small
  3. 在余下的序列S[:-2]进行平分,得到序列max,min
  4. 将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。

Python代码:

def mean( sorted_list ):
if not sorted_list:
	return (([],[]))
	big = sorted_list[-1]
	small = sorted_list[-2]
	big_list, small_list =mean(sorted_list[:-2])
	big_list.append(small)
	small_list.append(big)
	big_list_sum =sum(big_list)
	small_list_sum =sum(small_list)
	if big_list_sum >small_list_sum:
	return ( (big_list,small_list))
else:
	return (( small_list,big_list))
tests = [  [1,2,3,4,5,6,700,800],
[10001,10000,100,90,50,1],
range(1, 11),
[12312, 12311, 232, 210,30, 29, 3, 2, 1, 1]
]

for l in tests:
l.sort()
print
print “Source List:\t”,l

l1,l2 = mean(l)
print “Result List:\t”,l1, l2
print “Distance:\t”,abs(sum(l1)-sum(l2))
print ‘-*’*40

输出结果
Python代码
Source List:   [1, 2, 3, 4, 5, 6, 700, 800]
Result List:   [1, 4, 5, 800] [2, 3, 6, 700]
Distance:      99
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Source List:   [1, 50, 90, 100, 10000, 10001]
Result List:   [50, 90, 10000] [1, 100, 10001]
Distance:      38
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Source List:   [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Result List:   [2, 3, 6, 7, 10] [1, 4, 5, 8, 9]
Distance:      1
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Source List:   [1, 1, 2, 3, 29, 30, 210, 232, 12311, 12312]
Result List:   [1, 3, 29, 232, 12311] [1, 2, 30, 210, 12312]
Distance:      21

20. python程序中文输出问题怎么解决?

方法一:

用encode和decode

如:

import os.path
import xlrd,sys
Filename=’/home/tom/Desktop/1234.xls’
if not os.path.isfile(Filename):
raise NameError,”%s is not a valid filename”%Filename
bk=xlrd.open_workbook(Filename)
shxrange=range(bk.nsheets)
print shxrange
for x in shxrange:
p=bk.sheets()[x].name.encode(‘utf-8′)
print p.decode(‘utf-8′)

方法二:

在文件开头加上

reload(sys)
sys.setdefaultencoding(‘utf8′)

这2行,再试着运行一下

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码

代码中字符串的默认编码与代码文件本身的编码一致。

如:s=‘中文’

如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。
如果字符串是这样定义:s=u’中文’
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:

isinstance(s,unicode)  #用来判断是否为unicode 

用非unicode编码形式的str来encode会报错
如何获得系统的默认编码?

#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()  

该段程序在英文WindowsXP上输出为:ascii

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

交集

b1=[1,2,3]
b2=[2,3,4]
b3 = [val for val in b1if 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

差集实例
———-

#/bin/env python
# -*- coding:utf-8 -*-
f =open(‘C:\diff_dealer\excel.txt’)
excel = f.readlines()
f.close()
f= open(‘C:\diff_dealer\db.txt’)
db = f.readlines()
diff = [val for val in db if val not in excel]
f.close()
f =open(‘C:\diff_dealer\diff.txt’, ‘w’)
f.writelines(diff)
f.close()
print diff

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

python 编写server的步骤:

1第一步是创建socket对象。调用socket构造函数。如:
socket = socket.socket(family, type )
family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信。
type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。

2.第二步是将socket绑定到指定地址。这是通过socket对象的bind方法来实现的:
socket.bind( address )由AF_INET所创建的套接字,address地址必须是一个双元素元组,格式是(host,port)。host代表主机,port代表端口号。如果端口号正在使用、主机名不正确或端口已被保留,bind方法将引发socket.error异常。

3.第三步是使用socket套接字的listen方法接收连接请求。
socket.listen( backlog )
backlog指定最多允许多少个客户连接到服务器。它的值至少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。

4.第四步是服务器套接字通过socket的accept方法等待客户请求一个连接。
connection, address =socket.accept()
调用accept方法时,socket会时入“waiting”状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组(connection,address)。第一个元素connection是新的socket对象,服务器必须通过它与客户通信;第二个元素address是客户的Internet地址。

  1. 第五步是处理阶段,服务器和客户端通过send和recv方法通信(传输数据)。服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接收信息。调用recv 时,服务器必须指定一个整数,它对应于可通过本次方法调用来接收的最大数据量。recv方法在接收数据时会进入“blocked”状态,最后返回一个字符串,用它表示收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调用recv时,多余的数据会从缓冲区删除(以及自上次调用recv以来,客户可能发送的其它任何数据)。

  2. 传输结束,服务器调用socket的close方法关闭连接。
    python编写client的步骤:

  3. 创建一个socket以连接服务器:socket= socket.socket( family, type )
    2.使用socket的connect方法连接服务器。对于AF_INET家族,连接格式如下:
    socket.connect((host,port) )
    host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。

  4. 处理阶段,客户和服务器将通过send方法和recv方法通信。

  5. 传输结束,客户通过调用socket的close方法关闭连接。

下面给个简单的例子:

server.py

if __name__ =='__main__':
import socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.bind(('localhost',8001))
sock.listen(5)
while True:
connection,address =sock.accept()
try:
connection.settimeout(5)
buf =connection.recv(1024)
if buf == '1':
connection.send('welcometo server!')
else:
connection.send('pleasego out!')
except socket.timeout:
print 'time out'
connection.close()
 
client.py
python 代码
if __name__ =='__main__':
import socket
sock =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost',8001))
import time
time.sleep(2)
sock.send('1')
print sock.recv(1024)
sock.close()

在终端运行server.py,然后运行clien.py,会在终端打印“welcometo server!"。如果更改client.py的sock.

23. Python文件操作的面试题

1. 如何用Python删除一个文件?
使用os.remove(filename)或者os.unlink(filename);

2. Python如何copy一个文件?
shutil模块有一个copyfile函数可以实现文件拷贝

3.Python如何实现单例模式?
Python有两种方式可以实现单例模式,下面两个例子使用了不同的方式实现单例模式:
1.

class Singleton(type):
def __init__(cls, name, bases, dict):
super(Singleton, cls).__init__(name, bases, dict)
cls.instance = None
def __call__(cls, *args, **kw):
if cls.instance is None:
cls.instance = super(Singleton, cls).__call__(*args, **kw)
return cls.instance
class MyClass(object):
__metaclass__ = Singleton
print MyClass()
print MyClass()
  1. 使用decorator来实现单例模式
def singleton(cls):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance
@singleton
class MyClass:


4.什么是lambda函数?
Python允许你定义一种单行的小函数。定义lambda函数的形式如下:labmda参数:表达式lambda函数默认返回表达式的值。你也可以将其赋值给一个变量。lambda函数可以接受任意个参数,包括可选参数,但是表达式只有一个:

>>> g = lambda x, y: x*y
>>> g(3,4)
12
>>> g = lambda x, y=0, z=0: x+y+z
>>> g(1)
1
>>> g(3, 4, 7)
14

也能够直接使用lambda函数,不把它赋值给变量:

>>> (lambda x,y=0,z=0:x+y+z)(3,5,6)
14

如果你的函数非常简单,只有一个表达式,不包含命令,可以考虑lambda函数。否则,你还是定义函数才对,毕竟函数没有这么多限制。

5.Python是如何进行类型转换的?

Python提供了将变量或值从一种类型转换成另一种类型的内置函数。int函数能够将符合数学格式数字型字符串转换成整数。否则,返回错误信息。

>>> int(”34″)
34
>>> int(”1234ab”) #不能转换成整数
ValueError: invalid literal for int(): 1234ab

函数int也能够把浮点数转换成整数,但浮点数的小数部分被截去。

>>> int(34.1234)
34
>>> int(-2.46)
-2

函数°oat将整数和字符串转换成浮点数:

>>> float(”12″)
12.0
>>> float(”1.111111″)
1.111111

函数str将数字转换成字符:

>>> str(98)
‘98′
>>> str(”76.765″)
‘76.765′

整数1和浮点数1.0在python中是不同的。虽然它们的值相等的,但却属于不同的类型。这两个数在计算机的存储形式也是不一样。

6.Python如何定义一个函数

函数的定义形式如下:

def <name>(arg1, arg2,… argN):
<statements>

函数的名字也必须以字母开头,可以包括下划线“ ”,但不能把Python的关键字定义成函数的名字。函数内的语句数量是任意的,每个语句至少有一个空格的缩进,以表示此语句属于这个函数的。缩进结束的地方,函数自然结束。

下面定义了一个两个数相加的函数:

>>> def add(p1, p2):
print p1, “+”, p2, “=”, p1+p2
>>> add(1, 2)
1 + 2 = 3

函数的目的是把一些复杂的操作隐藏,来简化程序的结构,使其容易阅读。函数在调用前,必须先定义。也可以在一个函数内部定义函数,内部函数只有在外部函数调用时才能够被执行。程序调用函数时,转到函数内部执行函数内部的语句,函数执行完毕后,返回到它离开程序的地方,执行程序的下一条语句。

7.Python是如何进行内存管理的?
Python的内存管理是由Python得解释器负责的,开发人员可以从内存管理事务中解放出来,致力于应用程序的开发,这样就使得开发的程序错误更少,程序更健壮,开发周期更短

**8.如何反序的迭代一个序列?**howdo I iterate over a sequence in reverse order

如果是一个list, 最快的解决方案是:

list.reverse()
try:
for x in list:
“do something with x”
finally:
list.reverse()

如果不是list, 最通用但是稍慢的解决方案是:

for i in range(len(sequence)-1, -1, -1):
x = sequence[i]
<do something with x>

9.Python里面如何实现tuple和list的转换?

函数tuple(seq)可以把所有可迭代的(iterable)序列转换成一个tuple, 元素不变,排序也不变。

例如,tuple([1,2,3])返回(1,2,3),tuple(’abc’)返回(’a’.’b’,’c’).如果参数已经是一个tuple的话,函数不做任何拷贝而直接返回原来的对象,所以在不确定对象是不是tuple的时候来调用tuple()函数也不是很耗费的。

函数list(seq)可以把所有的序列和可迭代的对象转换成一个list,元素不变,排序也不变。

例如 list([1,2,3])返回(1,2,3),list(’abc’)返回[‘a’, ‘b’, ‘c’]。如果参数是一个list,她会像set[:]一样做一个拷贝

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

可以先把list重新排序,然后从list的最后开始扫描,代码如下:

if List:
List.sort()
last = List[-1]
for i in range(len(List)-2, -1, -1):
if last==List[i]: del List[i]
else: last=List[i]

11.Python文件操作的面试题

  1. 如何用Python删除一个文件?
    使用os.remove(filename)或者os.unlink(filename);

  2. Python如何copy一个文件?
    shutil模块有一个copyfile函数可以实现文件拷贝

12.Python里面如何生成随机数?

标准库random实现了一个随机数生成器,实例代码如下:

import random
random.random()

它会返回一个随机的0和1之间的浮点数

13.如何用Python来发送邮件?

可以使用smtplib标准库。
以下代码可以在支持SMTP监听器的服务器上执行。

import sys, smtplib
fromaddr = raw_input(”From: “)
toaddrs = raw_input(”To: “).split(’,')
print “Enter message, end with ^D:”
msg = ”
while 1:
line = sys.stdin.readline()
if not line:
break
msg = msg + line
# 发送邮件部分
server = smtplib.SMTP(’localhost’)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

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

一般来说可以使用copy.copy()方法或者copy.deepcopy()方法,几乎所有的对象都可以被拷贝

一些对象可以更容易的拷贝,Dictionaries有一个copy方法:

newdict = olddict.copy()

15.有没有一个工具可以帮助查找python的bug和进行静态的代码分析?

有,PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
Pylint是另外一个工具可以进行coding standard检查。

16.如何在一个function里面设置一个全局的变量?

解决方法是在function的开始插入一个global声明:

def f()
global x

17.有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。

  1. 将两序列合并为一个序列,并排序,为序列Source
  2. 拿出最大元素Big,次大的元素Small
  3. 在余下的序列S[:-2]进行平分,得到序列max,min
  4. 将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min。

Python代码

def mean( sorted_list ):
if not sorted_list:
return (([],[]))
big = sorted_list[-1]
small = sorted_list[-2]
big_list, small_list = mean(sorted_list[:-2])
big_list.append(small)
small_list.append(big)
big_list_sum = sum(big_list)
small_list_sum = sum(small_list)
if big_list_sum > small_list_sum:
return ( (big_list, small_list))
else:
return (( small_list, big_list))
tests = [   [1,2,3,4,5,6,700,800],
[10001,10000,100,90,50,1],
range(1, 11),
[12312, 12311, 232, 210, 30, 29, 3, 2, 1, 1]
]
for l in tests:
l.sort()
print
print “Source List:\t”, l
l1,l2 = mean(l)
print “Result List:\t”, l1, l2
print “Distance:\t”, abs(sum(l1)-sum(l2))
print ‘-*’*40
输出结果
Python代码
Source List:    [1, 2, 3, 4, 5, 6, 700, 800]
Result List:    [1, 4, 5, 800] [2, 3, 6, 700]
Distance:       99
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Source List:    [1, 50, 90, 100, 10000, 10001]
Result List:    [50, 90, 10000] [1, 100, 10001]
Distance:       38
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Source List:    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Result List:    [2, 3, 6, 7, 10] [1, 4, 5, 8, 9]
Distance:       1
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Source List:    [1, 1, 2, 3, 29, 30, 210, 232, 12311, 12312]
Result List:    [1, 3, 29, 232, 12311] [1, 2, 30, 210, 12312]
Distance:       21
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

17.用Python匹配HTML tag的时候,<.>和<.?>有什么区别?
当重复匹配一个正则表达式时候, 例如<.*>, 当程序执行匹配的时候,会返回最大的匹配值
例如:

import re
s = ‘<html><head><title>Title</title>’
print(re.match(’<.*>’, s).group())

会返回一个匹配

Title而不是
import re
s = ‘<html><head><title>Title</title>’
print(re.match(’<.*?>’, s).group())

则会返回
<.>这种匹配称作贪心匹配 <.?>称作非贪心匹配

18.Python里面search()和match()的区别?

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

例如:
print(re.match(’super’, ’superstition’).span())会返回(0,5)

而print(re.match(’super’, ‘insuperable’))则返回None

search()会扫描整个字符串并返回第一个成功的匹配

例如:print(re.search(’super’, ’superstition’).span())返回(0, 5)

print(re.search(’super’, ‘insuperable’).span())返回(2,7)

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

可以使用sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, string[, count=0])

replacement是被替换成的文本

string是需要被替换的文本

count是一个可选参数,指最大被替换的数量

例子:

import re
p = re.compile(’(blue|white|red)’)
print(p.sub(’colour’,'blue socks and red shoes’))
print(p.sub(’colour’,'blue socks and red shoes’, count=1))
输出:
colour socks and colour shoes
colour socks and red shoes

subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量

例如:

i

mport re
p = re.compile(’(blue|white|red)’)
print(p.subn(’colour’,'blue socks and red shoes’))
print(p.subn(’colour’,'blue socks and red shoes’, count=1))
输出
(’colour socks and colour shoes’, 2)
(’colour socks and red shoes’, 1)

20.介绍一下except的用法和作用?
Python的except用来捕获所有异常, 因为Python里面的每次错误都会抛出 一个异常,所以每个程序的错误都被当作一个运行时错误。
一下是使用except的一个例子:

try:
foo = opne(”file”) #open被错写为opne
except:
sys.exit(”could not open file!”)

因为这个错误是由于open被拼写成opne而造成的,然后被except捕获,所以debug程序的时候很容易不知道出了什么问题

下面这个例子更好点:

try:
foo = opne(”file”) # 这时候except只捕获IOError
except IOError:
sys.exit(”could not open file”)

21.Python中pass语句的作用是什么?
pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作,比如:

while False:
pass

pass通常用来创建一个最简单的类:

class MyEmptyClass:
pass

pass在软件设计阶段也经常用来作为TODO,提醒实现相应的实现,比如:

def initlog(*args):
pass #please implement this

22.介绍一下Python下range()函数的用法?

如果需要迭代一个数字序列的话,可以使用range()函数,range()函数可以生成等差级数。
如例:

for i in range(5)
print(i)

这段代码将输出0, 1, 2, 3, 4五个数字
range(10)会产生10个值, 也可以让range()从另外一个数字开始,或者定义一个不同的增量,甚至是负数增量
range(5, 10)从5到9的五个数字
range(0, 10, 3) 增量为三, 包括0,3,6,9四个数字
range(-10, -100, -30) 增量为-30, 包括-10, -40, -70
可以一起使用range()和len()来迭代一个索引序列
例如:
a = [‘Nina’, ‘Jim’, ‘Rainman’, ‘Hello’]
for i in range(len(a)):
print(i, a[i])

24、六个标准数据类型

不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

数字: Python3 支持 int、float、bool、complex(复数)

25、迭代器和生成器

迭代是Python最强大的功能之一,是访问集合元素的一种方式。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next()。

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

什么情况下需要使用 yield?

一个函数 f,f 返回一个 list,这个 list 是动态计算出来的(不管是数学上的计算还是逻辑上的读取格式化),并且这个 list 会很大(无论是固定很大还是随着输入参数的增大而增大),这个时候,我们希望每次调用这个函数并使用迭代器进行循环的时候一个一个的得到每个 list 元素而不是直接得到一个完整的 list 来节省内存,这个时候 yield 就很有用。

# 简单输出斐波那契數列前 N 个数

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        print b 
        a, b = b, a + b 
        n = n + 1
fab(5)

输出:

1 
1 
2 
3 
5

结果没有问题,但有经验的开发者会指出,直接在 fab 函数中用 print 打印数字会导致该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列。

要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。以下是 fab 函数改写后的第二个版本:

# 输出斐波那契數列前 N 个数第二版

def fab(max): 
    n, a, b = 0, 0, 1 
    L = [] 
    while n < max: 
        L.append(b) 
        a, b = b, a + b 
        n = n + 1 
    return L
 
for n in fab(5): 
    print n

输出:

1 
1 
2 
3 
5

改写后的 fab 函数通过返回 List 能满足复用性的要求,但是更有经验的开发者会指出,该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List

使用yield:

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b      # 使用 yield
        # print b 
        a, b = b, a + b 
        n = n + 1
 
for n in fab(5): 
    print n

仅仅把 print b 改为了 yield b,就在保持简洁性的同时获得了 iterable 的效果。

一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

yield 的好处是显而易见的,把一个函数改写为一个 generator 就获得了迭代能力,比起用类的实例保存状态来计算下一个 next() 的值,不仅代码简洁,而且执行流程异常清晰。

26、_ name _属性

每个模块都有一个_ name 属性,当其值是’ _ _ main _'时,表明该模块自身在运行,否则是被引入。

说明:_ name _ 与 _ main _ 底下是双下划线, _ _ 是这样去掉中间的那个空格。

if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')

27、dir()

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python面试题 的相关文章

  • Windows terminal安装和配置

    Windows terminal终端比cmd强大许多 其中可以包含cmd和powershell甚至ubuntu子系统 同时还可以进行个性化 打造更精美的终端 安装 进入Windows自带的Microsoft Store 搜索Windows
  • 浏览器打开windows桌面应用

    场景需要在浏览器打开桌面安装的lis应用 这里用到注册表 注意 后面的 路径 两个斜杠 lis可以替换成其他需要打开的应用 lis reg 如下 保存双击执行下 Windows Registry Editor Version 5 00 HK
  • Android 集成 支付宝

    一 到支付宝官网https b alipay com order techService htm channel psl下载 快捷支付 无线 开发包 将alipay sdk common文件夹下的alipaysdk jar alipayse
  • 基本排序算法

    前言 该算法总结针对的是算法设计与分析课程所提到的算法 对于不同的人群可能获益有所不同 在叙述时会对一些较为简单的算法进行概性描述 目的是简单的告诉读者算法实现的基本原理 对一些较为复杂的算法则会付诸大量的笔墨 以求对算法的理解能够更加的透
  • 「转」plt.legend()简明使用教程

    原文链接https blog csdn net helunqu2017 article details 78641290 感谢作者辛勤付出 仅作笔记使用 侵删 1 图例legend基础语法及用法 legend语法参数如下 matplotli
  • 用一个程序员的角度来遐想第五代或第六代计算机

    提前申明 我对这一行了解的不够深入 或许是因为这才所以初生牛犊不怕虎 以至于对计算机有很多构想 我先来说一下当今计算机的发展历程 第一代 1946 1957年 是电子计算机 它的基本电子元件是电子管 内存储器采用水银延迟线 外存储器主要采用
  • TensorFlow2.1.0安装教程

    TensorFlow2 1 0安装教程 安装步骤 常用IDE安装 CUDA安装 CUDA软件安装 cuDNN神经网络加速库安装 配置环境变量 TensorFlow安装 更新 TensorFlow是一款优秀的深度学习框架 支持多种常见的操作系
  • 从0到1搭建 Rollup + TypeScript 模板工程

    哈喽 大家好 我是 SuperYing 今天我们来聊聊如何从 0 到 1 搭建一个 Rollup TypeScript 工具库模板工程 包括从创建文件夹开始 到依赖配置 打包编译等一整套内容 Rollup 是一个 JavaScript 模块
  • CWE-125: Out-of-bounds Read(越界读取)

    ID 125 类型 基础 结构 简单 状态 草稿 描述 软件读取缓冲区之前或者之后的数据 扩展描述 通常 这会允许攻击者从其它内存位置读取敏感信息或导致崩溃 假定存在用于停止读取操作 如字符串中的nul 的哨兵变量时 当代码读取可变数量的数
  • 哨兵架构&redisCluster-Redis(五)

    上篇文章介绍了主从架构以及lua脚本 主从架构 lua脚本 Redis 四 https blog csdn net ke1ying article details 131159229 Sentinel集群 主从的搭建我们已经完成 但如果主节
  • 优化命令之top——实时显示进程动态/查看进程信息

    目录 一 top简介 二 启动TOP 2 1第一行含义 2 2第二行含义 2 3第三行含义 2 4第四行含义 2 5第五行含义 2 6第六行含义 三 top常用按键 3 1按 Z 键更改输出的颜色 我发现这让输出更容易被眼睛看到 3 2 按
  • ctypes.ArgumentError: argument 2: type 'exceptions.TypeError': Don't know how to convert parameter

    错误描述 我在用python的ctypes库调用c 的 so文件时候 出现了下面的错误 ctypes ArgumentError argument 2
  • Java权限修饰符

    权限修饰符可以用来修饰属性和方法的访问范围 本类 同包 子类 其他 private 默认 protected public 默认 是什么修饰符都不加
  • 【mcuclub】数码管

    一 实物图 二 原理图 1 数码管介绍 1 1 作用 数码管是显示器件 用来显示数字 1 2 分类 单个 1位 联排 2位 4位 8位 1 3 工作原理 1 亮灭原理 其实就是内部的照明LED 2 显示数字 甚至文字 原理 利用内部的LED
  • Qt中的QString与int、const char 、ASCII码互相转换

    1 QString 转 int bool ok QString str1 0xf8 int value1 str1 toInt ok 16 qDebug lt lt ok lt lt lt lt value1 true 248 QStrin
  • 中级课程——CSRF

    文章目录 案例 原理 挖掘 案例 原理 挖掘 挖掘详情 首先就是对目标敏感部位进行抓包分析 比如修改信息 转账 添加信息等等 通常一个数据包HTTP请求头里边都会有一个Referer 这个需要特别去验证 比如放到Burpsuit Repea
  • ARM常用汇编指令汇总

    ARM常用汇编指令汇总 text表示代码段 data初始化的数据段 bss未初始化的数据段 rodata只读数据段 global表示全局变量 CPSR寄存器数据访问 指令 目的 源 描述 MRS R0 CPSR 将CPSR的数据放到R0中

随机推荐

  • viper12a电路图_viper12a电磁炉电路图

    电磁炉又称为电磁灶 1957年第一台家用电磁炉诞生于德国 1972年 美国开始生产电磁炉 20世纪80年代初电磁炉在欧美及日本开始热销 电磁炉的原理是电磁感应现象 即利用交变电流通过线圈产生方向不断改变的交变磁场 处于交变磁场中的导体的内部
  • Docker 导出/导入镜像

    如果服务器网络不好或者pull不下来镜像 只能在其它网络比较好的机器上pull下来镜像 导出成一个文件 再下载上传到网络不好的机器上 然后再从文件中导出来 这样在网络不好的机器上也能使用docker镜像了 首先使用 docker image
  • python画笑脸图案-怎么用python实现画笑脸

    在Python中画笑脸可以使用turtle库实现 1 打开idel 通过idel新建一个py文件 在空白的文件中输入下面的代码按F5运行此文件就可以画笑脸了 from turtle import screensize 600 600 spe
  • 【Spark NLP】第 19 章:生产化 NLP 应用程序

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 计算机网络为什么要分层,从形而上到形而下视角的理解

    文章开始我想先亮明一下我个人的立场 个人关于世界的思考立场是偏唯心的 文章的标题其实也表明了我对于计算机网络的理解立场是从形而上出发的 计算机网络是计算机专业的同学的必修课 但很多同学学习的过程中都会觉得东西很多很杂 开始学还比较有动力 但
  • 2000系统如何查看某端口对应服务_ubuntu 默认防火墙安装、启用、查看状态

    ubuntu 9 10默认的是UFW防火墙 已经支持界面操作了 在命令行运行ufw命令就可以看到提示的一系列可进行的操作 最简单的一个操作 sudo ufw status可检查防火墙的状态 我的返回的是 不活动 sudo ufw versi
  • VS2008 常用快捷键

    VS2008常用快捷键 1 怎样调整代码排版的格式 选择 编辑 gt 高级 gt 设置文档的格式 或 编辑 gt 高级 gt 设置选中代码的格式 格式化cs代码 自动对齐 Ctrl k f 格式化aspx代码 Ctrl k d 2 怎样跳转
  • 除雾霾去朦胧增强色彩对比清晰画面调色插件 ClearPlus v2.1 Win/Mac AE/PR插件中文汉化版安装与使用

    插件介绍 ClearPlus是一款功能强大的AE超级色彩去雾插件 旨在增强包括模糊 水下和弱光视频在内的素材 它也是增强天空的理想选择 轻松灵活地使颜色变得时尚 阴影 高光使您可以在保持自然外观的同时调整图像的不同部分 阴影滑块和除雾滑块可
  • 成功解决:ModuleNotFoundError: No module named ‘amp_C‘

    在使用transformers时 在调用Trainer的时候遇到了这个问题 原因是apex包有问题 这里有解决apex安装包的多一些教程 https blog csdn net Xidian185 article details 12274
  • react讲解(组件,生命周期以及受控组件)

    文章目录 前言 一 组件的通信原理 state 和 setState 二 组件分类 1 类组件 2 组件中父子组件的通信 代码示例 A组件代码 B组件代码 2 跨组件通信 A组件代码如下 C组件代码如下 三 组件的生命周期
  • Elasticsearch内存那些事儿

    Elasticsearch 内存分配设置详解 前言 该给 ES 分配多少内存 为什么是给 ES 分配服务器的一半内存 为什么内存使用率不断升高 没有释放 为何经常有某个 field 的数据量超出内存限制的异常 为何感觉上没多少数据 也会经常
  • TCP协议 ---可靠传输的各种机制

    目录 一 可靠 确认应答机制 保证数据可靠 有序的到达对端 超时重传机制 二 效率 2 1 提高自身发送数据量 滑动窗口机制 滑动窗口的发送缓冲区是环形队列 滑动窗口的大小会变化吗 滑动窗口的nb之处 滑动窗口丢包问题 2 2 对方的接受能
  • twrp3.3.0刷n9002_【笔刷】iPad Procreate5.0新笔刷分享,巨好用!

    01 Procreate 趣味复古蜡笔纹理笔刷15款 适用软件 Procreate5 0以上 适用系统 ipad系统 笔刷格式 brushset 素材大小 93MB 笔刷视频演示 赠送15款笔刷 29款色卡 一张纸张背景 02 Procre
  • 树莓派Pico

    9 2 在MS Windows上构建 在Microsoft Windows 10或Windows 11上安装工具链与其他平台有些不同 然而安装后 RP2040的构建代码基本类似 Tips 什么是工具链 工具链是指一系列软件 逐个使用这一系列
  • docker run中-v参数的用法解释

    作用 挂载宿主机的一个目录 如 docker run it v 宿主机目录 容器目录 镜像名 bin bash 这里 it是参数作用是 i 以交互模式运行容器 通常与 t 同时使用 t 为容器重新分配一个伪输入终端 通常与 i 同时使用 就
  • keil编译时候产生的错误(Error: L6200E: Symbol....)解决方法

    今天分享一个自己在做实验时候发现的一个错误问题 查了一下网上也有人遇到这样的问题 就拿出来分享了一下自己遇到的情况 首先看keil的错误提示 如图所示 可以看到两个报错为 Error L6200E Symbol usart3 init mu
  • CV Code

    点击我爱计算机视觉标星 更快获取CVML新技术 计算机视觉技术发展迅速 很多时候 可悲的不是我们没有努力 而是没有跟上时代的步伐 努力coding终于出来结果了 却发现早就有人开源了 效果还比自己写的好 CV君汇总了最近过去的一周新出的开源
  • 【Matlab】将Matlab里的几个变量一个存成csv文件

    注意 几个变量类型可以不同 但是长度必须相同 举例说明 1 比如说在workspace里已经有两个变量 a和b如图 每个变量为1列 想把这两个变量存成一个csv文件 2 先给这两个变量名起个名字 分别为A B 存入 datacolumns
  • 数据属性类型

    数据集由数据对象组成 一个数据对象代表一个实体 数据对象又称样本 实例 数据点或对象 属性 attribute 是一个数据字段 表示数据对象的一个特征 属性向量 或特征向量 是用来描述一个给定对象的一组属性 属性有不同类型 标称属性 nom
  • python面试题

    文章目录 Python面试基础题小汇总 1 Python是如何进行内存管理的 2 什么是lambda函数 它有什么好处 3 Python里面如何实现tuple和list的转换 4 请写出一段Python代码实现删除一个list里面的重复元素