100道面试题
1.三种目前大型关系数据库名称
答:mysql,oracle,sqlserver
回顾:
FoxPro2.5
FoxPro2.5是Fox公司和Microsoft公司合并后,于1992年在FoxPro2.0的基础上开发成功的。
由于它兼容了以往在我国应用非常普及的dBase、FoxBase,
加上新颖的Rushmore查询技术和窗口用户界面,所以一度在国内数据库应用领域成为首选数据库。
Visual FoxPro
Microsoft公司在FoxPro2.5的基础上,引入面向对象编程技术和可视化编程方法,
于1995年9月推出新一代的FoxPro也即Visual FoxPro3.0。目前的最新版本是Visual FoxPro6.0。
Visual FoxPro除了拥有FoxPro2.5的全部优点外,还兼具以下一些新特性:
-快速创建数据库及应用程序的能力
-支持面向对象编程
-支持客户/服务器应用
MS SQL Server
MS SQL Server的前身是PC平台中最早的关系数据库管理系统之一的Sybase SQL Server,
1993年起,Microsoft致力于NT平台的SQL Server的开发,98年推出最新版,MS SQL Server7.0。具有以下特点:
与Windows NT集成;
允许集中管理服务器;
提供企业级的数据复制;
提供平行的体系结构;
支持超大型数据库;
与OLE对象的紧密集成。
ORACLE
ORACLE是最早提出基于标准SQL数据库语言的关系数据库产品之一
1979年问世,近二十年来融汇了数据库的各种先进技术,在小型机及微型机的关系数据库系统领域,占有举足轻重的地位。
自第五版起,支持客户/服务器和协同服务器,目前最新版本是1998年推出的ORACLE8.0。具有以下特点:
-名符其实的大型数据库
-共享SQL和多线索服务器体系结构
-跨平台能力
-分布式数据库
-卓越的安全机制
-支持客户机/服务器方式,支持多种网络协议
2.有表list,共有字段A,B,C类型都是整数,表中有如下几条记录:
A B C
2 7 9
5 6 4
3 11 9
问:
(1)查询B和C列的值,要求按照B列升序排序
select B,C from list order by B asc;
(2)写入一条新的记录,值为{7,8,9}
insert into list (A,B,C) values(7,8,9);
(3)查询C列,要求清除重复的值,按照降序排列
select C from list group by C order by C desc;
回顾:
1.数据库
查看:
SHOW DATABASES;
创建:
create databases name default charset utf8;
删除:
drop databases name;
使用数据库:
user name;
2.数据表
创建:
create table name(列名,类型...)engine=innodb default charset=utf8;
插入数据:
insert into tablename(列名) value();
查看:
select * from tablename
排序:
以列名b为例
select b from tablename order by b desc;(desc降序,asc升序)
分组:
select b from tablename group by b;
3.基本数据类型
字符串 char(固定长度) varchar(可变长)
时间 date(表示年月日) datetime(表示年月日时分秒)
数值 整数 浮点
3.简要说明视图的作用
1)数据库视图隐藏了数据的复杂性
2)数据库视图有利于控制用户对表中某些列的访问
3)数据库视图使用户查询变得简单
缺点:
性能查差
限制修改
回顾:
视图概念:
一个虚拟表,其本质是根据sql语句获取动态的数据集,并为其命名
用户使用时只需使用名称即可获取到数据集,并可以将其当作表来使用
创建视图:
create view 视图名称 as sql语句
删除视图:
drop view 视图名称
修改视图:
alter view 视图名称 as sql语句
使用视图:
视图是虚拟表,只能查询
4.python网络爬虫所用的网络数据包。
答:requests、urllib、urllib2、httplib2
5.python网络爬虫所用的解析数据包。
答:BeautifulSoup、pyquery、Xpath、lxml
6.Python中的编码方式是
ASCII
8位表示1个字节
最多能表示256个符号
1个字节代表1个字符
GBK
2个字节表示1个字符
unicode
万国码
可以兼容ASCII码
16表示1个字节
2个字节表示1个字符
优点:
字符转换数字速度快
缺点:
占用空间大
utf-8
节省空间
utf-8把一个unicode字符根据不同的数字大小编码成1-6个字节
常用的英文字母编码成1个字节
一个汉字3个字节
生僻4-6个字节
缺点:
字符转换数字速度慢,因为每次都需要计算字符需要多长的字节才能准确表示
7.python3.5 语言中 enumerate 的意思是
enumerate()用于遍历序列中的元素以及他们的下标。
enumerate()是python的内置函数。
enumerate的意思是枚举,列举的意思。
对于一个可迭代的或者可遍历的对象,enumerate将其组成一个索引序列,利用它同时获得索引和值
enumerate多由于for语句中得到计数。
8,99的八进制表示是______________________.
结果143
9,请举出三种常用的排序算法:______,_______,______.
冒泡、选择、快速
10,列出 python 中比较熟知的爬虫架构是________.
Scrapy
11.用 4,9,2,7 四个数字,可以使用+,-,*和/号,每个数字只使用 1 次,使表达式的结果是 24,
表达式是(7+9-4)*2=24,表达式是______.
答:(9+7-4)*2
12,写出网络爬取过程中,遇到防爬问题的解决办法______.
通过headers反爬虫:解决策略,伪造headers
基于用户行为反爬虫:动态变化去爬取数据,模拟普通用户的行为
基于动态页面的反爬虫:跟踪服务器发送的ajax请求,模拟ajax请求
13.for i in range(5,0,-1):print(i) 写出打印结果。
打印结果:5,4,3,2,1
回顾 :
range(start,end,length)
14.获取 list 的元素个数,和向末尾追加元素所用的方法是____,____.
答:len,append
回顾:
切片[1:-1]
索引
insert(索引位置,插入数据)
extend(只能是一个列表)
remove(重复删除第一个)
pop(默认删除最后一个)
del(删除整个列表)
15.判断 dict 有没有某个 key 用的方法是
#python2
dict.has_key()
#python3
d=dict.keys()
16,L=range(100)。取第一到第三个元素用( ),取倒数第二个 元素用(L[-2] ),
取后十个用( )。
答:list(li[1:4]) list(li[-3:-2]) list(li[-10:])
17,把 L 复制给 L1 用( )。注意:非引用传递。
答:import copy
L1 = copy.deepcopy(L)
18,d = {‘a’:1,’b’:2,’c’:3} 请打印出 key,value 值。
for k,v in d.items():
print(k,v)
19,如何判断一个变量是不是字符串?
l = ""
print(isinstance(l,str))
20,list 和 tuple 有什么不同?
list 列表,是长度可变有序的数据存储容器,可以通过下标索引取到相应的数据。
tuple 元组,固定长度不可变的顺序容器,访问效率高,适合存储一些常用数据,可以作为字典的键使用。
dict 字典,长度可变的hash字典容器,存储的方式为键值对,可以通过相应的键获取相应的值,key支持多种类型。
21,xrange 和 range 有什么不同?
range生成的结果是一个列表,当生成一个很大的序列时会占用很大的内存空间;
而xrange生成的结果则是一个生成器,当生成一个很大的序列时,性能会比range优很多。
22,‘1,2,3’如何变成[‘1’,’2’,’3’]? [‘1’,’2’,’3’]如何变成[1,2,3]?
print(list(l.split(',')))
l1=[]
for i in l:
l1.append(int(i.strip()))
print(l1)
23,def add_end(L=[]):
L.append(‘END’)
return L
add_end() 输出什么?
add_end() 再次调用输出什么?为什么?
答:['end']
['end', 'end'],因为在一地刺调用时L已经生成,在内存中类似于全局变量,第二次调用时会在第一次调用的
基础上进行添加(默认参数必须指向不变的对象)。
24,[34,5,12,9,21]怎么排序?
l = [34,5,12,9,21]
l.sort()
25,def func(a,b,c = 0,*args,**kw):
pass
*args,**kw 的作用是什么?
*args接受位置参数,**kw接受关键字传参。
26,is 和 == 的区别是什么?
is是对比地址,==是对比值
27,如何生成[1,4,9,16,25,36,64,81,100]尽量用一行实现。
obj = [i**2 for i in range(11)]
28,生成器是什么?有什么用?请写一个生成器。
答:可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的__iter__方法),
所以生成器就是可迭代对象。
def test():
print("one")
yeild 1
29,map(str,[1,2,3,4,5,6,7,8,9])输出什么?
答:输出一个map对象。
# map函数是对一个序列的每个项依次执行函数,加上list()会输出['1','2','3','4','5','6','7','8','9',]
30,已知 x=43,ch=‘A’,y=1,则表达式(x>=y and ch<‘B’and y )?
结果: 1
31,python 支持的数据类型有___字符串,元组,列表,字典,集合,布尔,int___________________________.
答:Number(数字),String(字符串),List(列表),Tuple(元组),Sets(集合),Dictionary(字典)
32,请把一下函数转化成 python 的 lamabda 匿名函数:
def add(x,y):
Return x+y
答:lambda x,y:x+y
33,
class A(object):
def foo(self,x):
print('executing foo(%s,%s)'%(self,x))
@classmethod
def class_foo(cls,x):
print('executing foo(%s,%s)' % (cls, x))
@staticmethod
def static_foo(x):
print('executing foo(%s)' %x)
a = A()
#调用 foo 函数,参数传入 1__________________________.
答:a.foo(1)
#调用 class_foo 函数,参数传入 1____________________.
答:A.class_foo(1)
#调用 static_foo 函数,参数传入 1___________________.
答:a.static_foo(1)
34,python 如何实现单例模式?
答: class Dog(object):
_instance = None
_init_flag = False
def __new__(cls,*args.**kwargs): #cls指向Dog
if cls._instance = None:
cls._instanc = object.__new__(cls)
return cls._instanc
def __init__(self,name):
if Dog._init_flag = False:
self.name = name
Dog._init_flag =True
a = Dog("旺财")
print(a.name)
b = Dong("啸天犬")
print(b.name)
35,什么是 lambda 函数?
匿名函数,简化用户使用函数的过程
lambda函数使用后就会释放内存
36,请写出一段 python 代码实现删除一个 list 里面的重复元素。
def func(li):
return list(set(li))
f=func([1,2,3,2])
print(f)
37,如何用 python 删除一个文件
import os
if os.path.exists:
os.remove(路径)
38,python 里面如何生成随机数?
import random
print(random.random())
39,在 Python 中,如何抛出,捕获,处理异常?
raise Excrption("抛出一个异常")
try:
pass
except Exception as e:
print(e)
40,输入一个字符串,返回倒序排列结果:如‘abcdef’,返回‘fedcba’。
l = ['abcdef']
print(l[::-1])
41,请用自己的算法,按升序合并如下两个 list,并出去重复元素。
list1 = [2,3,8,4,9,5,6],list2=[5,6,10,17,11,2]
答:list(set(list1+list2))
42,python 中,元组和列表的主要区别是__________________________.
元组不可变
列表可变
43,排好序的列表 alist 和字符 char1,表示 alist 中存在 char1 则返回 False,不存
在则返回 True 的表达式是____________________________.
False if char1 in alist else True
a=lambda x,y:False if x in y else True
print(a('h',['s','f','p']))
44,列表变量 alist,将 alist 中的最大值和最小值分别赋值给 maxValue 和 minValue
的表达式是________________.
alist = [1,2,3,4,5]
maxValue,minValue=(max(alist),min(alist))
45,列表 alist = [{“a”:5,”b”:2},{“a”:2,”b”:8},{“a”:8,”b”:2}]请写出以键
a 的值对 alist 进行排序的表达式是___________________.
sort(alist,key=lambda x:x['a'])
46,求列表 alist 和 blist 交集的表达式是__________________.
set(alist)&set(blist)
47,不依赖中间变量,交换变量 a 和 b 的值得表达式是___________.
a,b=b,a
48,现有列表 alist = [3,1,-4,-2],按照元素的绝对值大小进行排序的表达式是____________________.
sorted(alist,ket=lambda x:abs(x))
49,下面代码输出的结果是________________.
my_dict = {'a':0,'b':1}
def func(d):
d['a'] = 1
return d
func(my_dict)
my_dict['c'] = 2
print(my_dict)
答:{'a': 1, 'b': 1,'c':2}
50,alist 的最终值是________________________.
(经典题,答案可能不是你想的那样。)
alist = [2,4,5,6,7]
for var in alist:
if (var % 2) == 0:
alist.remove(var)
print(alist) #[4,5,7]
51,写出下面代码输出结果:_______________.
n = 5
print -n
答:-5
52,
有函数定义如下:
def calc(a,b,c,d=1,e=2):
return (a+b)*(c-d)+e
请分别写出下列标号代码的输出结果,如果出错请写出 Error。
print(calc(1,2,3,4,5))
print(calc(e=4,c=5,a=2,b=3))
print(calc(1,2,3))
print(calc(1,2,3,e=4))
print(calc(1,2)) #报错
print(calc(1,2,3,d=5,4)) #报错
53,表达式 3<4<5 是哪个表达式的缩写?
3<4 and 4<5
54,获取 python 解释器版本的方法是_________cmd直接输入python_____________________.
import sys
print(sys.version)
55,如果模块是被导入的,__name__的值是_______,如果模块是被直接执行的,
__name__的值是_______。
答:如果模块是被导入的,__name__的值是模块的名字,如果模块是被直接执行的,
__name__的值是字符串'__main__'
56,python 的内存管理中,为了追踪内存中的对象,使用了________这一简单技术。
答:引用计数。
#python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,
当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。
57,python 的标准解释器是由 C 语言实现的,称为_____,由 Java 实现的被称为______.
答:python 的标准解释器是由 C 语言实现的,称为Cpython,由 Java 实现的被称为jpython.
58,python 中,_________语句能直接显示释放的内存资源。
答:
59,python 的乘方运算符是_____.
答:python 的乘方运算符是**
60,请详细说明 cookie 和 session 有什么区别。
cookie是保存在浏览器端的键值对
session是依赖cookie的,保存在服务器端数据(本质上是键值对)
61.HTTP 协议是有状态还是无状态协议,如何从两次请求中判断是不是同一个用户。
无状态协议
通过用户发送请求携带的cookie判断
62,list = [1,2,3,4,5] print(list[10:]) 答案是什么?____________.
答:[]
63,下面代码打印的结果是______.
答:报错
arr = [1,2,3]
def bar():
arr += [5]
bar() #报错
print(arr)
64,下面代码打印的结果分别是_________,________,________.
def extendList(val,list=[]):
list.append(val)
return list
list1 = extendList(10) #[10]
list2 = extendList(123,[]) #[123]
list3 = extendList('a') #[10,"a"],list1变为[10,"a"]
print('list1=%s'%list1)
print('list2=%s'%list2)
print('list3=%s'%list3)
结果:
list1=[10, 'a']
list2=[123]
list3=[10, 'a']
65,python 判 断 一 个 字 典 中 是 否 有 这 些key:’AAA’,’BB’,’C’,’DD’,’EEE’(不使用 for,while)。
data = {"AAA":1,"BB":12,"C":34,"D":5,"EEE":90,"BG":37}
keys = ["AAA","BB","C","DD","EEE"]
print(list(filter(lambda x:x not in data.keys(),keys)))
66,python 一行 print 出 1~100 偶数列表(列表推导式,filter 均可)
print([i for i in range(1,101) if i %2 == 0])
67,写出五种 HTTP 请求方法。
答:GET,POST,PUT,DELETE,OPTIONS
回顾:GET,请求制定的页面信息,并返回实体主体。
HEAD,类似于get请求,只不过反悔的响应中没有具体的内容,用于获取报头。
POST,向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中,
POST请求可能会导致新的资源的简历和/或已有资源的修改。
PUT,从客户端向服务器传送的数据取代指定的文档的内容。
DELETE,请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS,允许客户单查看服务器的性能。
TRACE,回显服务器收到的请求,主要用于测试或诊断。
68,描述多进程开发中,join 与 daemon 的区别。
答:join([timeout]):阻塞当前上下文环境的进程,直到调用此方法的进程种植或到达指定的timeout(可选参数)。
deamon:设置守护进程,随主进程的生命周期,程序直到所有费守护进程结束而退出。
69,简单描述 GIL 对 python 性能的影响。
答:python的多线程会由于GIL,导致用一时刻同一进程只能有一个线程被运行(多个进程可以并行运行)。
GIL全局解释器锁:加载cpython解释器上(锁是加载进程这一级上)。
在一个线程拥有了解释器的访问权之后,其他的所有线程都必须等待它释放解释器的访问权,即使这些线程的吓一跳指
令并不会互相影响。所以,python是无法利用多核CPU实现多线程的。
在调用任何Python C API之前,要先获得GIL。
GIL影响:无论你启多少个线程,你有多少个CPU,Python在执行一个及承诺很搞得时候回淡定的在同一时刻只允许一个线程运行。所以,python是无法利用多核CPU实现多线程的。这样,python对于计算密集型的任务开多线程的效率甚至不如串行(没有大量切换),但是,对于
IO密集型的任务效率还是有显著提升的。
70,HTTP 协议状态码有什么用,列出你知道的 HTTP 协议的状态码,然后讲出他们都表示什么意思。
403 csrf错误
404 资源加载不到
500 服务器错误
200 正常使用
71,正则匹配中贪婪模式与非贪婪模式的区别,match,search 函数的使用及区别,请写出以字母或者下划线开始,以数字结束的正则表达式。
#贪婪匹配(最长的匹配)
print(re.findall("\d+","2342werwer2323werw")) #['2342','2323']
#非贪婪匹配(最短符合条件匹配)
print(re.findall("\d+","2342werwer2323werw")) #['2','3','4','2','2','3','2','3']
#re.match("规则","目标字符串"):只在字符串开始的位置匹配
s=re.match("\d+","ad324dsa32")
#re.search("规则","目标字符串"):匹配到第一个信息后,就停止了,只返回一个结果,如果没有匹配结果就返回None
s=re.search("\d+","ad324dsa32")
#以字母或者下划线开始,以数字结束的正则表达式。
import re
print(re.findall("^[a-zA-Z_].*\d+$","aasd34")) #['2342','2323']
72,从输入 http://www.baidu.com 到页面返回,中间都发生了什么?
当我们在浏览器的地址栏输入网址例如(http://www.baidu.com),http://代表使用超文本传输协议,www.baidu.com代表服务器地址,baidu.com
代表域名。一个完整的URL包括协议、服务器地址(主机)、端口、路径。
用户通常使用主机名或域名来访问某网站,而不是直接通过IP来访问,因为字母数字配合的表示形式更符合人类的记忆习惯,可计算机却不理解这
些名称,因此DNS服务应运而生,DNS协议提供通过域名查找IP地址,或逆向从IP地址反查域名的服务。DNS查询过程如下:
1.操作系统会先检查本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
2.如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
3.如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找到TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此
服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
4如果要查询的域名,不油本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有
权威性。
5.如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS
就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地
DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com
域的下一级DNS服务器地址(baidu.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找baidu.com域服务器,重复上面的动作,进行
查询,直至找到www.baidu.com主机。
6.如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把
请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客
户机。
从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间的交互查询就是迭代查询。
73,python 主要的内置数据类型都有哪些?哪些是可变的,哪些是不可变的?可变
类型与不可变类型有什么区别?
答:
int 不可变对象 python2中除法最后取整 python3 float
str 不可变对象 '' "" """ split strip 方法 python3 unicode pytho2 bytes
list 可变对象
tuple 不可变对象,一旦创建就不可更改
dict 无序,k是不可变对象。并且k不能重复
set 不可变对象,无序,天然去重,可做交集、并集等计算,
74,现在有两元祖 (('a'),('b')),(('c'),('d')),请使用 python 中的匿名函数生成列表[{'a':'c'},{'b':'d'}]。
a=(('a'),('b'))
b=(('c'),('d'))
c=[{i[0]:i[1]} for i in zip(a,b)]
print(c)
75,请写出二分查找的 python 示例代码。
76,在 python 字符串格式化中,%和.format 的主要区别是什么?
答:
%是使用%s为占位符,format是替换掉{}占位符。
print("my name is %s,age is %s"%("wangwang",18))
print("my name is {0},age is {1}".format("wangwang",18))
print("my name is {name},age is {age}".format(name="wangwang",age=12))
77,你有使过 Django 框架进行 web 开发么?使用过 Django 中的哪些装饰器?请给
出检测用户邮件合法性的示例代码。
78,在 javascript 中,null,undefined 有什么区别?
undefined类型只有一个值,即undefined。
当声明的变量未初始化时,该变量的默认值是undefined。
当函数无明确返回值时,返回的也是值"undefined"。
console.log(x) //x is not defined
console.log(typeof x) //undefined
function ceshe(){
var x=2;
}
console.log(ceshi()) //undefined
null类型,它只有一个专用值null,即它的字面量。值undefined实际上是从值null派生来的,因此ECMAScript把它们定义为相等的。
尽管这两个值相等,但它们的含义不同。undefined是声明了变量但未对其初始化时赋予该变量的值,null则用于表示尚未存在的对象
(在讨论typeof运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null。
79,Ajax 是什么?如何创建一个 Ajax?
答:AJAX,Asybcgronous JavaScript and XML(异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案。
异步的JavaScript:
使用【JavaScript语言】以及相关【浏览器提供类库】的功能向服务端发送请求,当服务端处理完请求之后,【自动执行某个JavaScript的回调
函数】。PS:以上请求和响应的整个过程是【偷偷】进行的,页面上无任何感知。
XML是一种标记语言,是Ajax在和后台交互时传输数据的格式之一。
80,什么是闭包(closure),为什么要用它?
答:闭包(closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使
已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。
81,
numbers = [1,2,3,4]
numbers.append([5,6,7,8])
print(len(numbers))
82,下面的程序输出结果是______________________.
x = True
y = False
z = False
if x or y and z:
print('yes')
else:
print('no')
#不加括号 and的优先级大于or,先算y and z,再算or
#yes
83, 写出下列语句输出结果,并解释为什么?
print(1 or 2) _________. #1
print(1 and 2) ___________. #2
print(1 < (2 == 2))__________. #False
print(1 < 2 == 2)_________. #True
84,写出下列输出的结果。
l1 = [i % 2 for i in range(10)]
l2 = (i % 2 for i in range(10))
print(l1) __________. #列表
print(l2)___________. #生成器
85,python2 与 python3 有哪些显著的区别?
答:
1)print不再是语句,而是函数,比如原来是print 'abc',现在是print('abc'),但是python2.6+可以使用form __future__ import print_funtion
来实现相同功能。
2)在python3中,没有旧式类,只有新式类,也就是说不用再像这样class Foobar(object):pass显示地子类化object,最好还是加上,主要区别
在于olid-style是classtype类型,而new-style是type类型。
3)原来1/2(两个整数相除),结果是0,现在是0.5了,python2.2+以上都可以使用from __futuer__ import division 实现该特性,同时注意//
取代了之前的/运算。
4)新的字符串格式化方法format取代%错误,从python2.6+开始已经在str和unicode中有该方法,同时python3依然支持%运算符。
5)xrange重命名为range,同时更改的还有一系列内置函数及方法,都返回迭代器对象,而不是列表或者元组,比如filter,map,dict,items等。
6)!=取代<>,python2页很少有人用<>,所以不算什么修改。
7)long重命名为int不完全对,python3彻底废弃了long+int双证书实现的方法,统一为int,支持高精度整数运算。
8)excrpt Exception,e变成except(Exception)as e,只有python2.5及以下版本不支持该语法,python2.6是支持的,不算新东西。
9)exec变成韩式,类似print()的变化,之前是语句。
86,什么是进程,线程,协程,什么情况下用多进程,什么情况下用多线程?什么情况下用协程呢?
答:进程就是程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。
线程的出现时为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,使到进程内并发成为可能。
进程是一个资源管理单位(容器),线程是一个最小执行单位。
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
(2)资源分配给进程,统一进程的所有线程共享该进程的所有资源。
(3)CPU分给线程,即真正在CPU上运行的是线程。
87,def f(a,b=[])这种写法中有什么陷阱?
请看上面第64题
88,给 ul 设置的样式为:背景色黑色。给 ul 下的 ul 设置的样式为:宽度 30px,背景红色。
答:style="background: black" ul ul{background: red;width: 30px;}
89,用 Bootstrap 写一个响应式的栅格,一个页面分左右两栏,大屏情况下分为 6/6,小屏情况下分为 12/12
(大屏:屏幕大于(>=992px),小屏:992px>屏幕>=768px)
答:
<div class="container">
<div class="row">
<div style="background:blue;height:1000px" class="col-md-6 col-xl-12"></div>
<div style="background:#000000;height:1000px" class="col-md-6 col-xl-12"></div>
</div>
</div>
90,写出下面输出结果__________________.
def mul():
return [lambda x: i*x for i in range(4)]
print([m(2) for m in mul()])
答:[6,6,6,6]
91,简述__new__和__init__的区别。
答:__new__返回一个没有初始化的实例化对象,而__init__只是去初始化这个空对象。
92,python 垃圾回收机制实现。
答:Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。
在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。
#encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
class ClassA():
def __init__(self):
print 'object born,id:%s'%str(hex(id(self)))
def __del__(self):
print 'object del,id:%s'%str(hex(id(self)))
def f1():
while True:
c1=ClassA()
del c1
执行f1()会循环输出这样的结果,而且进程占用的内存基本不会变动。
object born,id:0x237cf58
object del,id:0x237cf58
c1=ClassA()会创建一个对象,放在0x237cf58内存中,c1变量指向这个内存,这时候这个内存的引用计数是1
del c1后,c1变量不再指向0x237cf58内存,所以这块内存的引用计数减一,等于0,所以就销毁了这个对象,然后释放内存。
93,异步 IO select,poll 和 epoll 区别和优缺点。
详情请见https://segmentfault.com/a/1190000003063859
select:
select 函数监视的文件描述符分3类,分别是writefds、readfds、和exceptfds。调用后select函数会阻塞,直到有描述副就绪(有数据 可读、可写、或者有except),或者超时(timeout指定等待时间,如果立即返回设为null即可),函数返回。当select函数返回后,可以 通过遍历fdset,来找到就绪的描述符。
select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。select的一 个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但 是这样也会造成效率的降低。
poll:
不同与select使用三个位图来表示三个fdset的方式,poll使用一个 pollfd的指针实现。
pollfd结构包含了要监视的event和发生的event,不再使用select“参数-值”传递的方式。同时,pollfd并没有最大数量限制(但是数量过大后性能也是会下降)。 和select函数一样,poll返回后,需要轮询pollfd来获取就绪的描述符。
从上面看,select和poll都需要在返回后,通过遍历文件描述符来获取已经就绪的socket。事实上,同时连接的大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。
epoll:
epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
94,POST 和 GET 的区别和适用场景
答:
(1)GET请求的数据是放在HTTP包头中的,也就是URL之后,通常是像下面这样定义格式的,(而POST是把提交的数据放在HTTP正文中的)。
login.action?name=hyddd&password=idontknow&verify=%E4%BD%E5%A5%BD
a,以?来分割URL和数据;
b,以&来分隔参数;
c,如果数据是英文或数字,原样发送;
d,如果数据是中文或其它字符,则进行BASE64编码。
(2)GET提交的数据比较少,最多1023B,因为GET数据是附在URL之后的,而URL则会收到不同环境的限制的,比如说IE对其限制为2K+35,而POST可以传送更多的数据(理论上是没有限制的,但一般也会受不同的环境,如浏览器、操作系统、服务器处理能力等限制,IIS4可支持80KB,IIS5可支持100KB)。
(3)POST的安全性要比GET高,因为GET时,参数数据是明文传输的,而且使用GET的话,还可能造成Cross site request forgery攻击。而POST数据则可以加密的,但GET的速度可能会快些。
总的来说,get是用来查询数据,post是用来修改数据。
95,a=1,b=2,不用中间变量交换 a 和 b 的值。
a,b=b,a
编程题:
1,现有字典 myDict 和变量 oneKey,请写出从 myDict 中取出 oneKey 值的方法。
(不止一种写法,多谢加分,并请叙述不同写法的区别,myDict 中是否存在 oneKey的键值,不确定)。
答:
myDict={"oneKey":"wangwang","twoKey":18}
#方式一:如果没有oneKey会报错
print(myDict["oneKey"])
#方式二:如果没有oneKey不会报错,还可以设置没有返回的信息
print(myDict.get("oneKey","如果找不到,就返回自定义的这条信息"))
2,现有一列表 alist,请写出两种去除 alist 中重复元素的方法,其中方法一要求保持原有列表中元素的顺序,
方法二可以打乱原有列表元素的顺序。
答:
alist=[1,7,3,2,9,4,12,4,67,9,3,62,7]
#方式一:保持原有顺序
s.sort(key=alist.index)
print(s)
#方式二:打乱顺序
s=list(set(alist))
print(s)
3,请书写一个函数,用于替换某个字符串的一个或某几个字符串。函数原型 strreplace(str,oldSting,newString)。
例如:
>>pstr = "Hello World"
>>afterRepalceStr = strreplace(pstr,“World”,”Tom”)
那么 afterRepalceStr 的值为”Hello Tom”
答:
def strreplace(str),oldSting,newString):
return str.replace(oldSting,newString)
print(strreplace("Hello World","world","Tom"))
4,请写出 log 的实现(主要功能是打印函数名)
@log
def now():
print “2013-12-25”
>>>now()
输出:
call now():
2013-12-25
答:
def log(fun):
def wrapper(*args,**kwargs):
print("call now()")
return fun()
return wrapper
#log
def now():
print("2013-12-25")
now()
5,有一个数组[3,4,1,2,5,6,6,5,4,3,3]请写一个函数,找出该数组中没有重复的数的总和(上面的没有重复数的总和为 1+2=3)。
答:
l=[3,4,1,2,5,6,6,5,4,3,3]
def fun_sum(l):
count=0
for i in l:
if l.count(i)==1:
count+=1
return count
print(fun_sum(l))