python常见面试题目

Contents

1列表、元组、字典、集合的区别... 2

2sys.path与os.path的区别... 2

3copy模块的函数浅拷贝copy与深拷贝deepcopy区别?与赋值之间的区别?... 2

4python单例模式... 3

5os模块与sys模块有哪些常用函数... 3

6、lambda是什么... 3

7、re模块的match()与search()函数的区别... 3

8、python中range与xrange的区别... 4

9、如何查看模块的属性和方法... 4

10、is和==之间的区别?... 4

11、装饰器是什么?... 4

12、如何知道一个python对象的类型?... 5

13、如何用python来替换一个文本字符串?... 5

14、正则表达式的贪婪匹配和非贪婪匹配是什么?区别是什么?... 5

15、python里面如何生成随机数?... 5

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

17、python如何copy一个文件?... 6

18、介绍一下try/except的用法和作用?... 6

19、分别说说cmp(),map(),filter()的作用?... 6

20、请阐述__new__和__init__的区别?... 7

21描述yield作用... 7

22、python代码得到列表list的交集与差集... 7

23、请写一段python代码,匹配ip地址的正则表达式... 8

24、linux相关知识... 8

24.1 linux系统日志以及分析... 8

24.2 常用的linux命令... 8

25算法题... 10









1 列表、元组、字典、集合的区别

列表:列表元素是有序的;元素可以重复,元素类型可不相同;可以添加、删除元素。python里的列表用[]表示。

元组:元组是有序的;元组是只读的,不能修改。元组用()表示。

字典:字典中的键值对是无序的;键值必须是唯一的;可以添加、删除元素。python里的字典表示方式为{"spam" :

"foo", "parrot" : 42}。

集合:集合是无序的;集合中的元素不能重复。

2 sys.path与os.path的区别

os.path模块主要用于获取文件属性。例如os.path.abspath(path)返回绝对路径。os.path.basename(path)返回文件名。os.path.dirname(path)返回文件路径名。os.path.join(path1[, path2[, ...]])把目录和文件名合成一个路径。

sys.path是一个目录列表。在python启动时,sys.path根据内建规则、PYTHONPATH变量进行初始化,供python从中查找第三方扩展模块。有时候为了让python能够找到我们自己定义的模块,在脚本中需要修改sys.path的内容。使用sys.path.append(path)添加相关的路径,但在退出python环境后自己添加的路径就会自动消失。

3 copy模块的函数浅拷贝copy与深拷贝deepcopy区别?与赋值之间的区别?

例1 (浅拷贝与深拷贝):

origin = [1, 2, [3,4]]

cop1 = copy.copy(origin)

cop2 =copy.deepcopy(origin)

origin.append(6)

origin[2].append(5)

print(origin)

print(cop1)

print(cop2)

结果:

[1, 2, [3, 4, 5], 6]

[1, 2, [3, 4, 5]]

[1, 2, [3, 4]]


例2 (赋值):

a = [3,5,7]

b = a

b.append(9)

print(a)

print(b)

结果:

[3, 5, 7, 9]

[3, 5, 7, 9]

(1)python中容器对象的赋值就是创建了对象的一个新的引用,修改其中任意一个对象都会影响到另一个。两者的内存地址相同,即id相同。

(2)使用copy.copy(),可以进行对象的浅拷贝,它复制了容器对象,但对于对象中的元素,依然使用原始的引用。

(3)如果需要复制一个容器对象,以及它里面的所有元素(包含元素的子元素),可以使用copy.deepcopy()进行深拷贝。

(4)对于非容器类型(如数字、字符串、和其他’原子’类型的对象),没有被拷贝一说。

见链接:http://python.jobbole.com/82294/

4 python单例模式

单例模式是指创建唯一对象,单例模式设计的类只能实例。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

5 os模块与sys模块有哪些常用函数

os.system(‘command’)    执行shell命令或者dos命令。

os.getcwd()   得到当前工作目录,即python脚本当前工作的目录路径。

os.listdir()   返回指定目录下的所有文件和目录名

os.remove(‘file_name’)    删除一个文件file_name

os.makedirs(‘/home/a/b’)    创建多级目录

os.mkdir(‘/home/a)    创建单个目录

在解释器启动后, argv列表包含了传递给脚本的所有参数, sys.argv[0]为脚本自身的名称,sys.argv[1]为第一个入参,sys.argv[2] 为第二个入参。。。

sys.path   是一个目录列表。

sys.exit(n)    中途退出程序,当n为非0时,会引发一个SystemExit异常,从而可以在主程序中捕获该异常。正常退出时sys.exit(0)。

6 lambda是什么

g = lambda x:x+1

g(1)

>>>2

用函数来表示为:

def g(x):

     return x+1

lambda 定义了一个匿名函数,lambda 并不会带来程序运行效率的提高,只会使代码更简洁。

7 re模块的match()与search()函数的区别

match():从字符串的开头开始对模式进行匹配。如果匹配成功,就返回一个匹配对象,如果匹配失败,就返回None。

search():在字符串从左到右开始对模式进行匹配,找到第一个匹配然后返回匹配对象,如果字符串没有匹配,则返回None。

8、python中range与xrange的区别

range会直接生成一个列表对象。

xrange则不会直接生成一个列表,而是一个生成器。

要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。

所以,xrange做循环的性能比range好,尤其是返回很大的时候。尽量用xrange吧,除非你是要返回一个列表。

:因为python3 中取消了range函数,而把xrange函数重命名为range,所以现在直接用range函数即可。如果python3 中想要通过range函数要获取列表,使用list(range(10))。

9、如何查看模块的属性和方法

使用内置函数dir()

例如:

import sys

print(dir(sys))

结果:

['__displayhook__', '__doc__', '__excepthook__', '__interactivehook__','__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__','__stdout__', '_clear_type_cache', '_current_frames', '_debugmallocstats','_getframe', '_home', '_mercurial', '_xoptions', 'api_version', 'argv','base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder','call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle','dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable','exit', 'flags', 'float_info', 'float_repr_style', 'getallocatedblocks','getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding','getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval','gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation','int_info', 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path','path_hooks', 'path_importer_cache', 'platform', 'prefix', 'setcheckinterval','setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr','stdin', 'stdout', 'thread_info', 'version', 'version_info', 'warnoptions','winver']

10、is和==之间的区别?

is比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。比较的是两个对象的id值是否相等。

==比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。

通常,我们关注的是值,而不是内存地址,因此 python 代码中==出现的频率比is高。最常使用is的地方是判断对象是不是None。如a is None或者a is not None

11、装饰器是什么?

python装饰器是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。

多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。

应用场景:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存。

12、如何知道一个python对象的类型?

使用type()

13、如何用python来替换一个文本字符串?用re模块re.sub(pattern, repl, string, count) 替换字符串中每一个匹配的子串后,返回替换后的字符串。将string中匹配pattern的部分用repl替换掉。其中,count为替换个数。count默认为0,表示每个匹配项都替换。

14、正则表达式的贪婪匹配和非贪婪匹配是什么?区别是什么?

贪婪匹配正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。

非贪婪匹配匹配到结果就好,就少的匹配字符。

属于贪婪模式的量词,也叫做匹配优先量词,包括:{m,n}、{m,}、?、*和+。

在匹配优先量词后面加上?,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括:{m,n}?、{m,}?、??、*?和+?。

从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式;被忽略优先量词修饰的子表达式使用的就是非贪婪模式。

例:

源字符串:aa

test1
bb
test2
cc

正则表达式一:

.*

匹配结果一:

test1
bb
test2

正则表达式二:

.*?

匹配结果二:

test1

正则表达式一采用的是贪婪模式,在匹配到第一个“

”时已经可以使整个表达式匹配成功,但是由于采用的是贪婪模式,所以仍然要向右尝试匹配,查看是否还有更长的可以成功匹配的子串,匹配到第二个“
”后,向右再没有可以成功匹配的子串,匹配结束,匹配结果为“
test1
bb
test2
”。

正则表达式二采用的是非贪婪模式,在匹配到第一个“

”时使整个表达式匹配成功,由于采用的是非贪婪模式,所以结束匹配,不再向右尝试,匹配结果为“
test1
”。

15、python里面如何生成随机数?

使用random模块,例如:

random.random() 返回一个介于左闭右开[0.0, 1.0)区间的随机浮点数。

random.randint(1,100)   返回1-100以内的随机整数。

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

使用global关键字

17、python如何copy一个文件?

shutil模块有一个copyfile函数可以实现文件拷贝。例:

shutil.copyfile('myapp.log','2.log'),不用打开文件来进行拷贝。

18、介绍一下try/except的用法和作用?

当python脚本发生异常时,程序会终止执行。为了捕捉并处理异常,可以使用try/except语句,使得python程序继续执行下去。try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。

例:

a = 3

b = 0

try:

    c = a/b

   print('000')

except Exception as e:

   print('111')

    print(e)

finally:

print('222')

结果:

111

division by zero

222

当try中的某一语句出现异常时,不再继续执行后面的语句。被except捕获异常(Exception表示所有异常类型)后,进而处理异常。当然,无论是否出现异常,都会执行finally中的语句。

19、分别说说cmp(),map(),filter()的作用?

cmp: 比较数值大小。 (注:python 3.4.3的版本中已经没有cmp函数,被operator模块代替)

cmp(a,b)    #当 ab 返回1; 当a=b返回0

map:映射

map(function, iterable) # 将function作用于iterable,每个元素,将对应输出结果保存为一个list。python3.x 返回的是迭代器对象。

例:

a = [1,2,3]

def plus_one(x):

    returnx+1

b = map(plus_one,a)

print(list(b))

结果:

[2, 3, 4]

filter:过滤器。filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

filter()接收两个参数,第一个为判断函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回True或False,最后将返回 True 的元素放到新列表中。pyhton2.7 返回列表,python3.x返回迭代器对象。

例:

a = [1,2,3,4,5]

def bigger_than_three(x):

    return(x>3)

b = filter(bigger_than_three,a)

print(list(b))

结果:

[4, 5]

20、请阐述__new__和__init__的区别?

__new__:创建对象时调用,会返回当前对象的一个实例

__init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值

调用顺序:先调用__new__生成一个实例再调用__init__方法对实例进行初始化,比如添加属性。

21 描述yield作用

保存当前运行状态(断点),然后暂停执行,即将函数挂起

将yeild关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用,当使用next()、send()函数让函数从断点处继续执行,即唤醒函数。

22、python代码得到列表list的交集与差集

交集例子如下:

a = [1,2,3]

b = [2,3,4]

c = [val for val in a if val in b]

print(c)


差集a-b例子如下:

a = [1,2,3]

b = [2,3,4]

c = [val for val in a if val not in b]

print(c)

23、请写一段python代码,匹配ip地址的正则表达式

ipadd = "1.168.1.255"

if re.match(r'^(([01]{0,1}\d{0,1}\d |2[0-4]\d|25[0-5])\.){3}([01]{0,1}\d{0,1}\d|2[0-4]\d|25[0-5])$',ipadd):

    print("IP vaild")

else:

print("IP invaild")

我们知道ip段的单个值的范围是0-255,该表达式匹配时把它分为3部分来匹配,即0-199,200-249,250-255,并用 | 来表示这三个数段中的任意一段为真即为真(成功匹配)。

第一个|  前的 [01]{0,1}\d{0,1}\d , 用来匹配0-199;

第二个|  前的 2[0-4]\d ,则用来匹配200-249这个范围的数值;

后面的  25[0-5]  ,用来匹配250-255的数值。

24、linux相关知识

24.1 linux系统日志以及分析

大部分linux发行版默认的日志守护进程为syslog,位于/etc/syslog 或/etc/syslogd 或/etc/rsyslog.d,默认配置文件为/etc/syslog.conf 或rsyslog.conf,任何希望生成日志的程序都可以向syslog发送信息。syslog可以根据日志的类别和优先级将日志保存到不同的文件中。默认配置下,日志文件通常都保存在/var/log/目录下。

常用日志文件有:

/var/log/messages:记录linux操作系统常见的系统和服务错误信息。

/var/log/syslog:只记录警告信息,常常是系统出问题的信息。使用lastlog命令查看。

24.2 常用的linux命令

(1) ls 显示文件名和目录

ls –a 除了显示一般文件名外连隐藏文件也会显示出来。

ls –l  (这个参数是字母L的小写而不是数字1) 使用长格式显示文件内容。

ls –F 在列出的文件目录名称后加一符号。例如可执行文件加 "*", 目录则加 "/"。

ls -alt 按修改时间排序

(2) cd 进出目录。

(3) mkdir 建立新的目录。

rmdir 删除已建立的目录。

(4) cp 复制文件或目录

用法:cp –r 源文件 目的文件        其中,参数r是指连同源文件中的子目录一同拷贝。

scp 不同的Linux主机之间拷贝文件命令

  从本地复制到远端主机(复制目录加参数-r即可)如下所示:

scp -r /home/WRNCV4.13.10.15P01B003

[email protected]:/home/wanglei。

  从远端主机复制到本地如下所示:

scp -r [email protected]:/home/WRNCV4.13.10.15P01B003/home/wanglei

(5) rm 用来删除文件的。rm命令常用的参数有三个-i, -r, -f

例:

rm –i test 系统会询问我们是否要删除test文件敲了y/n确认是否要删除test文件。

rm –r 目录名: 这个操作可以连同这个目录下面的子目录都删除。

rm –f 文件名: 这个操作可以不经确认强制删除文件

(6) pwd 显示用户当前的工作路径。

(7) mv 移动目录或文件,引申的功能是给目录或文件重命名。

(8) cat 查看文件内容,创建文件。

(9) more 显示文件内容,每次显示一屏,满屏后停下来。

(10) find 命令用于查找文件系统中的指定文件。

find test-name*tcl        ---在目录test下查找以为tcl后缀的文件名

find.-iname"scPig.sh"     ---在当前目录下查找文件scPig.sh,查找过程中忽略大小写。

(11) su 让一个普通用户拥有超级用户或其他用户的权限。

(12) chmod 用于改变文件或目录的访问权限。

我们多数用三位八进制数字的形式来表示权限,第一位指定属主的权限,第二位指定组权限,第三位指定其他用户的权限,每位通过4(读)、2(写)、1(执行)三种数值的和来确定权限。如6(4+2)代表有读写权限,7(4+2+1)有读、写和执行的权限。

(13) ps 进程查看命令,它提供的查看结果并不是动态连续的。

(14) top命令和pgs.命令的基本作用是相同的,显示系统当前的进程和其他状况。

但是top是一个动态显示过程,即可以通过用户按交互来不断刷新当前状态。

(15) df 命令可以显示目前磁盘剩余的磁盘空间,常用的参数为-k,如df –k

(16) grep 使用正则表达式搜索文本,并把匹配的行打印出来。

 例:在某目录下的所有文件中是否含有某个字符串"/usr/local/bin"行的文件

   grep -R "/usr/local/bin" *

注:

-r 递归查找

-n 显示行号

-R 查找所有文件包含子目录

-i 忽略大小写

例:

grep "text" -n file_name       ---在file_name文件中查找字符串所在的行,并把行的内容和行数也打印出来。

(17) netstat 命令的功能是显示网络连接路由表和网络接口信息,可以让用户得知

目前都有哪些网络连接正在运行。

列出所有端口:netstat –a

列出所有的tcp端口:netstat -at

列出所有的udp端口:netstat –au

找出运行在指定端口的进程:netstat -an | grep ‘:80’

netstat的常用参数说明如下:

-a 显示所有socket包括正在监听的

-c 每隔1秒就重新显示一遍直到用户中断它

-i 显示所有网络接口的信息格式同ifconfig –e

-n 以网络IP地址代替名称显示出网络连接情形

-r 显示核心路由表格式同route –e

-t 显示tcp协议的连接情况

-u 显示udp协议的连接情况

-v 显示正在进行的工作

25 算法题

(1)平衡点问题 平衡点:比如int[]

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

使用sum函数累加所有的数。使用一个变量front来累加序列的前部。

代码如下:

numbers= [1,3,5,7,8,25,4,20]


#findtotal

total=sum(numbers)


#findnumber

front =0

fornumber in numbers:

    if front < (total-number)/2 :

        front += number

    else:

        break


#printanswer

if front== (total-number)/2 :

    print(number)

else:

print('not found')

(2)支配数问题

数组中某个元素出现的次数大于数组总数的一半时就成为支配数,其所在位序成为支配点;比如a = [3,3,1,2,3];3为支配数,0,1,4分别为支配点;要求:返回任何一个支配点。

a =[3,3,1,2,3]


defcontrol():

    end_flag = 0

    mid = len(a)/2

    for index in range(len(a)):

        count = 0

        i = 0

        mark = 0

        if index == len(a)-1:

            end_flag = 1

        while True:

            if a[index] == a[i]:

                count += 1

                temp = i

            i += 1

            if count > mid:

                mark = temp

                return (mark,a[mark])

            if (i > len(a) - 1) and(end_flag == 0):

                break

            if (i > len(a) - 1) and(end_flag == 1):

                return(-1,-1)


if__name__ == "__main__":

    position,value = control()

    print(position)

print(value)

(3) 删除一列表中的重复元素,而且要保持列表中元素原来的顺序

a =[1,3,5,1,8,1,5]

b = []

fornumber in a:

    if number not in b:

        b.append(number)

print(b)

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