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
正则表达式一:
匹配结果一:
正则表达式二:
匹配结果二:
正则表达式一采用的是贪婪模式,在匹配到第一个“