首页
登录 | 注册

python 面试题 - 知识点整理


1. 在判断object是否是class的instances时,type和isinstance函数的区别?

type(obj) => <type 'instance'>

type(cls) => <type 'classobj'>

由上可知,所有obj type后统一为 instance type; 而cls type后统一为classobj type

isinstance(obj,class),如果object是class的instance,返回True。


2. 通过重写内建函数,实现文件open之前检查文件格式?

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4

def open(filename,mode):
    import __builtin__
    
    file = __builtin__.open(filename,mode)
    
    if file.read(5) not in("GIF87", "GIF89"): 
        raise IOError, "not aGIF file"
    file.seek(0) 
    return file
    
fp = open("sample/test.gif","r")
print len(fp.read()), "bytes"

3. 重新实现str.strip(),注意不能使用string.*strip()

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4


# TODO rstrip
def rightStr(string,split=' '):
    endind = string.rfind(split)
    res = string
    while endind != -1 and endind == len(res)-1:
        res = res[:endind]
        endind = res.rfind(split)
    
    return res


# TODO lstrip
def leftStr(string,split=' '):
    startind = string.find(split)
    res = string
    while startind != -1 and startind == 0:
        res = res[startind+1:]
        startind=res.find(split)
        
    return res

def main():
    
    word='aa    asdf  aa  '
    stripstr=' '
    
    lenth = len(word)
    res=word
    # leftstrip
    if word[0] == stripstr:
        res=leftStr(res)
    
    # rightstrip
    if word[len(word)-1] == stripstr:
        res=rightStr(res)
    
    print res

if __name__ == "__main__":
    main()
    

4. 说明os,sys模块不同,并列举常用的模块方法?

官方解释:
os: This module provides a portable way of using operating system dependent functionality. 
翻译:提供一种方便的使用操作系统函数的方法。
sys:This module provides access to some variables used or maintained by the interpreter and to functions that interact strongly with the interpreter.
翻译:提供访问由解释器使用或维护的变量和在与解释器交互使用到的函数。
os 常用方法

os.remove()删除文件
os.rename()重命名文件
os.walk()生成目录树下的所有文件名
os.chdir()改变目录
os.mkdir/makedirs创建目录/多层目录
os.rmdir/removedirs删除目录/多层目录
os.listdir()列出指定目录的文件
os.getcwd()取得当前工作目录
os.chmod()改变目录权限
os.path.basename()去掉目录路径,返回文件名
os.path.dirname()去掉文件名,返回目录路径
os.path.join()将分离的各部分组合成一个路径名
os.path.split()返回(dirname(),basename())元组
os.path.splitext()(返回filename,extension)元组
os.path.getatime\ctime\mtime分别返回最近访问、创建、修改时间
os.path.getsize()返回文件大小
os.path.exists()是否存在
os.path.isabs()是否为绝对路径
os.path.isdir()是否为目录
os.path.isfile()是否为文件

sys 常用方法
sys.argv           命令行参数List,第一个元素是程序本身路径  
sys.modules.keys() 返回所有已经导入的模块列表  
sys.exc_info()     获取当前正在处理的异常类,exc_type、exc_value、exc_traceback当前处理的异常详细信息  
sys.exit(n)        退出程序,正常退出时exit(0)  
sys.hexversion     获取Python解释程序的版本值,16进制格式如:0x020403F0  
sys.version        获取Python解释程序的版本信息  
sys.maxint         最大的Int值  
sys.maxunicode     最大的Unicode值  
sys.modules        返回系统导入的模块字段,key是模块名,value是模块  
sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值  
sys.platform       返回操作系统平台名称  
sys.stdout         标准输出 
sys.stdin          标准输入 
sys.stderr         错误输出 
sys.exc_clear()    用来清除当前线程所出现的当前的或最近的错误信息 
sys.exec_prefix    返回平台独立的python文件安装的位置 
sys.byteorder      本地字节规则的指示器,big-endian平台的值是'big',little-endian平台的值是'little' 
sys.copyright      记录python版权相关的东西 
sys.api_version    解释器的C的API版本 
sys.version_info  


5. deepcopy 和 copy的区别?

copy 仅拷贝对象本身,而不拷贝对象中引用的其它对象。

deepcopy 除拷贝对象本身,而且拷贝对象中引用的其它对象。

例如:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4

import copy

al = [[1],[2],[3]]
bl = copy.copy(al)
cl = copy.deepcopy(al)

print "before=>"
print al
print bl
print cl

al[0][0] = 0
al[1] = None

print "after=>"
print al
print bl
print cl


6. os.path和sys.path的区别?

os.path是module,包含了各种处理长文件名(路径名)的函数。

例如:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4

import os
filename = "my/little/pony"
print "using", os.name, "..."
print "split", "=>", os.path.split(filename)
print "splitext", "=>", os.path.splitext(filename)
print "dirname", "=>", os.path.dirname(filename)
print "basename", "=>", os.path.basename(filename)

sys.path是由目录名构成的列表,Python 从中查找扩展模块( Python 源模块, 编译模块,或者二进制扩展). 启动 Python 时,这个列表从根据内建规则,PYTHONPATH 环境变量的内容, 以及注册表( Windows 系统)等进行初始化. 


7. re模块中match和search方法的不同?

match() 函数只检查 RE 是否在字符串开始处匹配,而 search() 则是扫描整个字符串。


8. 如何匹配<html><title></title></html>得到<html>

>>> import re
>>> str = r'<html><title></title></html>'
>>> p = re.compile(r'<.*?>')
>>> print p.match(str).group(0)


9. 重新实现filter,map,reduce。

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4

def filter_impl(func, argvs):
    res = []
    
    for argv in argvs:
        if func(argv):
            res.append(argv)
    
    return res


# check filter impl
print "filter ==>"
print filter_impl(lambda x: x<4, range(1,10))
print filter(lambda x: x<4, range(1,10))

def map_impl(func, argvs):

    res = []
    for argv in argvs:
        res.append(func(argv))
        
    return res

# check map impl

print "map ==>"
print map_impl(lambda x: x*10, range(1,5))
print map(lambda x: x*10, range(1,5))

def reduce_impl(func, argvs, startVal=None):
    
    if startVal is not None:
        argv1 = startVal
    else:
        argv1 = argvs[0]
    
    for argv2 in argvs[1:]:
        argv1 = func(argv1, argv2)
    
    return argv1
        
# check reduce impl
print "reduce ==>"
print reduce_impl(lambda x,y: x*y, range(1,4),20)
print reduce(lambda x,y: x*y, range(1,4),20)

Result:

filter ==>
[1, 2, 3]
[1, 2, 3]
map ==>
[10, 20, 30, 40]
[10, 20, 30, 40]
reduce ==>
120
120


10. 解释生成器(generator)与函数的不同,并实现和使用简单generator?

生成器和函数的主要区别在于函数 return a value,生成器 yield a value同时标记或记忆 point of the yield 以便于在下次调用时从标记点恢复执行。 yield 使函数转换成生成器,而生成器反过来又返回迭代器。

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4

def gem():
    yield "first"
    yield "second"
    yield "third"
    
for res in gem():
    print res

11. 设计实现遍历目录与子目录,抓取.pyc文件?

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim: tabstop=4 shiftwidth=4 softtabstop=4

# 1. for-in dir/subdir to get the filesname
# 2. splitext filename to filter

import os

def getFiles(dir, suffix):
    
    res = []
    for root,directory,files in os.walk(dir):
        for filename in files:
            name, suf = os.path.splitext(filename)
            if suf == suffix:
                res.append(os.path.join(root, filename))
    return res

for file in getFiles("./", '.py'):
    print file




补充待续。。。。


相关文章

  • 什么是GIL?GIL对多线程的影响 GIL全称Global Interpreter Lock(全局解释器锁).GIL和Python语言没有任何关系,只是因为历史原因导致在官方推荐的解释器Cpython中遗留的问题.(多线程)每个线程在执行的 ...
  • 阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点
    为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总分享,点此进入答题并围观他人答案).并通 ...
  • 阿里开发者招聘节 | 面试题01:如何实现一个高效的单向链表逆序输出?
    面试,如同玩一场饥饿游戏:既要对环境了然于胸,又要对自身心知肚明.发现一个好工作不容易,但成功应聘又会面临一系列的挑战. 为帮助开发者们提升面试技能.有机会入职阿里,云栖社区特别制作了这个专辑--阿里巴巴资深技术专家们结合多年的工作.面试经 ...
  • 电厂锅炉,火电厂三大主力设备之一.在电厂生产过程中发挥了极其重要的作用,是火电厂生产所必不可少的重要设备.但是,近些年,因为锅炉安全管控不到位而造成的事故屡有发生,给电厂的财产及人员的生命造成极大威胁.分析电厂锅炉的泄漏原因,制定有针对性的 ...
  • 深浅拷贝的定义: 浅拷贝只是增加了一个指针指向一个存在的地址, 深拷贝是增加一个指针并且开辟了新的内存,这个增加的指针指向这个新的内存, 采用浅拷贝的情况,释放内存,会释放同一内存,深拷贝就不会出现释放同一内存的错误 一层的情况: impo ...
  • 字符串: 字符串用单引号(')或双引号(")括起来,不可变 1,find通过元素找索引,可切片,找不到返回-1 2,index,找不到报错. 3,split 由字符串分割成列表,默认按空格. 4,captalize 首字母大写,其 ...

2020 jeepshoe.net webmaster#jeepshoe.net
13 q. 0.357 s.
京ICP备10005923号