python和web框架面试题目整理(2)
答:(1)利用列表的count方法,通过集合或者字典都能实现。
方法一:
def list_set(lst):
myset = set(lst)
for item in myset:
print ‘the item %s has found %d time‘ %(item,lst.count(item))
lst = [5,4,1,3,2,2,6,5,4,3,2,1,4,3]
list_set(lst)
方法二:
def list_dict(lst):
d = {}
for item in lst:
d[item] = lst.count(item)
print d
lst=[5,4,1,3,2,2,6,5,4,3,2,1,4,3]
list_dict(lst)
(2)如果有100万个元素,使用collections模块的Counter方法
from collections import Counter
lst = [5,4,1,3,2,2,6,5,4,3,2,1,4,3]
Counter(lst)
Counter({2: 3, 3: 3, 4: 3, 1: 2, 5: 2, 6: 1})
2、django的forms模块通常用什么HTTP方法,它们之间有何区别?用什么方法来验证表单数据的合法性?
答:(1)处理表单时候只会用到POST和GET方法。
(2)GET方法通过键=值的形式,并且有个前缀问号‘?‘将字符串和URL拼接在一起,通常会在URL中暴露数据,不太安全;而对于POST方法,浏览器会组合表单数据、对它们进行编码,然后打包将它们发送到服务器,数据不会出现在url中。
(3)GET方法通常用来请求数据,不适合密码表单这一类保密信息的发送,也不适合数据量大的表单和二进制数据。对于这些类型的数据,应该使用POST方法。
(4)GET特别适合网页搜索的表单,因为这种表示一个GET请求的URL可以很容易地设置书签、分享和重新提交
(5)每个Django表单的实例都有一个内置的is_valid()方法,用来验证接收的数据是否合法。如果所有数据都合法,那么该方法将返回True,并将所有的表单数据转存到它的一个叫做cleaned_data的属性中,该属性是以个字典类型数据。
参考文档:http://www.liujiangblog.com/course/django/151
3、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法?又请问一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级,求该青蛙跳上一个n级的台阶总共有多少种跳法?
答:(1)fib = lambda x: x if x<2 else fib(x-1) + fib(x-2) ##类似于累加,当n>=2的时候,就有两种跳法
(2)dib = lambda n: n if n<2 else 2*dib(n-1) ##类似于2^n次方
参考文档:https://www.cnblogs.com/luckyjason/p/5319379.html
4、合并两个有序列表,比如lst1=[1,2,3],lst2=[3,4,5]?
答:
def merge_sort(lst1,lst2):
tmp = []
tmp.extend(lst1)
tmp.extend(lst2)
tmp = list(set(tmp))
return tmp
lst1 = [1,2,3]
lst2 = [3,4,5]
print merge_sort(lst1,lst2)
5、如何快速的在一个有序列表中查找是否有某个元素?如何快速的在一个无序列表(元素还有可能重合)中查找是否有某个元素?
答:(1)二分查找只能用于有序列表
def binary_search(lst,item):
low = 0
high = len(lst)-1 ##减一的原因是low初始为0
while low <= high:
middle = (high+low)/2
guess = lst[middle]
if guess > item:
high = middle - 1
elif guess < item:
low = middle + 1
else:
print ‘该元素%s在列表的索引位置是%d‘ %(item,middle)
return middle
return None
lst = [1,2,3,4,5]
binary_search(lst,3)
(2)对于无序列表,可以用python自带的index方法
def search(lst,item):
if item in lst:
print ‘该元素%s所在列表位置是%d‘ %(item,lst.index(item))
else:
print ‘该元素%s不存在与当前列表中!‘ %item
lst = [6,4,7,1,5,7,8,1,2,3]
search(lst,3)
6、如何反向迭代一个序列?
答:元组,列表,字符串是可迭代序列
def reverse(seq):
for x in range(len(seq)-1,-1,-1): ##比如range(3,-1,-1)删除[3,2,1,0]
print seq[x]
str = ‘yhc‘
lst = [1,2,3]
tuple = [4,5,6]
reverse(str)
reverse(lst)
reverse(tuple)
参考文档:https://blog.csdn.net/u013205877/article/details/77542837
7、如何查询和替换一个文本中的字符串?
答:(1)使用字符串的replace方法;(2)使用正则的sub方法
tmp = ‘yhc is very good‘
tmp.replace(‘yhc‘,‘admin‘)tempstr = ‘hello i am yhc‘
print re.sub(‘yhc‘,‘Bye‘,tempstr)
hello i am Bye
参考文档:https://blog.csdn.net/u013205877/article/details/77542837
8、已知字典d = {‘a‘:10,‘b‘:5,‘c‘:20} ,请根据字典value从大到小进行排序?
答:
d = {‘a‘:10,‘b‘:5,‘c‘:20}
sorted(d.items(),key=lambda x:x[1]) ## lambda的x变量代表是每个元素
[(‘b‘, 5), (‘a‘, 10), (‘c‘, 20)]参考文档:https://blog.csdn.net/a857553315/article/details/79575623
9、A目录下有a.py,A目录下有子目录C,C目录有c.py,问a.py如何导入c.py呢?
答:如果要把目录导入一个模块,必须要有init.py存在!
(1)[ A]# pwd
/opt/A
[ A]# ls
a.py C
[ A]# ll C/
-rw-r--r-- 1 root root 17 4月 30 10:37 c.py
-rw-r--r-- 1 root root 0 4月 30 10:41 init.py
[minion A]# cat C/c.py
print ‘---c----‘
(2)[ A]# python a.py
import sys
import os
BASE_DIR = os.getcwd() # 获取A目录的位置。如果要导入一个文件,则追加该目录的父目录到路径搜索环境中
print BASE_DIR
sys.path.append(BASE_DIR)
from C import c
print ‘---a---‘
10、把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:[‘adam‘, ‘LISA‘, ‘barT‘],输出:[‘Adam‘, ‘Lisa‘, ‘Bart‘]?
答:def first_upper(tmpstr):
return tmpstr[0].upper()+tmpstr[1:].lower()
lst = [‘adam‘, ‘LISA‘, ‘barT‘]
print map(first_upper,lst)
11、把字符串”k1:1|k2:2|k3:3”处理成 python 字典的形式:{k1:1,k2:2,k3:3} ?
答:
def string_to_dict(string):
d = {}
for kv in string.split("|"):
k,v = kv.split(":")
if v.isdigit():
v = int(v)
d[k] = v
return d
print string_to_dict("k1:1|k2:2|k3:3")
12、python自省,hasattr和getattr怎么用?
答:(1)hasattr(self,name)判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False
(2)getattr(self,name)获取对象object的属性或者方法,如果存在打印出来,如果不存在,打印出默认值,默认值可选。
需要注意的是,如果是返回的对象的方法,返回的是方法的内存地址,如果需要运行这个方法,
可以在后面添加一对括号。
参考文档:https://www.cnblogs.com/cenyu/p/5713686.html
13、django如何分别在视图和模板避免CSRF的403拒绝服务错误?
答:(1)视图中在函数面前定义一个@csrf_exempt装饰器,前提是from django.views.decorators.csrf import csrf_exempt
(2)在模板中的表单中填一个变量,{{ csrf_token }}
参考文档:http://www.liujiangblog.com/course/django/120
14、A和B同级目录,那么A目录下的a.py如何导入B目录下的b.py呢?
答:注意:执行a.py的时候,必须进入A目录下,进行python a.py否则会报错,因为如果是python A/a.py,那么os.getcwd()会不同
(1)在a.py中做如下操作
import os
import sys
BASE_DIR = os.path.dirname(os.getcwd()) # 返回的是/opt目录
sys.path.append(BASE_DIR)
from B import b
(2)在B目录下需要建立一个init.py文件即可
[ A]# pwd
/opt/A
[ A]# python a.py
参考文档:http://www.liujiangblog.com/course/django/119
15、Nginx+uwsgi+django的处理过程和作用?
答:(1)首先客户端请求服务资源,nginx作为直接对外的服务接口,接收到客户端发送过来的http请求,会解包、分析
(2)如果是静态文件请求就根据nginx配置的静态文件目录,返回请求的资源
(3)如果是动态的请求,nginx就通过配置文件,将请求传递给uWSGI;uWSGI 将接收到的包进行处理,并转发给wsgi
(4)wsgi根据请求调用django工程的某个文件或函数,处理完后django将返回值交给wsgi
(5)wsgi将返回值进行打包,转发给uWSGI
(6)uWSGI接收后转发给nginx,nginx最终将返回值返回给客户端(如浏览器)
作用:
- 第一级的nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程;
- 在nginx上加上安全性或其他的限制,可以达到保护程序的作用;
- uWSGI本身是内网接口,开启多个work和processes可能也不够用,而nginx可以代理多台uWSGI完成uWSGI的负载均衡;
- django在debug=False下对静态文件的处理能力不是很好,而用nginx来处理更加高效。
参考文档:https://blog.csdn.net/c465869935/article/details/53242126
16、简单解释Python基于值的内存管理模式?
答:(1)Python采用的是基于值的内存管理方式,在Python中可以为不同变量赋值为相同值,这个值在内存中只有一份,多个变量指向同一个内存地址;
(2)Python具有自动内存管理功能,会自动跟踪内存中所有的值,对于没有任何变量指向的值,Python自动将其删除。
Python采用的是基于值的内存管理方式,对小整数和短字符串会进行缓存,就是相同值,对应不同的变量,其实是一个对象,范围是在[-5,256]
对于引用计数为0的对象,Python会把它的所占内存进行回收
参考文档:http://mp.weixin.qq.com/s/BMzrz3FnzblXjvV3ZdoE8g
17、python的time模块和datetime模块有何区别?
答:(1)time的striftime主要用来获取
(2)datetime主要用来获取当前时间,比如datetime.datetime.now()
18、如何用Python实现凌晨0点0分的单独一次定时任务执行?
答:一次的定时任务,只需要有个while True执行该程序,再导入datetime模块即可
#coding: utf-8
import datetime
def do_something():
print (‘此时时间是------%s------,正在执行定时任务‘) %datetime.datetime.now()
def main(h=0,m=0):
while True:
now = datetime.datetime.now()
if now.hour == h and now.minute == m:
do_something()
return 0
if name == ‘main‘:
main(23,01) ##代表23:01分执行此任务
19、django的身份验证如何实现?
答:(1)第一,使用is_authenticated()方法,通过if not request.user.is_authenticated判断。[不需要导入其他人认证模块]
(2)第二,使用@login_required装饰器,如果用户没有登录,则跳转到登录页面,如果用户已登录,则处理正常的视图。[from django.contrib.auth.decortators import login_required]
(3)第三,authenticate模块
from django.contrib.auth import authenticate,login
def myview(request):
username = request.POST.get[‘username‘]
password = request.POST.get[‘password‘]
user = authenticate(username=username,password=password)
if user:
if user.is_active:
login(request,user) # 表示用户已登陆,重定向到首页
else:
返回登陆页面
else:
返回用户不存在
总的来说,django的身份验证可以通过视图或模板页面来进行认证
参考文档:精通django书籍
20、python实现检查一个IP地址是否合法?
答:python实现起来太简单了,直接字符串分割就行了,正则地址是最尼玛麻烦的了
import sys
def check_ip(ipaddr):
ipaddr = ipaddr.strip().split(‘.‘)
if len(ipaddr) < 4:
print (‘IP地址输入有误!‘)
sys.exit()
for ip in range(len(ipaddr)):
ipaddr[ip] = int(ipaddr[ip])
if ipaddr[ip] > 0 and ipaddr[ip] < 255:
pass
else:
print (‘IP地址不能超过255!‘)
sys.exit()
print (‘这个IP地址是合法的‘)
str = ‘192.288.1.1‘
check_ip(str)
或者python 文件名 [IP地址],那么check_ip函数的参数应该为sys.argv[1]
‘‘‘
if len(sys.argv) < 2:
print (‘例:ptyhon %s %s‘ %(sys.argv[0],sys.argv[1]))
‘‘‘
此篇文章,还有20道题目,在我的面经中,详情看下面。
我会持续更新面试题目,包括linux,前端(vue,jquery,css)、python、mysql和redis的面经题目,后期加入golang。可以加我qq 2093905919或者微信 18828004657,跟我聊聊。(注:可以分享一部分面试题目,觉得可以的话,剩下的全部面试题目(多年经验,非常多而广的题目,适合突击面试复习,适合运维工程师,python工程师,运维开发,甚至前端开发(vue,asp,jquery)等等),需要打赏200元,绝对物超所值)