Python 100道常见面试题

2017-08-22


Python 100道常见笔试题&答案

1.python中的pass语句的作用是什么?

pass语句什么也不做,一般作为占位符或者创建占位程序

2.dict中的items()方法与iteritems()方法的不同

dict.items()返回的是一个完整的列表,
dict.iteritems()返回的是一个生成器(迭代器)

3.写出尽可能的str对象的方法,并解释其作用

#方法                                      #描述    

S.capitalize()                          #返回首字母大写的字符串的副本    
S.center(width[,fillchar])              #返回一个长度为max(len(S),width),S居中,两侧fillchar填充    
S.count(sub[,start[,end]])              #计算子字符串sub的出现次数,可将搜索范围限制为S[start:end]    
S.decode([encoding[,error]])            #返回使用给定编码方式的字符串的解码版本,由error指定错误处理方式    
S.endswith(suffix[start[,end]])         #检查S是否以suffix结尾,可给定[start:end]来选择匹配的范围    
S.expandtabs([tabsize])                 #返回字符串的副本,其中tab字符会使用空格进行扩展,可选择tabsize    
S.find(sun[,start[,end]])               #返回子字符串sub的第一个索引,不存在则为-1,可选择搜索范围    
S.index(sub[,start[,end]])              #返回子字符串sub的第一个索引,不存在则引发ValueError异常.    
S.isalnum()                             #检查字符串是否由字母或数字字符组成    
S.isalpha()                             #检查字符串是否由字母字符组成    
S.isdigit()                             #检查字符串是否由数字字符组成    
S.islower()                             #检查字符串是否由小写字母组成    
S.isspace()                             #检查字符串是否由空格组成    
S.istitle()                             #检查字符串时候首字母大写    
S.isupper()                             #检查字符串是否由大写字母组成    
S.join(sequence)                        #返回其中sequence的字符串元素由S连接的字符串    
S.ljust(width[,fillchar])               #返回S副本左对齐的字符串,长度max(len(S),W),右侧fillchar填充    
S.lower()                               #返回所有字符串都为小写的副本    
S.lstrip([char])                        #向左移除所有char,默认移除(空格,tab,\n)    
S.partition(seq)                        #在字符串中搜索seq并返回    
S.replace(old,new[,max])                #将new替换olad,最多可替换max次    
S.rfind(sub[,start[,end]])              #返回sub所在的最后一个索引,不存在则为-1,可定搜索范围S[start:end]    
S.rindex(sub[,start[,end]])             #返回sub所在的最后一个索引,不存在则会引发ValueError异常。    
S.rjust(width[,fillchar])               #返回S副本右对齐的字符串,长度max(len(S),W),左侧fillchar填充    
S.rpartition(seq)                       #同Partition,但从右侧开始查找    
S.rstip([char])                         #向右移除所有char,默认移除(空格,tab,\n)    
S.rsplit(sep[,maxsplit])                #同split,但是使用maxsplit时是从右往左进行计数    
S.split(sep[,maxsplit])                 #使用sep做为分割符,可使用maxsplit指定最大切分数    
S.zfill(width)                          #在S的左侧以0填充width个字符    
S.upper()                               #返回S的副本,所有字符大写    
S.splitlines([keepends])                #返回S中所有行的列表,可选择是否包括换行符    
S.startswith(prefix[,start[,end]])      #检查S是否以prefix开始,可用[start,end]来定义范围    
S.strip([chars])                        #移除所有字符串中含chars的字符,默认移除(空格,tab,\n)    
S.swapcase()                            #返回S的副本,所有大小写交换    
S.title()                               #返回S的副本,所有单词以大写字母开头    
S.translate(table[,deletechars])        #返回S的副本,所有字符都使用table进行的转换,可选择删除出现在deletechars中的所有字符        

4.生成一个指定长度的斐波那契数列

def fibs(x):  
result = [0, 1]  
for index in range(x-2):  
    result.append(result[-2]+result[-1])  
return result  

if __name__=='__main__':  
num = input('Enter one number: ')  
print fibs(num)  

5.说明os ,sys模块不同,并列举常用的模块方法?

os.path.exists(file) 如果file存在于当前目录下,返回True,否则返回False

os.path.abspath(file) 返回file的绝对路径

os.path.dirname(file) 返回file的上级目录名

sys.path.append(path) 添加path到环境变量

6.什么是lambda函数?它有什么好处?

当程序代码很短,且该函数只使用一次,为了程序的简洁,及节省变量内存占用空间,引入了匿名函数
函数使用:  
1. 代码块重复,这时候必须考虑到函数,降低程序的冗余度  
2. 代码块复杂,这时候必须考虑到函数,降低程序的复杂度

7.输入三个整数x ,y ,z ,请把这三个数由小到大输出

def sort_int(a, b, c):
L = [a, b, c]
L.sort()
return L

x, y, z = sort_int(100, 10, 1)
print(x, y, z)

8.python实现冒泡排序

def bubble_sort(lists):
# 冒泡排序
count = len(lists)
for i in range(0, count):
    for j in range(i + 1, count):
        if lists[i] > lists[j]:
            lists[i], lists[j] = lists[j], lists[i]
return lists

9.有两个升序排列的list A 和B ,尽可能高效的方法将这个两个list合并为一个新的升序排列的list C

C=A+B
C.sort()

10.有一个list,其中的元素无重复,先由大到小而后由小到大,求出其中的最小元素,要求时间复杂度低于O(n)

11.请将十进制整数10240转换成十六进制整数

a=10240
hex(a)--->0x2800

12.给定一个长为N的,值为整数的数组int_array(如果不方便使用数组,可以用链表代替)写一段程序,在O(n)时间内找出int_array中的第二大的整数。可以使用任意程序设计语言实现。
说明:如果最大的整数在int_array中出现了不止一次,则最大的整数和第二大的整数相等。
样例数据一:
输入:[1,2,3,4,5]
输出:4
样例数据二:
输入:[5,5,4,4,3]
输出:5

13.编写个shell脚本将/SBIDATA目录下大于10K的文件转移到/SBIBAEODI目录下,按照备份的日期保存(请使用shell编写)

bin/bash

programm:

name='date + %y%m%d'
do 
    mv $filename /SBIBAEODI
done
ls -la  /SBIBAEODI

14.写一个算法,将字符串列表[“aycc”,”kh”,”llc”,”u”,”l”]通关算法处理为[
“y”,’k’,’c’,’u’,’l’],对调字符列表中的字符位置(’y’与’l’对调,’k’与’u’对调),并拼接字符列表中的字符,输出字符串,‘LUCKY’(python编写)

15.请写出一段python代码实现删除一个list里面的重复元素

>>> L1 = [4,1,3,2,3,5,1]  
>>> L2 = []  
>>> [L2.append(i) for i in L1 if i not in L2]  
>>> print L2  
[4, 1, 3, 2, 5] 

16.请实现一个实现打印当前时间的装饰器

17.请简述跨域问题,以及服务器针对跨域请求需要做什么处理

18.python是如何进行内存管理的

python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,
当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。
所有这些都是自动完成,不需要像C一样,人工干预,从而提高了程序员的效率和程序的健壮性。  

19.python里面如何实现tuple和list的转换

#From list to Tuple                   
tuple(a_list)     

#From Tuple to List  
def to_list(t):   
return [i if not isinstance(i,tuple) else to_list(i) for i in t]  

20.介绍一下except的用法和作用?

ry/except:          捕捉由PYTHON自身或写程序过程中引发的异常并恢复  
except:              捕捉所有其他异常  
except name:         只捕捉特定的异常  
except name, value:  捕捉异常及格外的数据(实例)  
except (name1,name2) 捕捉列出来的异常  
except (name1,name2),value: 捕捉任何列出的异常,并取得额外数据  
else:                如果没有引发异常就运行  
finally:             总是会运行此处代码  

21.介绍一下python下range()函数的用法?

>>> range(10)  
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  
>>> range(1, 10)  
[1, 2, 3, 4, 5, 6, 7, 8, 9]  
>>> range(0, 9, 2)  
[0, 2, 4, 6, 8]  
>>> range(99,0,-10)  
[99, 89, 79, 69, 59, 49, 39, 29, 19, 9]  
相区别的是xrange(),每次只取出一个迭代对象,如果是数据量比较大时,效率较高 

22.如何用python来进行查询和替换一个文本字符串?

可以使用sub()方法来进行查询和替换,sub方法的格式为:sub(replacement, string[, count=0])
replacement是被替换成的文本
string是需要被替换的文本
count是一个可选参数,指最大被替换的数量

23.python里面的match() 和search()的区别?

match()函数只检测RE是不是在string的开始位置匹配,search()会扫描整个string查找匹配, 
也就是说match()只有在0位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回none

24.运用python匹配HTML tag的时候,<.>和<.?>有什么区别??

前者是贪婪匹配,会从头到尾匹配 <a>xyz</a>,
而后者是非贪婪匹配,只匹配到第一个 >。

25.python里面如何生成随机数?

import random
random.random()
它会返回一个随机的0和1之间的浮点数

26.有没有一个工具可以帮助查找python的bug和进行静代码分析?

pycheck:
PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告
pylint :
Pylint是另外一个工具可以进行codingstandard检查

27.如何在一个function里面设置一个全局的变量?

global

28.单引号,双引号,三引号的区别

单引号和双引号都可以用来表示一个字符串
三引号的用来表示字符串内容

29.请自己实现一个copy函数(不能调用python的copy函数)

30.一行代码实现对列表a中的偶数位置的元素进行加3后求和

sums = sum(map(lambda x: x + 3, a[1::2]))

31.随机生成100个数(0<n<=100),如何计算得出每个数字的重复次数。输入int a [100]={1,12,53,…..}

32.什么是GIL?

线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,
说白了就是一个核只能在同一时间运行一个线程.
对于io密集型任务,python的多线程起到作用,但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。

解决办法就是多进程和下面的协程(协程也只是单CPU,但是能减小切换代价提升性能).

33.list=[-2,1,3,-6]如何实现以绝对值大小从小到大将list中内容排序

sorted(list1,key = abs)

34.简述python的is和==的区别

is是对比地址
==是对比值

35.简述read,readline和Readlines的区别

read 读取整个文件
readline 读取下一行,使用生成器方法
readlines 读取整个文件到一个迭代器以供我们遍历

36.说明创建字典的至少2种方法

1、直接创建
dict = {'name':'earth', 'port':'80'}

2、工厂方法
items=[('name','earth'),('port','80')]
dict2=dict(items)
dict1=dict((['name','earth'],['port','80']))

3、fromkeys()方法
dict1={}.fromkeys(('x','y'),-1)
dict={'x':-1,'y':-1}
dict2={}.fromkeys(('x','y'))
dict2={'x':None, 'y':None}

37.args ,*kwargs的作用是什么?如何使用?

当你不确定你的函数里将要传递多少参数时你可以用*args.

例如,它可以传递任意数量的参数:    
>>> def print_everything(*args):
    for count, thing in enumerate(args):
   print '{0}. {1}'.format(count, thing)

>>> print_everything('apple', 'banana', 'cabbage')
0. apple
1. banana
2. cabbage

相似的,**kwargs允许你使用没有事先定义的参数名:
>>> def table_things(**kwargs):
 for name, value in kwargs.items():
  print '{0} = {1}'.format(name, value)
>>> table_things(apple = 'fruit', cabbage = 'vegetable')
cabbage = vegetable
apple = fruit

*args和**kwargs可以同时在函数的定义中,但是*args必须在**kwargs前面.

38.python中的变量作用域(变量查找顺序)

Python 中,一个变量的作用域总是由在代码中被赋值的地方所决定的。

当 Python 遇到一个变量的话他会按照这样的顺序进行搜索:

本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)

39.数组和元组之间的区别是什么?

列表可以修改,而元组不可以修改
如果元组中仅有一个元素,则要在元素后加上逗号。

元组只可读不可修改。

如果程序中的数据不允许修改可用元组。

40.python都有哪些自带的数据结构?

列表,元组,字符串,bytes,bytearray,集合,字典

41.xrange 和range的区别是什么?

xrange的用法与range完全相同,所不同的是xrange生成的不是一个list,而是一个生成器。
要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。

range会直接生成一个list对象:
>>> a = range(0, 50)
 >>> print type(a)
 <type 'list'>
 >>> print a
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]

而xrange则不会直接生成一个list,而是每次调用返回其中的一个值:
>>> a = xrange(0, 50)
 >>> print type(a)
 <type 'xrange'>
 >>> print a
 xrange(50)

42.如何在python中拷贝一个对象?

标准库中的copy模块提供了两个方法来实现拷贝.
一个方法是copy,它返回和参数包含内容一样的对象.
一个方法是使用deepcopy方法,对象中的属性也被复制

43.简述python的优缺点?

优点:
简单,易学,免费、开源,可移植性,解释性,面向对象,可扩展性,丰富的库
缺点:
运行速度慢

44.写一个程序,用递归的方法计算n!

def fact(n):
  if n==1:
     return 1
    return n * fact(n - 1)

45.TCP/IP协议中各协议所在层以及他们之间的关系

46.有序列表如[1,3,5,7,9],请用二分查找返回元素所在的位置

47.用列表生成器1到100的偶数列表,并且a[50:100]返回什么?

48.将字符串倒叙,如a=’abcdefg’变成’gfedcba’

reverse

49.用最少行数计算某字符串(有只有数据和空格)中偶数的和,a=’12 21 23 22 5 67’

50.一般怎么优化响应慢的接口?

51.针对接口设计,有哪些安全设计?

52.简述爬虫的基本工作原理,目前主要的网站结构以及设计对各类结构网站的爬取方法

网络爬虫的基本工作流程如下:

1.首先选取一部分精心挑选的种子URL;

2.将这些URL放入待抓取URL队列;

3.从待抓取URL队列中取出待抓取在URL,解析DNS,并且得到主机的ip,并将URL对应的网页下载下来,存储进已下载网页库中。此外,将这些URL放进已抓取URL队列。

4.分析已抓取URL队列中的URL,分析其中的其他URL,并且将URL放入待抓取URL队列,从而进入下一个循环

53.请画出scrapy爬虫结构图,并对其进行解释

Scrapy Engine: 
负责组件之间数据的流转,当某个动作发生时触发事件

Scheduler: 
接收requests,并把他们入队,以便后续的调度

Downloader: 
负责抓取网页,并传送给引擎,之后抓取结果将传给spider

Spiders: 
用户编写的可定制化的部分,负责解析response,产生items和URL

Item Pipeline: 
负责处理item,典型的用途:清洗、验证、持久化

Downloader middlewares: 
位于引擎和下载器之间的一个钩子,处理传送到下载器的requests和传送到引擎的response(若需要在Requests到达Downloader之前或者是responses到达spiders之前做一些预处理,可以使用该中间件来完成)

Spider middlewares: 
位于引擎和抓取器之间的一个钩子,处理抓取器的输入和输出 
(在spiders产生的Items到达Item Pipeline之前做一些预处理或response到达spider之前做一些处理)

54,什么是爬取深度?什么是广度优先策略,什么是深度优先策略?scrapy如何控制爬取深度(在哪里设置,其核心的控制代码在哪里)

深度优先遍历策略是指网络爬虫会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接
宽度优先遍历策略的基本思路是,将新下载网页中发现的链接直接插入待抓取URL队列的末尾。也就是指网络爬虫会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页

55.scrapy中爬取列表的去重机制是什么?在代码中如何实现?

1、Pipleline 加入如下代码:(在数据爬完后将URL塞入redis去重)
class RedisInsert(object):       
    def process_item(self,item,spider):  
        set_redis_values_1(item['url'])  
        return item  

2、Middleware加入如下代码:(在爬数据之前查看该URL是否爬取过)

class IngoreRequestMiddleware(object):  
    def __init__(self):  
        self.middlewareLogging=getLogger("IngoreRequestMiddleware")  

    def process_request(self,request,spider):  
        if get_redis_values_1(request.url):  
            self.middlewareLogging.debug("IgnoreRequest : %s" % request.url)  
            raise IgnoreRequest("IgnoreRequest : %s" % request.url)  
        else:  
            self.middlewareLogging.debug("haveRequest : %s" % request.url)  
            return None  

56.是否使用过redis,简述redis中有哪些数据结构,并说明基本用途(至少3种)

String——字符串
Hash——字典
List——列表
Set——集合
Sorted Set——有序集合

57.爬虫程序对于服务器的要求主要在哪些方面?

58.在web服务中,想要显示只允许某一个ip访问,应该怎么实现?

59.写程序把一个单向链表顺序倒过来。(尽可能写出更多的实现方法,标出所写方法的空间和时间复杂度)

60.有一个长度为n的数组a,里面元素都是整数,现有一个整数B,写程序判断数组a中是否有两个元素的和等于B。(尽可能写出更多的实现方法,标出所写方法的空间和时间复杂度)

61.什么是缓存,在web服务中,缓存有什么作用,什么情况下要使用缓存,缓存分为几种?

web缓存的类型:
1、浏览器缓存
2、代理服务器缓存
3、网关缓存

62.什么是负载均衡,负载均衡有什么作用,有哪些负载均衡算法?

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡算法:
1.轮询法
2.随机法
3.源地址哈希法
4.加权轮询法
5.加权随机法
6.最小连接数法

63.简述对RESTful API设计规范的理解

64.简述HTTP缓存机制

65.如何实现一个可供with的语句使用的上下文管理对象

文件可以作为上下文管理器使用,它们可以关闭自身作为清理的一部分

>>> with open('text.txt') as myfile:    
...   while True:    
...     line = myfile.readline()    
...     if not line:    
...       break    
...     print line, 

66.简述python内置实现的一些设计模式

答:解释器模式,适配器模式,桥接模式,

67.简述python垃圾回收机制及如何解决循环引用

Python的GC模块主要运用了引用计数来跟踪和回收垃圾。
在引用计数的基础上,还可以通过“标记-清除”解决容器对象可能产生的循环引用的问题。
通过分代回收以空间换取时间进一步提高垃圾回收的效率

68.简述什么样的情况下会发生UnicodeDecodeError

安装模块时候发生编码错误

69.异常捕捉中except分支中raise e 改为 raise 会产生哪些变化?
raise抛出一个异常

70.给出3个你经常访问的技术网站或博客

GitHub、Stack OverFlow、CSND,oschina,博客园、SegmentFault

71.简述标准库中,functools.wraps的作用

functools.wraps 的作用是将原函数对象的指定属性复制给包装函数对象, 默认有 module、name、doc,或者通过参数选择

72.简述标准库中,functools.partial的实现思路

functools 中Partial可以用来改变一个方法默认参数
1.改变原有默认值参数的默认值
2.给原来没有默认值的参数增加默认值

73.写出一段代码实现单例模式

使用new方法

class Singleton(object):
def __new__(cls, *args, **kw):
    if not hasattr(cls, '_instance'):
        orig = super(Singleton, cls)
        cls._instance = orig.__new__(cls, *args, **kw)
    return cls._instance

class MyClass(Singleton):
    a = 1

74.用yield写出一个生成器

def cube(n):
    for i in range(n):
        yield i ** 3

    for i in cube(5):
        print i

75.@classmethod ,@staticmethod ,@property都是什么意思?

classmethod(fn)表明函数fn是类的函数而非类实例的函数
staticmethod(fn)表明函数fn是类的静态方法
@property可以实现属性的只读权限功能

76.解释一下Gevent和threading/multiprocessing的关系

77.请解释一下cookie和session的关系,以及xsrf的攻击和防范方法

session技术是要使用到cookie的,之所以出现session技术,主要是为了安全

78.函数、类方法定义中如何实现可选参数、可选关键字参数

79.解释classmethod和staticmethod的区别

@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数

80.写一段程序,包含迭代器和生成器的使用

81.如何使用匿名函数

当程序代码很短,且该函数只使用一次,为了程序的简洁,及节省变量内存占用空间,引入了匿名函数
>>> nums = range(2,20)  
>>> for i in nums:  
    nums = filter(lambda x:x==i or x % i,nums)  
>>> nums  
[2, 3, 5, 7, 11, 13, 17, 19] 

82.如何使用标准库collections中的deque?

deque 是 double-ended queue的缩写,类似于 list,不过提供了在两端插入和删除的操作。
1.appendleft 在列表左侧插入
2.popleft 弹出列表左侧的值
3.extendleft 在左侧扩展

83.标准库中的copy中的copy和deepcopy的区别

copy:浅拷贝。只拷贝父对象,不会拷贝对象的内部的子对象
deepcopy:深拷贝。拷贝对象及其子对象

84.什么是装饰器,如何使用装饰器?

装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。

85.解释with关键字的用法

with 的一般执行过程

一段基本的with表达式,其结构是这样的:

with EXPR as VAR:
    BLOCK
其中:EXPR可以是任意表达式;as VAR是可选的。其一般的执行过程是这样的:

计算EXPR,并获取一个上下文管理器。
上下文管理器的__exit()__方法被保存起来用于之后的调用。
调用上下文管理器的__enter()__方法。
如果with表达式包含as VAR,那么EXPR的返回值被赋值给VAR。
执行BLOCK中的表达式。
调用上下文管理器的__exit()__方法。如果BLOCK的执行过程中发生了一个异常导致程序退出,那么异常的type、value和traceback(即sys.exc_info()的返回值)将作为参数传递给__exit()__方法。否则,将传递三个None。

86.参数传递使用的是传递引用还是传递值?为什么?

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。

87.在类的方法定义中,‘self’是怎样的一个参数

self代表当前对象的地址。
self能避免非限定调用造成的全局变量。

88.进程和线程的区别是什么?

线程是操作系统中能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
一个线程指的是进程中一个单一顺序的控制流。
一个进程中可以并发多条线程,每条线程并行执行不同的任务

进程就是一个程序在一个数据集上的一次动态执行过程。
进程有以下三部分组成:
1,程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成。 
2,数据集:数据集则是程序在执行过程中需要的资源,比如图片、音视频、文件等。 
3,进程控制块:进程控制块是用来记录进程的外部特征,描述进程的执行变化过程,系统可以用它来控制和管理进程,它是系统感知进程存在的唯一标记。

区别:
1、运行方式不同    
    进程不能单独执行,它只是资源的集合。
    进程要操作CPU,必须要先创建一个线程。
    所有在同一个进程里的线程,是同享同一块进程所占的内存空间。
2、关系
    进程中第一个线程是主线程,主线程可以创建其他线程;其他线程也可以创建线程;线程之间是平等的。
    进程有父进程和子进程,独立的内存空间,唯一的标识符:pid
3、速度
    启动线程比启动进程快。
    运行线程和运行进程速度上是一样的,没有可比性。
    线程共享内存空间,进程的内存是独立的。

89.对list进行切片的用法

a = list[::10]   切片操作符: [],[:],[::]

90.用两种方式按行读取一个csv文件

1.使用python的csv模块
    csv.reader(filepath)
2.使用python的pandas库
    pandas.read_csv(file)        

91.简述数据库的锁机制

92.mysql有几种存储引擎,特点是什么?

存储引擎:MyISAM,InnoDB,MEMORY,MERGE

93.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹

def getfilelist(filepath, tabnum=1):  
        simplepath = os.path.split(filepath)[1]  
        returnstr = simplepath+"目录<>"+"\n"  
        returndirstr = ""  
        returnfilestr = ""  
        filelist = os.listdir(filepath)  
        for num in range(len(filelist)):  
            filename=filelist[num]  
            if os.path.isdir(filepath+"/"+filename):  
                returndirstr += "\t"*tabnum+getfilelist(filepath+"/"+filename, tabnum+1)  
            else:  
                returnfilestr += "\t"*tabnum+filename+"\n"  
        returnstr += returnfilestr+returndirstr  
        return returnstr+"\t"*tabnum+"</>\n"  

    path = raw_input("请输入文件路径:")  
    usefulpath = path.replace('\\', '/')  
    if usefulpath.endswith("/"):  
        usefulpath = usefulpath[:-1]  
    if not os.path.exists(usefulpath):  
        print "路径错误!"  
    elif not os.path.isdir(usefulpath):  
        print "输入的不是目录!"  
    else:  
        filelist = os.listdir(usefulpath)  
        o=open("test.xml","w+")  
        o.writelines(getfilelist(usefulpath))  
        o.close()  
        print "成功!请查看test.xml文件

94.python多线程与多进程的区别

多线程可以共享全局变量,多进程不能。
多线程中,所有子线程的进程号相同;
多进程中,不同的子进程进程号不同

1.多线程:
    语法
    join
    线程锁之Lock\Rlock\信号量
    将线程变为守护进程
    Event事件 
    queue队列
    生产者消费者模型

2.多进程:
    语法
    join
    进程Queue
    进程Pipe
    进程Manager
    进程同步
    进程池

95.python是如何进行类型转换的?

函数                      描述
int(x [,base ])         将x转换为一个整数
long(x [,base ])        将x转换为一个长整数
float(x )               将x转换到一个浮点数
complex(real [,imag ])  创建一个复数
str(x )                 将对象 x 转换为字符串
repr(x )                将对象 x 转换为表达式字符串
eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s )               将序列 s 转换为一个元组
list(s )                将序列 s 转换为一个列表
chr(x )                 将一个整数转换为一个字符
unichr(x )              将一个整数转换为Unicode字符
ord(x )                 将一个字符转换为它的整数值
hex(x )                 将一个整数转换为一个十六进制字符串
oct(x )                 将一个整数转换为一个八进制字符串

96.如何用python来发送邮件

python实现发送和接收邮件功能主要用到poplib和smtplib模块。
poplib用于接收邮件,而smtplib负责发送邮件。

97.python中单下划线和双下划线是什么意思?

__foo__:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突,
_foo:一种约定,用来指定变量私有.程序员用来指定私有变量的一种方式.不能用from module import * 导入,其他方面和公有一样访问;

98.urllib和urllib2的区别

urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。这意味着,你不可以伪装你的User Agent字符串等

99.get和post区别

get用于获取数据
post 用于修改数据

100.python网络爬虫所用到的网络数据包和解析数据包有哪些?

网络数据包:
requests、urllib、urllib2、httplib2

解析数据包:
BeautifulSoup、pyquery、Xpath、lxml