Pythonpython面试题Python

Python的面试题大全

2017-09-20  本文已影响3902人  happyshui

利用闲暇时间,将网上所有关于Python的面试题做一做,不会的使用Google搜索了一下,整理学习,也为方便大家不用再东找西找
注: 持续保持更新状态,答案更新的字体会加黑加粗

1. Python的函数参数传递
a = 10
b = 20

def fun(a, b):
    print('func_in', id(a), id(b))
    a = 5
    print('new_in', id(a), id(b))
    c = a + b
    return c
print('func_out', id(a), id(b))
print fun(2, 3)

参数是通过assignment来传递的.
1.传递的参数实际上是内存中一个对象的引用(只不过通过值传递的)
2.一些数据类型是可变的,有些是不可变的

对象种类 类型
不可变的 strings, tuples, numbers
可变的 list,dict

详解

2. 你理解的列表与字典是什么,举个例子

列表: 不同类型的可重复的可修改的集合
字典: keys,values的键值集合

list1 = ['apple', 'banana', 'orange']
list2 = [3, 2, 6]
dict1 = dict(zip(list1, list2))

print(list1[1])
print(dict1, dict1['banana'])

元组: 不同类型的可重复的不可修改的集合

tup1 = ('apple', 'banana', 10, 20);
tup2 = (1, 2, 3, 4, 5, 6, 7 );

print "tup1[0]: ", tup1[0]
print "tup2[1:5]: ", tup2[1:5]

集合: 无序不重复元素集合

list1 = [ 1, 1, 3, 5, 5, 5, 0]
lst_set = set(list1)
print(lst_set)

tup = (2, 2, 1)
tup_set = set(tup)
print(tup_set)
3. What is PEP 8 ? 什么是PEP 8 ?

PEP 8是一个编程范例,一套如何让自己的程序更加易读容易被理解的推荐。
PEP

4. 你使用Python 虚拟环境?

virtualenv,通过创建独立Python开发环境的工具, 来解决依赖、版本以及间接权限问题,方便的管理python版本和管理python库
安装Virtualenv
pip install virtualenv
工作目录下创建虚拟环境(包含已经安装的库)
virtualenv .\
启动虚拟环境
activate
退出虚拟环境
deactivate

5. range and xrange?两者有什么不同

循环中使用

for i in range(10):
    print(i)

for i in xrange(10):
    print(i)

输出结果显示的相同

r = range(10)
print(type(r))
print(r)
print(r[0], r[2])

xr = xrange(10)
print(type(xr))
print(xr)
print(xr[2], xr[4])

实际range返回的是list,xrange返回的是生成器

生成器:???

详解

6. Python 2.x and 3.x之间的一些区别

Python 2.7.x 与 Python 3.x 的主要差异

7. 什么是装饰器,用法和应用场景,写一个decorator

如何理解Python装饰器?

8. 说说你对zen of python的理解,你有什么办法看到它

理解:
Python之禅, Python 优美、简洁、可读性高, 秉承了极简主义的设计理念, 最好的程序既是没有注释也能读懂, 简洁明了的Python就是这样

import this

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.

Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than right now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

9. 你调试python代码的方法有哪些

IDE比如: IDLE, Eclipse+Pydev, PyCharm设置断点调试
pdb模块也可以做调试。
还有PyChecker和Pylint
PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug,会对代码的复杂度和格式提出警告
Pylint 是另外一个工具可以进行coding standard检查

10.什么是GIL

11.什么是元类(meta_class)

这个非常的不常用,但是像ORM这种复杂的结构还是会需要的,详情请看:
http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python

12. 对比一下dict中 items 与 iteritems

dict.items(): 返回 ( 键,值) 对列表的字典。
dict.iteritems(): 返回字典项的迭代器

D = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
print D.items()
print D.iteritems()
# 结果: 
# [('a', 1), ('c', 3), ('b', 2), ('d', 4)]
# <dictionary-itemiterator object at 0x0000000002F2CE58>
  1. 一般iteritems()迭代的办法比items()要快,特别是数据库比较大时。
  2. 在Python3中一般取消前者函数
    详解
13. 是否遇到过python的模块间循环引用的问题,如何避免它.

遇到过,在写自动化运维平台时,由于外键的使用,在引用models时出现循环引用,后面通过直接定义字段,然后通过程序逻辑进行处理

14. 有用过with statement吗?它的好处是什么?

with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

  1. inspect模块有什么用

  2. 写一个类,并让它尽可能多的支持操作符

  3. python下多线程的限制以及多进程中传递参数的方式

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

Python的内存管理是由私有heap空间管理的。所有的Python对象和数据结构都在一个私有heap中。程序员没有访问该heap的权限,只有解释器才能对它进行操作。
为Python的heap空间分配内存是由Python的内存管理模块进行的。其核心API提供一些访问该模块的方法供程序员使用。
Python有自带的垃圾回收系统,它回收并释放没有被使用的内存让它们能够被其他程序使用。

chenrudan.github.io
Python内存管理

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

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

20. 如何用Python输出一个Fibonacci数列?
a, b = 0, 1

while b < 100:
    a, b = b, a+b
    print a

21.介绍一下Python中webbrowser的用法?

22. 解释一下python的and-or语法

Python的逻辑运算(and,or,not)

These are the Boolean operations, ordered by ascending priority:

Operation Result Notes
x or y if x is false, then y, else x (1)
x and y if x is false, then x, else y (2)
not x if x is false, then True, else False (3)

Notes:

  • This is a short-circuit operator, so it only evaluates the second argument if the first one is false.
  • This is a short-circuit operator, so it only evaluates the second argument if the first one is true.
  • not has a lower priority than non-Boolean operators, so not a == b is interpreted as not (a == b), and a == not b is a syntax error.
not:

Python的非运算与这些语言相比,并没有特别的地方。not只有两个返回值,True和False。在Python中,真值为假的对象,包括False,None,数字0,空字符串以及空的容器类型。除此以外的任何对象均为真

a = 0
if not a:
    print a
else:
    print(2)
a = 1
if not a:
    print a
else:
    print(2)
and:
nums = [10,30,50,40,19,48,344]
sums = 0
for x in nums:
    sums += x > 40 and x
print sums
or:
a = 0
b = 20
c = a or b
print(c)

a = 10
b = 20
c = a or b
print(c)
and or

condition and a or b

# 举个例子,计算闰年

year = int(raw_input('请输入年份: '))

def is_year(y):
    if (y % 4 == 0 and y % 100 !=0) or y % 400 == 0:
        print "yes"
    else:
        print "no"

is_year(year)

(http://blog.csdn.net/qq_28267025/article/details/62044871
)

23.Python是如何进行类型转换的?
函数 描述
int(x [,base ]) x转换为一个整数
long(x [,base ]) x转换为一个长整数
float(x) x转换到一个浮点数
complex(real [,imag ]) 创建一个复数
str(x) 对象 x 转换为字符串
repr(x) 对象 x 转换为表达式字符串
eval(str) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s) 序列 s 转换为一个元组
list(s) 序列 s 转换为一个列表
chr(x) 一个整数转换为一个字符
unichr(x) 一个整数转换为Unicode字符
ord(x) 一个字符转换为它的整数值
hex(x) 一个整数转换为一个十六进制字符串
oct(x) 一个整数转换为一个八进制字符串

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

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

可以使用sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, string[, count=0])
replacement是被替换成的文本
string是需要被替换的文本
count是一个可选参数,指最大被替换的数量
模块: match、search、re

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

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = input('From: ')
password = input('Password: ')
to_addr = input('To: ')
smtp_server = input('SMTP server: ')

msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
msg['To'] = _format_addr('管理员 <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()

server = smtplib.SMTP(smtp_server, 25)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

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

28. 有两个序列a,b,大小都为n,序列元素的值任意整形数,无序

要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小

29. 如何用Python删除一个文件?
import os

# 删除文件:
os.remove()

# 删除空目录:
os.rmdir()

# 递归删除空目录:
os.removedirs()
30. Python如何copy一个文件?

copy.copy()方法或copy.deepcopy()方法,几乎所有的对象都可以被拷贝,一些对象可以更容易的拷贝,Dictionaries有一个copy方法: newdict = olddict.copy()

import copy
a = [1, 2, 3, 4, ['a', 'b']]  #原始对象

b = a  #赋值,传对象的引用
c = copy.copy(a)  #对象拷贝,浅拷贝
d = copy.deepcopy(a)  #对象拷贝,深拷贝

a.append(5)  #修改对象a
a[4].append('c')  #修改对象a中的['a', 'b']数组对象

print 'a = ', a
print 'b = ', b
print 'c = ', c
print 'd = ', d

输出结果:
a =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b =  [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c =  [1, 2, 3, 4, ['a', 'b', 'c']]
d =  [1, 2, 3, 4, ['a', 'b']]
31. Python中文乱码

哪些地方常见乱码现象:
为什么会存在乱码
如何解决乱码问题
关于Python字符集能和我讲讲自己的总结吗
这类问题的具体应用
程序中文输出问题怎么解决

32. python代码得到列表list的交集与差集、并集
list1 = [1, 3, 4, 5, 7, 8, 9]
list2 = [2, 4, 5, 6, 8]

res1 = []
res2 = []
res3 = []
list_all = list1 + list2

for i in list_all:
    if i not in list1:
        res3.append(i)
    elif i not in list2:
        res3.append(i)

for i in list_all:
    if i not in res1:
        res1.append(i)
    else:
        res2.append(i)

print '并集:', list(set(res1)), '\n交集:', list(set(res2)), '\n差集:', res3
  1. 写一个简单的python socket编程
34. python如何捕获异常

( 1 ) 使用try和except语句来捕获异常;
( 2 ) 用raise语句手工引发一个异常;
( 3 ) 采用sys模块回溯最后的异常;

  1. 静态函数, 类函数, 成员函数的区别?
36. a=1, b=2, 不用中间变量交换a和b的值
a = 1
b = 2
a, b = b, a
print a, b
37. 写一个函数, 输入一个字符串, 返回倒序排列的结果: 如: string_reverse(‘abcdef’), 返回: ‘fedcba’
a = input('输入字符串: ')

def string_reverse(strs):
    strs_tmp = list(strs)
    list.reverse(strs_tmp)
    print ''.join(strs_tmp)

string_reverse(strs=a)
38. 请用自己的算法, 按升序合并如下两个list, 并去除重复的元素:

list1 = [2, 3, 8, 4, 9, 5, 6]
list2 = [5, 6, 10, 17, 11, 2]

l = []
list1 = [2, 3, 8, 4, 9, 5, 6]
list2 = [5, 6, 10, 17, 11, 2]
l_all = list1 + list2
# list1.extend(list2)
# list1[len(list1):len(list1)] = list2

for i in l_all:
    print i
    if i not in l:
    l.append(i)

print list(set(l))
  1. 说一下以下代码片段存在的问题
from amodule import *  # amodule is an exist module  


class dummyclass(object):
    def __init__(self):
        self.is_d = True
        pass


class childdummyclass(dummyclass):
    def __init__(self, isman):
        self.isman = isman

    @classmethod
    def can_speak(self): return True

    @property
    def man(self): return self.isman


if __name__ == "__main__":
    object = new
    childdummyclass(True)
    print object.can_speak()
    print object.man()
    print object.is_d
  1. 介绍一下python的异常处理机制和自己开发过程中的体会
41. 解释一下 WSGI 和 FastCGI 的关系?

CGI全称是“公共网关接口”(CommonGateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。 CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。

FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute模式)。它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

WSGI的全称为: PythonWeb Server Gateway Interface v1.0 (Python Web 服务器网关接口),

它是 Python 应用程序和 WEB 服务器之间的一种接口。
它的作用,类似于FCGI 或 FASTCGI 之类的协议的作用。
WSGI 的目标,是要建立一个简单的普遍适用的服务器与 WEB 框架之间的接口。

Flup就是使用 Python 语言对 WSGI 的一种实现,是可以用于 Python 的应用开发中的一种工具或者说是一种库。

Spawn-fcgi是一个小程序,这个程序的作用是管理fast-cgi进程,那么管理wsgi进程也是没有问题的,功能和php-fpm类似。

故,简单地说,WSGI和FastCGI都是一种CGI,用于连接WEB服务器与应用程序,而WSGI专指Python应用程序。而flup是WSGI的一种实现,Spawn-fcgi是用于管理flup进程的一个工具,可以启动多个wsgi进程,并管理它们。

42. 解释一下 Django 和 Tornado 的关系、差别

Django源自一个在线新闻 Web站点,于 2005 年以开源的形式被释放出来。

Django 框架的核心组件有:

用于创建模型的对象关系映射为最终用户设计的完美管理界面一流的 URL 设计设计者友好的模板语言缓存系统等等

它鼓励快速开发,并遵循MVC设计。Django遵守 BSD版权,最新发行版本是Django

1.4,于2012年03月23日发布.Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(Do Not RepeatYourself)原则。

Tornado是 FriendFeed使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像 web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具和优化。

Tornado 和现在的主流 Web 服务器框架(包括大多数Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题。

43. 解释下Django使用redis缓存服务器

安装redis for Django的插件,在Django的settings中配置
pip install django-redis
django-redis

  1. 如何进行Django单元测试
45. 解释下Http协议

HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。

HTTP协议的主要特点可概括如下:

1.支持客户/服务器模式。

2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。

3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。

4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

46. 解释下Http请求头和常见响应状态码

Accept:指浏览器或其他客户可以接爱的MIME文件格式。可以根据它判断并返回适当的文件格式。

Accept-Charset:指出浏览器可以接受的字符编码。英文浏览器的默认值是ISO-8859-1.

Accept-Language:指出浏览器可以接受的语言种类,如en或en-us,指英语。

Accept-Encoding:指出浏览器可以接受的编码方式。编码方式不同于文件格式,它是为了压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式。

Cache-Control:设置关于请求被代理服务器存储的相关选项。一般用不到。

Connection:用来告诉服务器是否可以维持固定的HTTP连接。HTTP/1.1使用Keep-Alive为默认值,这样,当浏览器需要多个文件时(比如一个HTML文件和相关的图形文件),不需要每次都建立连接。

Content-Type:用来表名request的内容类型。可以用HttpServletRequest的getContentType()方法取得。

Cookie:浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现会话功能。

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

1xx:指示信息–表示请求已接收,继续处理

2xx:成功–表示请求已被成功接收、理解、接受

3xx:重定向–要完成请求必须进行更进一步的操作

4xx:客户端错误–请求有语法错误或请求无法实现

5xx:服务器端错误–服务器未能实现合法的请求

常见状态代码、状态描述、说明:

200 OK //客户端请求成功

400 Bad Request //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用

403 Forbidden //服务器收到请求,但是拒绝提供服务

404 Not Found //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

eg:HTTP/1.1 200 OK (CRLF)

47. 分别简述OO,OOA

对OO,OOA,OOD,OOP的学习和理解

48.简述正则表达式中?p的含义

49.Python类中的self的具体含义是

50. 请写出python的常用内置函数(至少3个),并描述它们具体含义

len()函数返回字符串和序列的长度。
type()函数可返回对象的数据类型
str()函数把对象转换成可打印字符串。
list()函数可将序列对象转换成列表
内置函数
(http://docspy3zh.readthedocs.io/en/latest/library/functions.html#input)
(http://www.wklken.me/posts/2013/03/16/python-base-builtins.html#1zi-fu-ji-zi-fu-chuan)

  1. 可以用python进行POST数据提交,可以加载什么模块来进行操作?在操作之前需要对数据进行什么操作?
    requests模块,request.GET 和 request.POST

  2. 说出python中间件Sqlalchemy的具体声明方式?以及模块与MySQLdb之间的区别?

53. 描述出3种python常用框架,并简要描述这些框架的优缺点

Django: Python Web应用开发框架
GitHub
Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响。Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构、以及全功能的管理后台

Flask:一个用Python编写的轻量级Web应用框架
GitHub
Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具

Tornado:异步非阻塞IO的Python Web框架
GitHub
Tornado的全称是Torado Web Server,从名字上看就可知道它可以用作Web服务器,但同时它也是一个Python Web的开发框架。最初是在FriendFeed公司的网站上使用,FaceBook收购了之后便开源了出来

54.reactor是什么? 有什么作用?请简要描述。

55. 请描述2种不同语言间数据流转通用格式
  1. 简述我们使用多线程编程时,锁与信号量之间的关系。

  2. 通常在python编写tcp服务时,我们使用拆、粘包的模块是什么?如何加载这个模块?

  3. 两个整数数组各有100亿条数据,并已经排序,保存在磁盘上,内存10M。
    问:
    (1)如何取得交集?时间和空间效率分别是多少?Python 集合set()操作方法
    (2)如果其中一个数组只有100条数据,如何优化算法取得交集?时间和空间效率分别是多少?
    (3)用自己熟悉的语言实现第2个问题,要求可以正确运行;假设已经提供函数read_elt(arrary_name, index)可以用来读取某个数组的第index个元素,元素个数分别用m=100和n=10^10表示。
    磁盘故障与存储系统的年失效率估算

  4. 有100个磁盘组成的存储系统,当有3个磁盘同时损坏时,才会发生数据丢失。如果1个磁盘的损坏率是p,请问整个存储系统丢失数据的概率是多少?

  5. 请描述B-Tree插入值的过程

  6. 一个管道可以从a端发送字符到b端,只能发送0-9这10个数字,设计消息的协议,让a可以通知b任意大小的数字,并讨论这种消息协议可能发送的错误的处理能力。

  7. 假设fd是一个socket,read(fd, buf, 1024)
    问:可能返回哪些值?其代表什么含义?

  8. 自旋锁适合哪些场合应用,不适合哪些场合?

  9. 假设网络会丢失消息,进程可能意外终止,磁盘可靠(写入数据后不会丢失);
    问:
    如何构建一个可靠的分布式key-value存储系统?
    答题要求如下:
    1.客户端向系统发送1条写入请求(例如key=x, value=1),系统返回'成功',客户端一定可以正确读取到key=y的值
    2.在你设计的系统中,要满足上面第1条,并有一定对故障的容错能力。
    3.如果要尽可能提高写入或读写成功率,如果改进系统设计?分别会有哪些问题?

58-64Answer

65. 假设你的键盘只有以下键:

A
Ctrl + A
Ctrl + C
Ctrl + V
这里Ctrl+A,Ctrl+C,Ctrl+V分别代表"全选",“复制”,“粘贴”。
如果你只能按键盘N次,请写一个程序可以产生最多数量的A。也就是说输入是N(你按键盘的次数), 输出是M(产生的A的个数)。

加分项:
打印出中间你按下的那些键。

Answer

66. 假设给你一个月的日志,格式如下:

[I 130403 17:26:40] 1 200 GET /question/123 (8.8.9.9) 200.39ms
[I 130403 17:26:90] 1 200 GET /topic/456 (8.8.9.9) 300.85ms
[I 130403 17:26:90] 1 200 POST /answer/789 (8.8.9.9) 300.85ms
...
方括号中依次是:级别,日期,时间,后面依次是用户id,返回码,访问方式,访问路径,用户ip,响应时间
日志文件名格式为:年-月-日-小时.log,如:2013-01-01-18.log,共3024个文件。
写个程序,算出一个用户列表和一个路径列表符合以下要求:
(1).这些用户每天都会访问(GET)/topic/
这个路径两次以上(代表数字)
(2).这些用户每天访问(GET)的/topic/
**路径中,至少会包含两个不同的路径(后面的数字不一样)
(3).统计出所有以上用户所访问的路径中每天都出现两次以上的路径列表

Answer1
Answer2

  1. 有哪些CPython的替代实现?什么时候,为什么会使用他们?
68. Python是解释型的还是编译型的

解释型
编译型语言和解释型语言的区别:
编译语言: 程序执行速度快,同等条件下对系统要求较低,像开发操作系统、大型应用程序、数据库系统等时都采用它,例如: C/C++、Pascal/Object Pascal(Delphi)等都是
解释型语言: 跨平台好,如Java、JavaScript、Perl、Python、Ruby等等

  1. 现在有一个 dict 对象 adict,里面包含了一百万个元素,查找其中的某个元素的平均需要多少次比较?一千万个元素呢?
    O(1) 哈希字典,快速查找,键值映射,键唯一!

  2. 现在有一个 list 对象 alist,里面的所有元素都是字符串,编写一个函数对它实现一个大小写无关的排序。

  3. python 里关于“堆”这种数据结构的模块是哪个?“堆”有什么优点和缺点?举一个游戏开发中可能会用到堆的问题(不限是于 python 的堆,可以是其它语言的相关实现)。

  4. set 是在哪个版本成为 build-in types 的?举一个你在以往项目中用到这种数据结构的问题(不限是于 python 的 set ,可以是其它语言的相关实现),并说明为什么当时选择了 set 这种数据结构。

  5. 有一个排好序地 list 对象 alist,查找其中是否有某元素 a(尽可能地使用标准库函数)

  6. 实现一个 stack

  1. 编写一个简单的 ini 文件解释器
    ConfigParser模块

  2. 现有 N 个纯文本格式的英文文件,实现一种检索方案,即做一个小搜索引擎

  3. 有1、2、3、4个数字能组成多少个互不相同且无重复数字的三位数?都是什么

  4. 11 Essential Python Interview Questions
    前五个已有人翻译回答地址: 5 个很好的 Python 面试题

  5. 正则匹配问题

  6. 需要添加哪些代码可使以下代码运行(方法对象):

class A(object):
    def __init__(self, a, b):
        self.__a = a
        self.__b = b

    def myprint(self):
        print('a=', self.__a, 'b=', self.__b)


a1 = A(10,20)
a1.myprint()
a1(80)

为了能让对象实例能被直接调用,需要实现call方法,添加代码:

def __call__(self, num):
    print('call:', num + self.__a)
  1. 以下代码输出什么?
class B(object):
    def fn(self):
        print('B fn')

    def __init__(self):
        print('B INIT')


class A(object):
    def fn(self):
        print('A fn')

    def __new__(cls, a):
        print('new', a)
        if a > 10:
            return super(A, cls).__new__(cls)
        return B()

    def __init__(self, a):
        print('INIT', a)


a1 = A(5)
a1.fn()
a2 = A(20)
a2.fn()
('new', 5)
B INIT
B fn
('new', 20)
('INIT', 20)
A fn

使用new方法,可以决定返回那个对象,也就是创建对象之前,这个可以用于设计模式的单例、工厂模式。init是创建对象是调用的

  1. 性能问题,以下代码慢在哪
def strtest1(num):
    str='first'
    for i in range(num):
        str+="X"
    return str

python的str是不可变对象,每次迭代,都会生成新的str对象来存储新的字符串,num越大,创建的str对象越多,内存消耗越大

上一篇下一篇

猜你喜欢

热点阅读