这是一年前应聘一家游戏公司后台Python工程师的笔试题,由对方发给我,我在当晚花了几个小时查资料做的。
那会对Python基本就属于有点基础语法的认识,发在百度文库居然浏览量-下载量=1,发在blog里面show下。黑颜色以外的部分以及所有答案是我回答的。
[讲解]
什么是 lambda函数?它有什么好处?另外 python在函数式编程方面提供了些什么函数和语
法?
Lambda 是一种单行的表达式函数,主要好处就是能简化代码,不需要定义一些简单功能的
函数
在 Python 中,函数可以作为参数传入,也可以作为结果被返回
提供了 lambada 语法方便编程
提供了以下内置函数:
filter(function, iterable)
map(function, iterable, ...)
reduce(function, iterable[, initializer])
zip([iterable, ...])
详细说说 tuple、list、dict 的用法,它们的特点;
三者的用法可参考:http://blog.sina.com.cn/s/blog_540775a30101bhhx.html
Tuple 一旦创建即不能进行修改(删除/增加/修改元素),但是其访问效率较高,且能保护常
量数据不被更改,所以适合于存储一些常量数据
List 适合于需要动态增删改的数据集,但不适用于需要查找的使用;因为其实现类似于 C
中的数组,也不适应于需要经常在 list 之间插入数据的场景。
Dict 就像很多语言中的 hash,可能在内部使用了红黑树或者其他数据结构存储了数据,以
达到快速定位的功能
说说 python 中装饰器、迭代器的用法;描述下 dict 的 items() 方法与 iteritems() 方法的不
同;
装饰器即是装饰器在 python 中的使用,主要用于为类/函数动态添加新的功能,python 中
的用法如下:
def deco(func):
def _deco():
print("before myfunc() called.")
func()
print(" after myfunc() called.")
# 不需要返回func,实际上应返回原函数的返回值
return _deco
@deco
def myfunc():
print(" myfunc() called.")
return 'ok'
myfunc()
如果 obj 实现了__iter__以及 Next(), 我们可以使用 iter(obj)来获取迭代器: 并可以使用如下
方法进行访问:
fetch = iter(seq)
while 1:
try:
i = fetch.next()
except StopIteration:
break
#do_something_to(i)
dict 的 items()返回的是一个包含<KEY, VALUE>pair 的 list 对象
dict 的 iteritems()返回的是一个可以遍历<KEY, VALUE>pair的迭代器 iterator,与 C++中迭代器
类似,可以使用一些通用函数对其进行遍历处理
知道 greenlet、stackless 吗?说说你对线程、协程、进程的理解;
greenlet 类似于 goto 语句的功能,但是在函数或者说微线程之间实现了跳转,且在结束后
能自动回到调用处
一个 “greenlet” 是一个很小的独立微线程。可以把它想像成一个堆栈帧,栈底是初始调用,
而栈顶是当前 greenlet 的暂停位置。你使用 greenlet 创建一堆这样的堆栈,然后在他们之间
跳转执行。跳转不是绝对的:一个 greenlet 必须选择跳转到选择好的另一个 greenlet,这会
让前一个挂起,而后一个恢复。两 个 greenlet 之间的跳转称为 切换(switch) 。
当你创建一个 greenlet,它得到一个初始化过的空堆栈;当你第一次切换到它,他会启动指
定的函数,然后切换跳出 greenlet。当最终栈底 函数结束时, greenlet 的堆栈又编程空的了,
而 greenlet 也就死掉了。greenlet 也会因为一个未捕捉的异常死掉。
stackless 是 python 的一个协程实现版本?还没有仔细看。
线程,进程是比较经典的概念了,进程可以包括文件句柄等系统资源的单位,线程一般是
现代 CPU 的基本调度单位
而协程是通过用户调度,切换的消耗要小于线程/进程的切换。
协程的优势在于可以自己控制切换,适合于顺序执行的一些情况,而线程更加适合并行处
理数据的情况;同时使用协程可以控制调度,减少切换的消耗。
讲讲对 unicode, gbk, utf-8 等的理解,python2.x 是如何处理编码问题?
Unicode,GBK 是对字符编码值的规定,两者并不兼容。而 UTF-8 则是对于 Unicode 编码的具
体表现形式
Unicode 有多种表达方式,包括 UCS2,UCS4,UTF-8,UTF-7;其中手机短信就是由 ASCII(只存在
ASCII 编码)及 UCS2 编码混合(存在任意个非 ASCII 编码)
UTF-8 使用 1-4 个字节来存储单个字符,应该是目前最流行的字符集。Linux 默认字符集就是
UTF-8
一般代码头行加入 # -*- coding: utf-8 -*-
保证 python 编辑器的编码正确,或使用 u’中文’保证被转换成 unicode