Python Questions - WBowam/wbowam.github.com GitHub Wiki

Date: 2015-04-26
Title: Python笔试题  
Tags: Python
Category: IT

1. 什么是装饰器,使用场景是什么?最好能举例说明在你的项目中哪个地方用到过装饰器。

答: 我们要对一个函数(myfunc)进行操作(修改或记录之类的),如下

#方法一:
func = modify(myfunc)
#方法二:
@modify
def myfunc():
    pass

方法一可行,但必须在myfunc已经被定义之后的某处,而且不通用,于是有了方法二:装饰器,使用情景如下:

例1:django中在某一操作前检查用户是否已登陆,如果未登录跳转到登陆页面.伪代码实现如下

def login_required(func):
    if(is_authenticated):
        return func()
    else:
        return login_view()

@login_required
def article_detail(request):
    user = request.user
    ......
    return render("article_detail.html", context)

@login_required
def article_index(request):
    user = request.user
    ......
    return render("article_index.html", context)

例2:在django 中给Model自定义属性

from django.db import models

Class Article(models.Model):
    title = models.CharField(max_length=1024)
    
    @property
    def manifest(self):
        attribute_key_list = ['id', 'title']
        entity_dict = {}
        for key in attribute_key_list:
            entity_dict[key] = self.__getattribute__(key)                                                                            
        return entity_dict
>>> article = Article(title="Hackers and Painters")
>>> article.save()
>>> article.manifest
{'id': 1, 'title': "Hackers and Painters"}

例3:python自带函数也到处使用装饰器,如

class Foo:
    #静态方法走起
    @staticmethod
    def add(a, b):
        print a + b
2. 什么是迭代器,使用场景是什么?最好能举例说明在你的项目中哪些地方用到过迭代器。

答:常见的可迭代对象有list, dict,file, str...... 只要是实现了next()或iter()方法的对象都可以迭代,如:

>>> iterator = iter(range(3))
>>> iterator.next()
0
>>> iterator.next()
1
>>> iterator.next()
2
>>> iterator.__iter__()
<listiterator at 0x7fe6f25f11d0>
>>> for i in iterator:
        print i
0
1
2

迭代器: 访问集合内元素的一种方式. 1. 从第一个元素开始访问,一直到最后一个 2. 只往前访问(这并不算什么缺点,因为很少会有在迭代途中进行回退的操作) 3. 特别适合遍历巨大的文件或无限集合,如几个G的文件.因为它不要求你事先准备好整个迭代过程中所有的元素,仅仅在迭代至某个元素时才计算该元素.而列表是一次性获取所有值的,如果有很多值,列表会占用太多的内存.

3. 请以代码说明你所理解的 Python 中对象的深拷贝和浅拷贝。

答:深拷贝:对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。

>>> import copy
>>> old_obj = [1,2,3]
>>> deep_obj = copy.deepcopy(old_obj)
>>> print "old_obj:", old_obj, "deep_obj:", 
deep_obj
old_obj: [1, 2, 3] deep_obj: [1, 2, 3]
>>> deep_obj.append(4)
>>> old_obj.append(5)
>>> print "old_obj:", old_obj, "deep_obj:", deep_obj
old_obj: [1, 2, 3, 5] deep_obj: [1, 2, 3, 4]

浅拷贝:对象与拷贝对象共用一份实体,仅仅是引用的变量不同

>>> import copy
>>> old_obj = [1,2,3]
>>> shallow_obj = old_obj #也可以用 copy.copy(old_obj)
>>> print "old_obj:", old_obj, "shallow_obj:", 
shallow_obj
old_obj: [1, 2, 3] shallow_obj: [1, 2, 3]
>>> shallow_obj.append(4)
>>> print "old_obj:", old_obj, "shallow_obj:", shallow_obj
old_obj: [1, 2, 3, 4] shallow_obj: [1, 2, 3, 4]
3. 按熟悉程度说出你所接触过的 Python web 开发框架。

答:Django, flask

4. 请简单描述 web 开发框架大概有几个模块组成。

答:Django

  • settings.py:配置全域设定和全域参数
  • model:处理和数据有关的所有事物
  • url:设定网址的指向
  • views:后端逻辑(url所设定的指向会指向到对应的view)
  • template:网页模板 
  • media:存放影像或其他多媒体档案
  • static:存放静态文件

django框架工作一般流程如下: 流程图

 1. 用户访问网址(指向到我们的django服务)
 2. 从`urls.py`查出应指向哪个`app`哪个`view`
 3. 若需要`view`读取数据库,做运算.并将运算结果与`tempplate`相结合
 4. 将上一补的结果呈现给用户.
  1. 正则表达式中如何匹配数字?如果匹配单词? 如何匹配行首和行尾?.*?+ 分别都代表什么?

  2. 请说一下你对正则中贪婪模式和非贪婪模式的理解。

  3. 爬取网页时遇到死链该怎么处理?

  4. 按熟悉程度写出你接触过的关系型数据库和 nosql。 答:关系型数据库:mysql,nosql:mongodb

  5. 你使用 linux 的频率有多高(桌面环境?开发环境?还是只是玩儿玩儿) 答:最近两年一直在用ubuntu.包括:平时使用14.04桌面版,写代码都在14.04 vps上,写博客及跑爬虫一般在vps docker里.

  6. vim 使用:假设在一个文本中有 500 行文字,如果想把第200-300行中的 aaaa 替换成 bbbb 该怎么操作? 答::200,300s/aaaa/bbbb/g

  7. 在 vim 中如何查看一个单词在文本中出现的次数?

  8. 你所熟悉的版本控制工具是什么? 答:git

  9. 描述一下你说理解的版本控制中的分支的概念。 答:git branch 分支用于将不同的开发绝缘开来.使用如下:

  • 从主分支分离出开发分支;
  • 在开发分支上进行开发;
  • 将开发好的代码合并到主分支. 经典的分支管理策略由Vincent Driessen提出,图示如下:   经典的分支结构
  1. 描述一下 pull request 开发流程。
git checkout master #切换到主分支
git pull origin master #更新本地代码
git checkout -b feature-share-download #新建并切换到功能分支
.... #开发
 
  1. 描述一下你自己是如果组织一个项目的代码的。

  2. 说出你在 python 开发中常用的工具。

  3. 请写出你所熟悉或常用的遍历 字典 的方法。

  4. 假如有字符串 s = ‘I am a student’(每个单词以空格分隔),请写一段处理程序,处理后得到字符串 s1 = ‘student a am I’。如果第二个单词和第三个单词之间是两个空格分隔,第三个单词和第四个单词之间以 tab 分隔,怎么实现?

  5. 假如有一张用户数据表(十万行数据,字段为 id, name, ico),要取所有用户信息并打印,请用代码实现。