精心170道Python面试题_第1页
精心170道Python面试题_第2页
精心170道Python面试题_第3页
精心170道Python面试题_第4页
精心170道Python面试题_第5页
已阅读5页,还剩130页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精心整理170道Python面试题

精心整理的Python相关的基础知识,用于面试,或者平时

复习,都是很好的!废话不多说,直接开搞

由于文章过长,萝卜哥也贴心的把文章整理成了PDF文档,

在文末查看获取方式

基础篇

1.为什么学习Python

2.解释型和编译型语言的区别

3.简述下Python中的字符串、列表、元组和字典

4.简述上述数据类型的常用方法

5.简述Python中的字符串编码

6.一行代码实现数值交换

7.is和==的区别

8.Python函数中的参数类型

9.'米arg'和'**kwarg'作用

10.一行代码实现1-100之和

11.获取当前时间

12.PEP8规范

13.Python的深浅拷贝

14.查看下面代码的输出

15.可变类型与不可变类型

16.打印九九乘法表

17.filter>map、reduce的作用

18.re的match和search区别

19.面向对象中'_new_'和'_init_'区别

20.三元运算规则

21.生成随机数

22.zip函数用法

23.range和xrange的区别

24.with方法打开文件的作用

25.什么是正则的贪婪匹配

26.为什么不建议函数的默认参数传入可变对象

27.字符串转列表

28.字符串转整数

29.删除列表中的重复值

30.字符串单词统计

31.列表推导,求奇偶数

32.一行代码展开列表

33.实现二分法查找函数

34.字典和json转换

35.列表推导式、字典推导式和生成器

36.简述read^readline>readlines的区别

37.打乱一个列表

38.反转字符串

39.单下划线和双下划线的作用

40.新式类和旧式类

41.Python面向对象中的继承有什么特点

42.super函数的作用

43.类中的各种函数

44.如何判断是函数还是方法

45.isinstance的作用以及与type()的区别

46.单例模式与工厂模式

47.查看目录下的所有文件

48.计算1到5组成的互不重复的三位数

49.去除字符串首尾空格

50.去除字符串中间的空格

51.字符串格式化方式

52.将”helloworld”转换为首字母大写"HelloWorld”(不使用

title函数)

53.一行代码转换列表中的整数为字符串

54.合并两个元组到字典

55.给出如下代码的输入,并简单解释

56.Python中的反射

57.实现一个简单的API

58.metaclass兀类

59.sort和sorted的区别

60.Python中的GIL

61.产生8位随机密码

62.输出原始字符

63.列表内,字典按照value大小排序

64.简述any()和all()方法

65.反转整数

66.函数式编程

67.简述闭包

68.简述装饰器

69.协程的优点

70.实现一个斐波那契数列

71.正则切分字符串

72.yield用法

73.冒泡排序

74快速排序

75.requests简介

76.比较两个json数据是否相等

77.读取键盘输入

78.enumerate

79.pass语句

80.正则匹配邮箱

81.统计字符串中大写字母的数量

82.json序列化时保留中文

83.简述继承

84.什么是猴子补丁

85.help()函数和dir()函数

86.解释Python中的和'**'运算符

87.主动抛出异常

88.tuple和list转换

89.简述断言

9。.什么是异步非阻塞

91.什么是负索引

92.退出Python后,内存是否全部释放

93.Flask和Django的异同

94.创建删除操作系统上的文件

95.简述logging模块

96.统计字符串中单词出现次数

97.正则plie的作用

98.tryexceptelsefinally的意义

99.反转列表

100.字符串中数字替换

综合篇:网络编程

101.简述OSI七层协议

102.三次握手、四次挥手的流程

103.什么是C/S和B/S架构

104.TCP和UDP的区别

105.局域网和广域网

106.arp协议

107.什么是socket?简述基于TCP协议的套接字通信流程

108.简述进程、线程、协程的区别以及应用场景

109.如何使用线程池和进程池

110.进程之间如何进行通信

111.进程锁和线程锁

112.什么是并发和并行

113.threading.local的作用

114.什么是域名解析

115.LVS是什么及作用

116.Nginx的作用

117.keepalived及HAProxy

118.什么是rpc

119.从浏览器输入一个网址到展示网址页面的过程

120.什么是cdn

综合篇:数据库和框架

121.列举常见的数据库

122.数据库设计三大范式

123.什么是数据库事务

124.MySQL索引种类

125.数据库设计中一对多和多对多的应用场景

126.简述触发器、函数、视图、存储过程

127.常用SQL语句

128.主键和外键的区别

129.如何开启MySQL慢日志查询

130.MySQL数据库备份命令

131.char和varchar的区别

132.最左前缀原则

133.无法命中索引的情况

134.数据库读写分离

135.数据库分库分表

136.redis和memcachecl比较

137.redis中数据库默认是多少个db及作用

138.redis有哪几种持久化策略

139.redis支持的过期策略

140.如何保证redis中的数据都是热点数据

141.Python操作redis

142.基于redis实现发布和订阅

143.如何高效的找到redis中的某个KEY

144.基于redis实现先进先出、后进先出及优先级队列

145.redis如何实现主从复制

146.循环获取redis中某个非常大的列表数据

147.redis中的watch的命令的作用

148.redis分布式锁

149.http协议

150.uwsgi,uWSGI和WSGI的区别

151.HTTP状态码

152.HTTP常见请求方式

153.响应式布局

154.实现一个简单的AJAX请求

155.同源策略

156.什么是CORS

157.什么是CSRF

158.前端实现轮询、长轮询

159.简述MVC和MTV

160.接口的幕等性

161.Flask框架的优势

162.什么是ORM

163.PV、UV的含义

164.supervisor的作用

165.使用ORM和原生SQL的优缺点

166.列举一些cljango的内置组件

167.列举Django中执行原生sql的方法

168.cookie和session的区别

169.beautifulsoup模块的作用

170.Selenium模块简述

基础篇

1.为什么学习Python

Python语言简单易懂,上手容易,随着AI风潮,越来越火

2.解释型和编译型语言的区别

编译型语言:把做好的源程序全部编译成二进制的可运行程

序。然后,可直接运行这个程序。如:C,C++解释型语言:

把做好的源程序翻译一句,然后执行一句,直至结束!如:

Python,(Java有些特殊,java程序也需要编译,但是没有

直接编译称为机器语言,而是编译称为字节码,然后用解释

方式执行字节码。)

3.简述下Python中的字符串、列表、元组和

字符串(str):字符串是用引号括起来的任意文本,是编程

语言中最常用的数据类型。列表(list):列表是有序的集合,

可以向其中添加或删除元素。元组(tuple):元组也是有序

集合,但是是无法修改的。即元组是不可变的。字典(diet):

字典是无序的集合,是由key-value组成的。集合(set):

是一组key的集合,每个元素都是唯一,不重复且无序的。

4.简述上述数据类型的常用方法

字符串:

切片mystr='luobodazahui'mystr[l:3]output'no'

2.

3.

formatmystr2="welcometoluobodazahui,dear{name}',

mystrZ.fb门nat(name="baby")output'welcometoluobodazahui,

dearbaby,

4.

5.

join可以用来连接字符串,将字符串、元组、列表中的元素

以指定的字符(分隔符)连接生成一个新的字符串。mylist二

'bo','da','za','hui'2jmystrS=-'.join(mylist)print(mystrS)

outout'luo-bo-da-za-hui'

6.

7.

replaceString.replace(old,new,count)将字符串中的old字符

替换为New字符,count为替换的个数mystr4=

'luobodazahui-haha'print(mystr4.replace('haha','good'))

8.

outputluobodazahui-good

1.split切割字符串,得到一个列表

|mystr5='luobo,dazahuigood

print(mystr5.splil。)|

print(mystr5.splil('h'))|

print(mystr5.splil(7))|

output

)o,daza*,*ui|

[luobo'Jdazahuigood']

列表:

1.切片同字符串

2.append和extend向列表中国添加兀素

[mylistl.append(mylist2)|

|mylist3.extend(mylis⑵]

outout

1.删除元素del:根据下标进行删除pop:删除最后一个

元素remove:根据元素的值进行删除

向dist4=[履,b,七',d]|

debnylist4f(j

print(mylist4)|

ii「:

|mylist4.remove('c')|

print(rnylist4)^^B

output

b,'c',d]

1.元素排序sort:是将list按特定顺序重新排列,默认为

由小到大,参数reverse=True可改为倒序,由大到小。

reverse:是将list逆置

|mylist5.sortQ^^^^B

|my1ist5.reverseQ^^B

卜门nilnnqi、l5)唯■徐■

output

U,2,3,4,5]|

I-Mil

字典:

1.清空字典dict.clear()

Wict^^e^^e^2)

1

output

1.指定删除使用pop方法来指定删除字典中的某一项

[ictl={key「:l,'key2,:2}

output

{key2':2}

1.遍历字典

klict^^lceW^^Jkey2^2}^H

|mykey=[keyforkeyindiet对

|myvalue=[valueforvalueindict2.values()]|

|key_value=[(k,v)fork,vindict2.items()])

output

gey^ey2]^^B

1.fromkeys用于创建一个新字典,以序列中元素做字典的

键,value为字典所有键对应的初始值

[keys=「zhangfei;'guanyu;'liubei;'zhaoyun']|

output

'zhangfei':0,'guanyu':0,'liubei':0,'zhaoyurf:0}

5.简述Python中的字符串编码

计算机在最初的设计中,采用了8个比特(bit)作为一个字

节(byte)的方式。一个字节能表示的最大的整数就是255

(二进制11111111二十进制255),如果要表示更大的整数,

就必须用更多的字节。最早,计算机只有ASCII编码,即只

包含大小写英文字母、数字和一些符号,这些对于其他语言,

如中文,日文显然是不够用的。后来又发明了Unicode,

Unicode把所有语言都统一到一套编码里,这样就不会再有

乱码问题了。当需要保存到硬盘或者需要传输的时候,就转

换为UTF-8编码。UTF-8是隶属于Unicode的可变长的编

码方式。在Python中,以Unicode方式编码的字符串,可

以使用encode()方法来编码成指定的bytes,也可以通过

decodeQ方法来把bytes编码成字符串。encode

中文”.encode('utf-8')

output

b,\xe4\xb8\xad\xe6\x96\x871

decode

b*\xe4\xb8\xad\xe6\x96\x87,.decode(,utf-8,)

output

中文

6.一行代码实现数值交换

la=1

|3a,b=b,a|

|4print(a,国

output

121

7.is和二二的区别

先来看个例子

|Kint(cis(1)|

brint(c==d)|

print(cise)・

print(c二二e)|

output

fnuel

二二是比较操作符,只是判断对象的值(value)是否一致,

而is则判断的是对象之间的身份(内存地址)是否一致。

对象的身份,可以通过id()方法来查看

output

B8^808d

K855828S

可以看出,只有id一致时,is比较才会返回True,而当

value一致时,:——比较就会返回True

8.Python函数中的参数类型

位置参数,默认参数,可变参数,关键字参数

允许我们在调用函数的时候传入多个实参

|deftest(*arg,**kwarg):・

|if

test('ni','hao',key='world')[

output

[kearg:{'key':'world'}

可以看出,*arg会把位置参数转化为tuple**kwarg会把关键

字参数转化为diet

10.一行代码实现1-100之和

|sum(range(l,101)

11.获取当前时间

[import

|print(datetime.datetim6.now(5)^^^^^^^^^B

output

|2019-06-0718:12:11.16533(

P01WS)^8JTH^^B

12.PEP8规范

简单列举10条:尽量以免单独使用小写字母T,大写字母,O)

以及大写字母T等容易混淆的字母。函数命名使用全部小写

的方式,可以使用下划线。常量命名使用全部大写的方式,

可以使用下划线。使用has或is前缀命名布尔元素,如:

is_connect二True;has_member=False不要在行尾加分号,

也不要用分号将两条命令放在同一行。不要使用反斜杠连接

行。顶级定义之间空2行,方法定义之间空1行,顶级定义

之间空两行。如果一个类不继承自其它类,就显式的从object

继承。内部使用的类、方法或变量前,需加前缀—表明此为内

部使用的。要用断言来实现静态类型检测。

13.Python的深浅拷贝

浅拷贝

|list2=copy.copy(listl)|

|list2,appendCa5^^^B

IprinKlistIJist2)^HB

output

『1,2,3,[1,2,'a']][1,2,3,[1,2,'a'],'a']|

能够看出,浅拷贝只成功”独立“拷贝了列表的外层,而列表

的内层列表,还是共享的

深拷贝

|list3=copy.deepcopy(list1)|

|list3.appendCa^^^^^^^1

卜门nl(li、iLli、[3

output

,2,3,[1,2]]n,2,3JL2,'a'],'a']|

深拷贝使得两个列表完全独立开来,每一个列表的操作,都

不会影响到另一个

14.查看下面代码的输出

pefnum():

return[lambdax:i*xforiinrange(4)]]

1)min

output

『3,3,3,3]|

通过运行结果,可以看出i的取值为3,很神奇

15.可变类型与不可变类型

可变数据类型:list、dict>set

不可变数据类型:int/float、str>tuple

16.打印九九乘法表

|foriinrange(l,

|forjinrange(1,i+1

output

1*1=1

2*1=22*2=4

^^9*^89*^79*4^69*^59^=5^^=639^=729*9=81

print函数,默认是会换行的,其有一个默认参数end,如果

像例子中,我们把end参数显示的置为"",那么print函数

执行完后,就不会换行了,这样就达到了九九乘法表的效果

T

17.filter>map、reduce的作用

filter函数用于过滤序列,它接收一个函数和一个序列,把函

数作用在序列的每个元素上,然后根据返回值是True还是

False决定保留还是丢弃该元素

|list(filter(lambdax:x%2二二1,mylistH

output

1,3,5,7,幻

保留奇数列表

map函数传入一个函数和一个序列,并把函数作用到序列的

每个元素上,返回一个可迭代对象

|list(map(lambdax:x*2,mylist))

output

『2,4,6,8,10,12,14,16,18]|

reduce函数用于递归计算,同样需要传入一个函数和一个序

列,并把函数和序列元素的计算结果与下一个元素进行计算

,educe(lambdax,y:x+y,range。01))|

output

505(

可以看出,上面的三个函数与匿名函数相结合使用,可以写

出强大简洁的代码

18.re的match和search区别

match。函数只检测要匹配的字符是不是在string的开始位

置匹配,search。会扫描整个string查找匹配

19.面向对象中_new—和—init

_new_是在实例创建之前被调用的,因为它的任务就是创建

实例然后返回该实例对象,是个静态方法。_init_是当实例

对象创建完成后被调用的,然后设置对象属性的一些初始

值,通常用在初始化一个类实例的时候,是一个实例方法

1、_new_至少要有一个参数cis,代表当前类,此参数在实

例化时由Python解释器自动识别。2、—new—必须要有返

回值,返回实例化出来的实例,这点在自己实现_new_时要

特别注意,可以return父类(通过super(当前类名,cis))

—new—出来的实例,或者直接是object的—new—出来的实

例。3、_init_有一个参数self,就是这个_new_返回的实例,

_init_在_new_的基础上可以完成一些其它初始化的动作,

_init_不需要返回值。4、如果_new_创建的是当前类的实

例,会自动调用_init_函数,通过return语句里面调用的

_new_函数的第一个参数是cis来保证是当前类实例,如果

是其他类的类名,;那么实际创建返回的就是其他类的实例,

其实就不会调用当前类的_init_函数,也不会调用其他类的

_init_函数

20.三元运算规则

M—MW

output

21.生成随机数

print(random.randint(1,100))|

print(random.unilbrm(1.5.))■

output

0.03765019937131564

1.8458555362279228

22.zip函数用法

zip()函数将可迭代的对象作为参数,将对象中对应的元素打

包成一个个元组,然后返回由这些元组组成的列表

卜、H/11山、।!、m)腐■■,^^亶

output

■'zhangfei;0),('guanyu:3),('liubei:2),('zhaoyun',4)]|

23.range和xrange的区别

range([startjstop],step]),根据start与stop指定的范围以

及step设定的步长,生成一个序列。而xrange生成一个生

成器,可以很大的节约内存

24.with方法打开文件的作用

开文件在进行读写的时候可能会出现一些异常状况,如果按

照常规的f.open写法,我们需要try,except,finally,做异常

判断,并且文件最终不管遇到什么情况,都要执行finally

f.close()关闭文件,with方法帮我们实现了finally中f.close

25.什么是正则的贪婪匹配

Python中默认是贪婪匹配模式

贪婪模式:正则表达式一般趋向于最大长度匹配

非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的

匹配

26.为什么不建议函数的默认参数传入可变对象

例如:

denest(L=n)^^B

|L.appendCtest)|

output

|test()#[test;test』

默认参数是一个列表,是可变对象口,Python在函数定义的

时候,默认参数L的值就被计算出来了,是口,每次调用函

数,如果L的值变了,那么下次调用时,默认参数的值就已

经不再是口了

27.字符串转列表

mysti^^K23j

|mystT.split(',')[

output

28.字符串转整数

|list(map(lambdax:im(x),mylist))|

output

1,2,3]

29.删除列表中的重复值

|list(sct(in

30.字符串单词统计

[fromcollectionsimport

|mystr='sdfsfsfsdfsd^ere^rhrgege.sdfweisfsdfe]

'r':3,

31.列表推导,求奇偶数

|[xforxinrange(lO)ifx%2==1

output

L3,5,7,91

32.一行代码展开列表

output

|[1,2,3,4,5,6]|

33.实现二分法查找函数

二分查找算法也称折半查找,基本思想就是折半,对比大小

后再折半查找,必须是有序序列才可以使用二分查找

递归算法

Idefbinary_search(data,

|return

|!..■:!ii->inaiA_searcii!diHa|:inid|,ileir.J

|returnbinary_search(data[mid+1:],item)|

|return

binarysearch(listl,999)

非递归算法

defbinary_search(data,item):|

n=len(data)^^^^^B

last=n-

whilefirst<=last:^^[

mid=(first+last)〃:|

ifdatafmid]==item:|

returnTrue^^^B

elifdata[mid]>item:|

last=mid-1

else:

first=mid+1

|return

|binary_search(listl,99)|

34.字典和json转换

字典转json

importjson

|dictl={'zhangfei':l,"liubei”:2,“guanyu“:4,“zhaoyun":3}|

|myjson=json.dumps(dictl)|

output]

dic〔j、(巾」ckn〕、卜川

invdict

output

'zhangfei':1,'liubei':2,'guanyu':4,'zhaoyun':3}

35.列表推导式、字典推导式和生成器

|import

|ge_list=(iforiin

output

列表推导式[0,1,2,3,4,5,6,7,8,9](class'list',

上成器(generatorobject<genexpr>at0x0139F070>|

36.简述read、readline>readlines的区别

read读取整个文件

readline读取下一行,使用生成器方法

readlines读取整个文件到一个迭代器以供我们遍历

37.打乱一个列表

|random.shuffle(list2)|

「门:山—

output

『4,6,5,1,2,31

38.反转字符串

卜皿二'luobodazahui

output

iuhazadoboul

39.单下划线和双下划线的作用

_foo_:一种约定,Python内部的名字,用来区别其他用户

自定义的命名,以防冲突,就是例如_init_(),_del_(),_calL_()

些特殊方法

_foo:一种约定,用来指定变量私有。不能用frommodule

import米导入,其他方面和公有变量一样访问

—f00:这个有真正的意义:解析器用,屈$惘!116—foo来代替这

个名字,以区别和其他类相同的命名,它无法直接像公有成

员一样随便访问,通过对象名.一类名—XXX这样的方式可以访

4。.新式类和旧式类

a.在python里凡是继承了object的类,都是新式类

b.Pythons里只有新式类

c.Pythons里面继承object的是新式类,没有写父类的是经

典类

d.经典类目前在Python里基本没有应用

41.Python面向对象中的继承有什么特点

a.同时支持单继承与多继承,当只有一个父类时为单继承,

当存在多个父类时为多继承

b.子类会继承父类所有的属性和方法,子类也可以覆盖父类

同名的变量和方法

c.在继承中基类的构造(_init_())方法不会被自动调用,

它需要在其派生类的构造中专门调用

d.在调用基类的方法时,需要加上基类的类名前缀,且需要

带上self参数变量。区别于在类中调用普通函数时并不需要

带上self参数

42.super函数的作用

super()函数是用于调用父类(超类)的一个方法

class

class

super(B,self).funcA()

|ins.funcA_in_B0|

Hns^hincCO^^H

output

thisisfunc囚

thisisfuncC

43.类中的各种函数

主要分为实例方法、类方法和静态方法

实例方法

定义:第一个参数必须是实例对象,该参数名一般约定为

"self,通过它来传递实例的属性和方法(也可以传类的属性

和方法)

调用:只能由实例对象调用

类方法

定义:使用装饰器@classmethod。第一个参数必须是当前类

对象,该参数名一般约定为“cis”,通过它来传递类的属性和

方法(不能传实例的属性和方法)

调用:实例对象和类对象都可以调用

静态方法

定义:使用装饰器@staticmethod。参数随意,没有“self和“c】s”

参数,但是方法体中不能使用类或实例的任何属性和方法

调用:实例对象和类对象都可以调用

静态方法是类中的函数,不需要实例。静态方法主要是用来

存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身

没有交互。即在静态方法中,不会涉及到类中的方法和属性

的操作。可以理解为将静态方法存在此类的名称空间中

类方法是将类本身作为对象进行操作的方法。他和静态方法

的区别在于:不管这个方式是从实例调用还是从类调用,它

都用第一个参数把类传递过来

44.如何判断是函数还是方法

与类和实例无绑定关系的function都属于函数(function)

与类和实例有绑定关系的function都属于方法(method)

普通函数:

Iy、T」「1

|@staticmethod^^^^^^^M

|@classmethod^^^^^^^M

|deffunc4(cls)i^^^^^^^M

people=

|‘门「」1Ii「

卜「in〔(I-pk.「um、4

output

kbounchrietho^eopleifunc^^^^naii^JPeopl^bjec^UkO^BSCQO^J

〈boundmclhodPeople.func4of〈class_main_.Peoplc'»^mMMMH|

45.isinstance的作用以及与type()的区别

isinstance()函数来判断一个对象是否是一个已知的类型,类

似type()

区别:

type()不会认为子类是一种父类类型,不考虑继承关系

isinstance()会认为子类是一种父类类型,考虑继承关系

classA(object):^^M

class

print(isinstance(b,A))|

l"1L\-d:「\).

p「int(type(b)=二A),.

output

fTrue|

ruc[

True]

Esd

46.单例模式与工厂模式

单例模式:主要目的是确保某一个类只有一个实例存在

工厂模式:包涵一个超类,这个超类提供一个抽象化的接口

来创建一个特定类型的对象,而不是决定哪个对象可以被创

47.查看目录下的所有文件

〔import

|print(os.listdir('.,))l

48.计算1到5组成的互不重复的三位数

#1到5组成的4:不重复的三位

forjinrange(l,6):M

forzinrange。,豆

print(”%s%s%s”%(i,j,z))|

output

49.去除字符串首尾空格

g^^^^Tell^iihao

「「I,7门「

output

,hellonihaol

50.去除字符串中间的空格

str2="helloyouaregood

■■

output

|hcH()y()ua「cgs)d.

I'helloyouaregood'l

51.字符串格式化方式

i,使用%操作符

output

rhi^^b^Python^^^^B

ThisisforPython,andYou|

1.str.format

在Pythons中,引入了这个新的字符串格式化方法

print("Thisis{name},hopeyoucan{do}”.format(name="zhouluob”,do="like"))|

output

[Thisismychat|

Thisiszhouluob,hopeyoucanlike

1.f-strings

在Python3-6中,引入了这个新的字符串格式化方法

print(f'hello{name}”)

output

helloluobodazahui

一个复杂些的例子:

|defmytest(name,

|returnf”helk){name},youare{age}yearsold?

output

|helloluobo,youare20yearsold!|

52.将“helloworld”转换为首字母大写“Hello

World”(不使用title函数)

output

HelloWorlcj

meH^orkll

53.一行代码转换列表中的整数为字符串

如:口,2,刃->[叮",“2“,“31

|list(map(lambdax:str(x),listl))|

output

54.合并两个元组到字典

如:("zhangfei'*,"guanyu"),(66,80)->{'zhangfei':66,'guanyu':

80}

^^^zhangfeT/^uanyu"

1#c;

output

'zhangfei':66,'guanyu':80}

55.给出如下代码的输入,并简单解释

例子1:

|a=(l,2,3,[4,5,6,7],8)|

的同0

output

|TypeErrorTraceback(mostrecentcalllast)

<i”[hcm-inpu[-35-59469d550cb()〉invmodu

FypeError:'tuple'objectdoesnotsupportitemassignment]

例子2:

output

|(1,2,3,[4,5,2,7],8)|

从例子1的报错中也可以看出,tuple是不可变类型,不能改

变tuple里的元素,例子2中,list是可变类型,改变其元

素是允许的

56.Python中的反射

反射就是通过字符串的形式,导入模块;通过字符串的形式,

去模块寻找指定函数,并执行。利用字符串的形式去对象(模

块)中操作(查找/获取/删除/添加)成员,一种基于字符

串的事件驱动!

简单理解就是用来判断某个字符串是什么,是变量还是方法

|classNewClass(object):^^^^^^M

|def_init_(self,name,

|二

|def

|print(fMynameis{}')|

|print(fIama{

|print(gctaHr(pcoplc、

output

Truej

luobq

即1

getattr,hasattr,setattr,delattr对模块的修改都在内存中进行,

并不会影响文件中真实内容

57.实现一个简单的API

使用flask构造web服务器

IromflaskiiriportFlask,rcquc[U

|def

|■result=request.geIt_json()^^B

58.metaclass兀类

类与实例:

首先定义类以后,就可以根据这个类创建出实例,所以:先

定义类,然后创建实例

类与元类:

先定义元类,根据metaclass创建出类,所以:先定义

metaclass,然后创建类

classMyMetaclass(type):

def_new_(cis,class_name,class_parents,class_attr):

class_attr['print']="thisismymetaclass'ssubclass%s"%class_name|

returntype.—new—(cis,class_name,class_parents,class_attr)

classMyNewclass(obiect,metaclass=MyMetaclass):

pass

|myinstance=MyNewclass()|

output

「thisismymetaclass'ssubclassMyNewclass”

59.sort和sorted的区别

sort()是可变对象列表(list)的方法,无参数,无返回值,

sort()会改变可变对象

Rictl='test2':2}

1H8I-HBM

|print(listl.sort()

output

NoneB

sorted()是产生一个新的对象。sorted(L)返回一个排序后的

L,不改变原始的L,sorted。适用于任何可迭代容器

Hictl=lest2':2}

listl=[2,1,3]

)rint(sorted(dict1))print(sorted(list1))|

output

□,2,3]

60.Python中的GIL

GIL是Python的全局解释器锁,同一进程中假如有多个线

程运行,一个线程在运行Python程序的时候会占用Python

解释器(加了一把锁即GIL),使该进程内的其他线程无法

运行,等该线程运行完后其他线程才能运行。如果线程运行

过程中遇到耗时操作,则解释器锁解开,使其他线程运行。

所以在多线程中,线程的运行仍是有先后顺序的,并不是同

时进行

61.产生8位随机密码

|import

1.join(random.choice(string.printable[:-7])foriinrange(5|

output

|,d5ANdNJp||

62.输出原始字符

print(rhello\nwoiid')|

output

■■

63.列表内,字典按照value大小排序

^^fname^liubef/age^3^^B

|sort6d(listl,key=lambdax:x「age'])|

output

|{'name,:'guanyiT,'age,:29},・

64.简述any()和all()方法

all如果存在0NullFalse返回False,否则返回True;any

如果都是0,None,False,Null时,返回True

print(any([O,None,False]))|

output

ralsd

Falsq

65.反转整数

Idefreverse_int(x):^^^B

|ifnotisinstance(x,int)

|returnFals^^^^M

Itmp=str(x)^^^^^M

|tmp=

|returnint(tmp)^^B

|tmp=tmp[l:][::-1]■

Ix=int(tmp)^^^^J

output

-73832

首先判断是否是整数,再判断是否是一位数字,最后再判断

是不是负数

66.函数式编程

函数式编程是一种抽象程度很高的编程范式,纯粹的函数式

编程语言编写的函数没有变量,因此,任意一个函数,只要

输入是确定的,输出就是确定的,这种纯函数称之为没有副

作用。而允许使用变量的程序设计语言,由于函数内部的变

量状态不确定,同样的输入,可能得到不同的输出,因此,

这种函数是有副作用的。由于Python允许使用变量,因此,

Python不是纯函数式编程语言

函数式编程的一个特点就是,允许把函数本身作为参数传入

另一个函数,还允许返回一个函数!

函数作为返回值例子:

|defsum(*args):^^M

|definner_sum()iB

|foriinargs:^^[

■M||

Ireturn

|i.

|mysum=sum(2,4,6)|

|print(type(mysum))B

output

kclass'function'^

67.简述闭包

如果在一个内部函数里,对在外部作用域(但不是在全局作

用域)的变量进行引用,那么内部函数就被认为是闭包

(closure)附上函数作用域图片

闭包特点

1.必须有一个内嵌函数

2.内嵌函数必须引用外部函数中的变量

3.外部函数的返回值必须是内嵌函数

68.简述装饰器

装饰器是一种特殊的闭包,就是在闭包的基础上传递了一个

函数,然后覆盖原来函数的执行入口,以后调用这个函数的

时候,就可以额外实现一些功能了

一个打印log的例子:

|import

|def

|definn6r_log(*args,

|print("CaU:{}".format(func.—name))|

HIE「!.」一,嘴

imer()

output

H56O17UOS28365

本质上,decorator就是一个返回函数的高阶函数

69.协程的优点

子程序切换不是线程切换,而是由程序自身控制

没有线程切换的开销,和多线程比,线程数量越多,协程的

性能优势就越明显

不需要多线程的锁机制,因为只有一个线程,也不存在同时

写变量冲突,在协程中控制共享资源不加锁

70.实现一个斐波那契数列

斐波那契数列:

又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、

8、13、21、34、……在数学上,斐波纳契数列以如下被以

递归的方法定义:F(l)=l,F(2)=l,F(n)=F(n-l)+F(n-2)(n>=2,

nGN*)

生成器法:

ifnotisinstance(n,int)or(abs(n)!=n):

while

a,b=

yield

|[iforiinfib(10)]|

output

In,1,2,3,5,8,13,21,34,55]|

递归法:

ifnotisinstance(n,int)or(abs(n)!=n):|

return

return

『fib(i)foriinrange(l,11)]|

output

1,1,2,3,5,8,13,21,34,55]

71.正则切分字符串

tri='hellowo「ld:kiobodazahtd]

,'

「csult二rc.spli1(r:|[sW

)rint(result)

output

『hello'Jworld','luobo'Jdazahui]

72.yield用法

yield是用来生成迭代器的语法,在函数中,如果包含了

yield,那么这个函数就是一个迭代器。当代码执行至yield

时,就会中断代码执行,直到程序调用next()函数时,才会

在上次yield的地方继续执行

^mntCstarnes^ield^

|while

|result二yield

|print(”result:\result

I「(”、MJ

print(next(g)j

print(next(g))|

output

Harttestyield|

可以看到,第一个调用next()函数,程序只执行到了"result

=yield5n这里,同时由于yield中断了程序,所以result也

没有被赋值,所以第二次执行next()时,result是None

73.冒泡排序

defpaixu(data,reverse=False):^^^^^^^^^B

ifnot

foriinrange(len(data)

forjinrange(len(data)-1-

「()「iin「;ingc("((Mla)-1

forjinrange(len(data)-1・i):|

^^^^dataH]^ata^^^^ata^^^ata[jj

print(paixu(listl,reverse=True))|

output

HWdldldlt烟I

74.快速排序

快排的思想:首先任意选取一个数据(通常选用数组的第一

个数)作为关键数据,然后将所有比它小的数都放到它前面,

所有比它大的数都放到它后面,这个过程称为一趟快速排

序,之后再递归排序两边的数据

挑选基准值:从数列中挑出一个元素,称为“基准"(pivot)

分割:重新排序数列,所有比基准值小的元素摆放在基准前

面,所有比基准值大的元素摆在基准后面(与基准值相等的

数可以到任何一边)

在这个分割结束之后,对基准值的排序就已经完成

递归排序子序列:递归地将小于基准值元素的子序列和大于

基准值元素的子序列排序

|listl=[8,5,1,3,2,10,11,4,12,20],

|def

|pivot二arr[high]

|forjinrange(Iow,

|arr[i+l],arr[high]-arr[high],arr[i+l]

|return

|defquicksort(arr

|pi二partition(arr,low,high)

|quickso「l(aiT.pi+1.high)

huicksort(listl,0,]en(listl)・l)|

print(listl)

output

|[1,2,3,4,5,8,10,11,12,201

75.requests简介

该库是发起HTTP请求的强大类库,调用简单,功能强大

importrequests)

url="http:〃www.luobodazahui.top”

response二requests.get(url)

response.encoding="ut18”

html二】esponse.text

binary_content=response.content

raw=requests.get(url,stream二True)

,二「cqucsls.gcl(u「Lheaders二header

cookies={"cookie“:”#yourcookie"}|

r=requests.get(url,cookies=cookies)

76.比较两个json数据是否相等

dictl={"zhangfei11:12,Hguanyun:13,nliubein:1

dict2={"zhangfei”:12,“guanyu“:13,"liubei":18}

defcompare_dict(dictl,

issame=

forkin

issame.append(2)^^^^^^^^^^^^^M

issame

print(

ifsum_6xcept二=sum_actually:^^^^^^^^^B

print(nthistwodietare

print。thistwodietarenotsame!

returnFalse

|test二compare_dict(dictl,dict2)|

output

rthistwodietaresame!

77.读取键盘输入

[nput()函数■

Heffo「input():|

print("yourinputtextis:“,input_text)|

|forinput()|

output

lyourinputtextis:heHo|

78.enumerate

enumerateQ函数用于将一个可遍历的数据对象(如列表、元

组或字符串)组合为一个索引序列,同时列出数据和数据下

标,一般用在for循环当中

|fori,enuinenumerate(dataiy^B

print(i,enu)|

output

pass是空语句,是为了保持程序结构的完整性。pass不做任

何事情,一般用做占位语句

defforpass(n):

卜si〕ri、、(i)■■■

80.正则匹配邮箱

bremailemail

print(”%s是符合规定的邮件地址,匹配后结果是:%s“%(emailjet.group。))

output

.」「,一

81.统计字符串中大写字母的数量

|str2,werrQWSDdiWuW||

|counter=

|foriin

|ifi.isupper():^^^^^M

Icoi!i)!cr-=

Drint(counter)

output

82.json序列化时保留中文

普通序列化:

|import

Hictl_new二json.dumps(dictl),

|print(dictlLnew)^^^^^^^^B

output

{"name":”\u841d\u535c","age":18}

保留中文

|import

|dictl_new二json.dumps(dictl,ensure_ascii=False)|

mnt(dictl_new)

output

{"name":"萝卜","age":18}

83.简述继承

一个类继承自另一个类,也可以说是一个孩子类/派生类/子

类,继承自父类/基类/超类,同时获取所有的类成员(属性

和方法)

继承使我们可以重用代码,并且还可以更方便地创建和维护

代码

Python支持以下类型的继承:

单继承-一个子类类继承自单个基类

多重继承-一个子类继承自多个基类

多级继承-一个子类继承自一个基类,而基类继承自另一个

基类

分层继承-多个子类继承自同一个基类

混合继承-两种或两种以上继承类型的组合

84.什么是猴子补丁

猴子补丁是指在运行时动态修改类和模块

猴子补丁主要有以下几个用处:

在运行时替换方法、属性等

在不修改第三方代码的情况下增加原来不支持的功能

在运行时为内存中的对象增加patch而不是在磁盘的源代

码中增加

85.help()函数和dir()函数

help()函数返回帮助文档和参数说明:

|help(dict)|

output

Helponclassdietinmodulebuiltins:|

classdict(object))

|dict()->newempty

|dicl(rmipping)-〉newdiclionai〉inili”i/cd「isnamiippingobjccl'、,

|(key,value)

|dicl(imblc)-〉newdicli()rKiryiniti;ili/cd心i「\

dict(**kwargs)・>newdictionaryinitializedwiththename二valuepairs|

|inthekeywordargumentlist.Forexample:dict(one=l,two=2)・

dir()函数返回对象中的所有成员(任何类型)

dir(dict)

output

contains.

.delattr_

delitem.

86.解释Python中的//,%而米米运算符

〃运算符执行地板除法,返回结果的整数部分(向下取整)

%是取模符号,返回除法后的余数

**符号表不取幕.a**b返回a的b次方

print(5//3)l

print(5/3)B

pHnt(5**31

output

1.6666666666666667

125

87.主动抛出异常

使用raise

peftest_raise(n):^^^^B

ifnolisinstance(n,int):|

raiseException('notainttype)

pMnt('good')|

test_raise(8.9)

output

ExceptionTraceback(mostrecentcalllast)

<ipython-input-262-b45324f5484e>in<module>

4

>6tcst_raise(8.9)^^^g

<ipython-input-262-b45324f5484e>intest_raise(n)

1deftest_raise(n):

2ifnotisinstance(n,int):|

—>3raiseException('notainttype'

〔Exceplion:nolainilype^M

88.tuple和list转换

tuple1=(1,2,3,4)

listl=list(tuplel)

print(listl)

tuple2=tuple(listl)

)rint(tuple2)

output

1,2,3,4](1,2,3,4)|

89.简述断言

Python的断言就是检测一个条件,如果条件为真,它什么都

不做;反之它触发一个带可选错误信息的AssertionError

|deftestassert(n):^^^^^M

output

AssertionErrorTraceback(mostrecentcalllast)|

<ipy[h()n-inpu〔-268-a9dfd6c79c73>in〈module)

2assertn二二2,"nisnot2

——>4testassert(l)

vipython-input-268-a9dfd6c79e73>intestassert(n)|

1deftestassert(n):

——>2assertn二二2,"nisnot2"

3print('nis2')|

4testassert(1)

AssertionEnor:nisnot2

90.什么是异步非阻塞

同步异步指的是调用者与被调用者之间的关系

所谓同步,就是在发出一个功能调用时,在没有得到结果之

前,该调用就不会返回,一旦调用返回,就得到了返回值

异步的概念和同步相对,调用在发出之后,这个调用就直接返

回了,所以没有返回结果。当该异步功能完成后,被调用者可

以通过状态、通知或回调来通知调用者

阻塞非阻塞是线程或进程之间的关系

阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇

到io操作)。调用线程只有在得到结果之后才会返回。函数

只有在得到结果之后才会将阻塞的线程激活

非阻塞和阻塞的概念相对应,非阻塞调用指在不能立刻得到

结果之前也会立刻返回,同时该函数不会阻塞当前线程

91.什么是负索引

Python中的序列是有索引的,它由正数和负数组成。正的数

字使用U作为第一个索引,T作为第二个索引,以此类推

负数的索引从开始,表示序列中的最后一个索引,'-2作

为倒数第二个索引,依次类推

92.退出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论