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. 将上一补的结果呈现给用户.
- 正则表达式中如何匹配数字?如果匹配单词? 如何匹配行首和行尾?.*?+ 分别都代表什么?
-
请说一下你对正则中贪婪模式和非贪婪模式的理解。
-
爬取网页时遇到死链该怎么处理?
- 按熟悉程度写出你接触过的关系型数据库和 nosql。 答:关系型数据库:mysql,nosql:mongodb
- 你使用 linux 的频率有多高(桌面环境?开发环境?还是只是玩儿玩儿) 答:最近两年一直在用ubuntu.包括:平时使用14.04桌面版,写代码都在14.04 vps上,写博客及跑爬虫一般在vps docker里.
- vim 使用:假设在一个文本中有 500 行文字,如果想把第200-300行中的 aaaa 替换成 bbbb 该怎么操作?
答:
:200,300s/aaaa/bbbb/g
-
在 vim 中如何查看一个单词在文本中出现的次数?
-
你所熟悉的版本控制工具是什么? 答:git
- 描述一下你说理解的版本控制中的分支的概念。 答: 分支用于将不同的开发绝缘开来.使用如下:
- 从主分支分离出开发分支;
- 在开发分支上进行开发;
- 将开发好的代码合并到主分支. 经典的分支管理策略由Vincent Driessen提出,图示如下:
- 描述一下 pull request 开发流程。
git checkout master #切换到主分支
git pull origin master #更新本地代码
git checkout -b feature-share-download #新建并切换到功能分支
.... #开发
- 描述一下你自己是如果组织一个项目的代码的。
-
说出你在 python 开发中常用的工具。
-
请写出你所熟悉或常用的遍历 字典 的方法。
- 假如有字符串 s = ‘I am a student’(每个单词以空格分隔),请写一段处理程序,处理后得到字符串 s1 = ‘student a am I’。如果第二个单词和第三个单词之间是两个空格分隔,第三个单词和第四个单词之间以 tab 分隔,怎么实现?
- 假如有一张用户数据表(十万行数据,字段为 id, name, ico),要取所有用户信息并打印,请用代码实现。