1.为什么学习python
python简单易学,从人性角度讲,Python是给人设计的
语法优美,
有丰富强大的库,
开发效率高【能够满足互联网快速迭代的需求】,
应用领域防范
可嵌入性和可移植性
2.通过什么途径学习的python
网络视频,
购买书籍,如流畅的python
技术软件,掘金,蓝鲸,Github
3.Python和Java、PHP、C、C#、C++等其他语言的对比
Python VS C#
1. Python跨平台,可以运行在linux、weindows等平台
2. Pythond开源,C#则相反
3. Python是解释型语言,C#需要编译,所以Python运行要慢点
Python VS Java
Python更简洁,Java过于庞大复杂,语法很多
Python VS C C++
Python更容易学习,语法简单易懂,但他们通常扮演不同的角色,Python是一种脚本语言,C和C++通常要和底层硬件打交道
Python VS Ruby和Perl
与ruby不同,OOP(Object Oriented Programming,面向对象开发)对于Python是可选的,所以Python不会强制用户选择
OOP开发
Python通常是上述语言不错的替代品,使用Python将会减少很多编写,调试和维护的麻烦
4.简述解释型和编译型编程语言?
编译型:
将代码一次性全部编译成二级制,然后再运行。
优点:执行效率高。
缺点:开发效率慢,不能跨平台。
代表语言:C。
解释型:
代码逐行解释,解释称二进制,然后运行。
优点:开发效率高,可以跨平台。
缺点:执行效率低。
代表语言:python.
5.Python解释器种类以及特点?
CPython
CPython。这个解释器是用C语言开发的,
CPython是使用最广的Python解释器。
IPython
IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方式上有所增强,但是执行Python代码的功能和CPython是完全一样的
PyPy
pyPy是另一个Python解释器,它的目标是执行速度。PyPy采用JIT技术,对Python代码进行动态编译(注意不是解释),所以可以显著提高Python代码的执行速度。
JPython
Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。
IronPython
IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器,可以直接把Python代码编译成.Net的字节码。
6.位和字节的关系
1字节Byte=8位(bit),1K=1024字节
7. b、B、KB、MB、GB 的关系?
8bit = 1Byte
1024Bytes = 1KB
1024KB = 1MB
1024MB = 1GB
8. 请至少列举5个 PEP8 规范(越多越好)
一 代码编排
1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号。换行点要在操作符的后边敲回车。
3 类和top-level函数定义之间空两行;类中的方法定义之间空一行;函数内逻辑无关段落之间空一行;其他地方尽量不要再空行。
二 文档编排
1 模块内容的顺序:模块说明和docstring—import—globals&constants—其他定义。其中import部分,又按标准、三方和自己编写顺序依次排放,之间空一行。
2 不要在一句import中多个库,比如import os, sys不推荐。
3 如果采用from XX import XX引用库,可以省略‘module.’,都是可能出现命名冲突,这时就要采用import XX。
三 空格的使用
总体原则,避免不必要的空格。
1 各种右括号前不要加空格。
2 逗号、冒号、分号前不要加空格。
3 函数的左括号前不要加空格。如Func(1)。
4 序列的左括号前不要加空格。如list[2]。
5 操作符左右各加一个空格,不要为了对齐增加空格。
6 函数默认参数使用的赋值符左右省略空格。
7 不要将多句语句写在同一行,尽管使用‘;’允许。
8 if/for/while语句中,即使执行语句只有一句,也必须另起一行。
四 注释
总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释!
注释必须使用英文,最好是完整的句子,首字母大写,句后要有结束符,结束符后跟两个空格,开始下一句。
如果是短语,可以省略结束符。
1 块注释,在一段代码前增加的注释。在‘#’后加一空格。段落之间以只有‘#’的行间隔。比如:
# Description : Module config.
#
# Input : None
#
# Output : None
2 行注释,在一句代码后加注释。比如:x = x + 1 # Increment x
但是这种方式尽量少使用。
3 避免无谓的注释。
五 文档描述
1 为所有的共有模块、函数、类、方法写docstrings;非共有的没有必要,但是可以写注释(在def的下一行)。
2 如果docstring要换行,参考如下例子,详见PEP 257
"""Return a foobang
Optional plotz says to frobnicate the bizbaz first.
"""
六 命名规范
总体原则,新编代码必须按下面命名风格进行,现有库的编码尽量保持风格。
1 尽量单独使用小写字母‘l’,大写字母‘O’等容易混淆的字母。
2 模块命名尽量短小,使用全部小写的方式,可以使用下划线。
3 包命名尽量短小,使用全部小写的方式,不可以使用下划线。
4 类的命名使用CapWords的方式,模块内部使用的类采用_CapWords的方式。
5 异常命名使用CapWords+Error后缀的方式。
6 全局变量尽量只在模块内有效,类似C语言中的static。实现方法有两种,一是__all__机制;二是前缀一个下划线。
7 函数命名使用全部小写的方式,可以使用下划线。
8 常量命名使用全部大写的方式,可以使用下划线。
9 类的属性(方法和变量)命名使用全部小写的方式,可以使用下划线。
9 类的属性有3种作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public属性前,前缀一条下划线。
11 类的属性若与关键字名字冲突,后缀一下划线,尽量不要使用缩略等其他方式。
12 为避免与子类属性命名冲突,在类的一些属性前,前缀两条下划线。比如:类Foo中声明__a,访问时,只能通过Foo._Foo__a,避免歧义。如果子类也叫Foo,那就无能为力了。
13 类的方法第一个参数必须是self,而静态方法第一个参数必须是cls。
七 编码建议
1 编码中考虑到其他python实现的效率等问题,比如运算符‘+’在CPython(Python)中效率很高,都是Jython中却非常低,所以应该采用.join()的方式。
2 尽可能使用‘is’‘is not’取代‘==’,比如if x is not None 要优于if x。
3 使用基于类的异常,每个模块或包都有自己的异常类,此异常类继承自Exception。
4 异常中不要使用裸露的except,except后跟具体的exceptions。
5 异常中try的代码尽可能少。比如:
try:
value = collection[key]
except KeyError:
return key_not_found(key)
else:
return handle_value(value)
要优于
try:
# Too broad!
return handle_value(collection[key])
except KeyError:
# Will also catch KeyError raised by handle_value()
return key_not_found(key)
6 使用startswith() and endswith()代替切片进行序列前缀或后缀的检查。比如:
Yes: if foo.startswith('bar'):优于
No: if foo[:3] == 'bar':
7 使用isinstance()比较对象的类型。比如
Yes: if isinstance(obj, int): 优于
No: if type(obj) is type(1):
8 判断序列空或不空,有如下规则
Yes: if not seq:
if seq:
优于
No: if len(seq)
if not len(seq)
9 字符串不要以空格收尾。
10 二进制数据判断使用 if boolvalue的方式。
9. 通过代码实现如下转换:
二进制转换成十进制:v = “0b1111011”
int(v,2)
十进制转换成二进制:v = 18
bin(v)
八进制转换成十进制:v = “011”
int(v,8)
十进制转换成八进制:v = 30
oct(v)
十六进制转换成十进制:v = “0x12”
int(v,16)
十进制转换成十六进制:v = 87
hex(v)
10. 请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
10 00001010
3 00000011
9 00001001
12 00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
int("".join([bin(int(i)).lstrip("0b").zfill(8) for i in "10.3.9.12".split(".") ]),2)
11.python递归的最大层数?
默认最大递归层数998
12. 求结果:
v1 = 1 or 3
--1
v2 = 1 and 3
--3
v3 = 0 and 2 and 1 -0
v4 = 0 and 2 or 1 - 1
v5 = 0 and 2 or 1 or 4 -1
v6 = 0 or Flase and 1 -False
13.ascii、unicode、utf-8、gbk 区别?
ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符
为了满足中文和英文,中国人定制了GBK
GBK:2Bytes代表一个中文字符,1Bytes表示一个英文字符
为了满足其他国家,各个国家纷纷定制了自己的编码
日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里
能够兼容万国字符
与全世界所有的字符编码都有映射关系,这样就可以转换成任意国家的字符编码
这就是unicode(定长), 统一用2Bytes代表一个字符, 虽然2**16-1=65535,但unicode却可以存放100w+个字符,
因为unicode存放了与其他编码的映射关系,准确地说unicode并不是一种严格意义上的字符编码表
很明显对于通篇都是英文的文本来说,unicode的式无疑是多了一倍的存储空间(二进制最终都是以电或者磁的方式存储到存储介质中的)
于是产生了UTF-8(可变长,全称Unicode Transformation Format),对英文字符只用1Bytes表示,对中文字符用3Bytes,
对其他生僻字用更多的Bytes去存
总结:内存中统一采用unicode,浪费空间来换取可以转换成任意编码(不乱码),
硬盘可以采用各种编码,如utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性
14.字节码和机器码的区别?
机器码是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂,也比较难编写,一般从业人员接触不到。
字节码是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。
15.三元运算规则以及应用场景?
三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值
格式:[on_true] if [expression] else [on_false]
resc = 值1 if 条件 else 值2
应用于if--else结构的逻辑,推导式中if也是基于三元运算规则
16.列举 Python2和Python3的区别?
1.print语句
python2中print是一个语句,输入内容放在print关键字后面即可,
python3里print是一个函数,需要括号执行,输出内容作为参数传给它
2.默认编码
python2默认编码是ASCII码,不支持中文
python3默认编码是UTF-8
3.UNICODE字符串
python2中有两种字符串类型,Unicode字符串和非Unicode字符串
python3中只有一种类型,Unicode字符串
4.全局unicode()方法
python2有两个全局函数可以把对象强制转换成字符串:unicode()把对象转换成unicode字符串
还有str()把对象转换为非Unicode字符串。
Python3只有一种字符串类型,unicode字符串,所以str()函数即可完成所有的功能。
5.long长整型
python2的整数有int整形和long长整型两种类型
python3里只有一种整形int
6.比较运算符--不等于
python2支持<>和!=,
python3只支持!=
7.字典类has_key()
python2中有has_key()方法,测试字典是否包含指定的键,3不支持
8.HTTP
python3中几个相关的http模块被组合成一个单独的包,即http
9.filter函数
python2中,filter,map方法返回一个列表
python3中,filter,map返回一个迭代器
10.输入
python2中input等待用户输入一个python表达式,然后返回结果
2中raw_input(),用户输入什么就返回什么
python3中只有input,用户输入什么就返回什么字符串,不计算
17.用一行代码实现数值交换:
a = 1
b = 2
a,b = b,a
18. Python3和Python2中 int 和 long的区别?
python2中int有一定范围,超过范围的整数要用long型
python3只有int
19. xrange和range的区别?
range产生的是一个列表序列,一次把所有数据返回,
而xrange产生的是一个生成器,每次调用返回其中一个值
相对来说xrange比range性能优化很多,数据集合较大时,不需要开辟一块很大的内存
20. 文件操作时:xreadlines和readlines的区别?
readlines返回值为列表,元素为每行的内容
xreadlines返回生成器,每次调用返回每行,已经不推荐这种用法,
推荐使用for line in f的方式
21. 列举布尔值为False的常见值?
0,空字符串,空字典,空列表,None【一个特殊的常量】
22. 字符串、列表、元组、字典每个常用的5个方法?
字符串
name.capitalize()) # 把字符串的第一个字符大写
name.isspace()) # 是否为空格
name.replace('Li', '') # 替换操作
name.split('m') # 分割操作,打印: ["I'a", ' LiChengGuan']
name.strip() # 去掉字符串的左右空格或自定字符串
name.find('Li') # 查找,打印 5,即返回开始的索引值,否则返回-1
name.index('Li')
name.split() #按照指定元素分割
[::step] #切片,
列表
s= [1,2,3]
s.extend(s1) # 在列表末尾扩展另一个列表
s.append('测试拼接') # 列表末尾添加新的元素
s.insert(0, '测试拼接') # 指定位置插入元素
s.pop(0) # 指定位置删除,默认删除最后一个
s.remove(3) # 移除列表中某个值的第一个匹配项,没有会抛异常
s.clear() # 清空
s.reverse() #反转
元组
元组不可变
字典
dic.keys() # 输出所有键
dic.values() # 输出所有值
dic.items()
dic.pop('code') # 删除 code 键
dic.popitem() #随机删除
dic.clear() # 清空
del dic
23. lambda表达式格式以及应用场景?
lambda格式 lambda args:return expression
用于定义不需要命名,逻辑简单的函数
24. pass的作用?
pass是空语句,是为了保持程序结构的完整性,一般用做占位语句
25. *arg和**kwarg作用
函数定义中使用*args,**kwargs传递变长参数
*args用于传递位置参数,**kwargs用于传递关键字参数
26. is和==的区别
is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同
== 比较的是两个对象的内容/值是否相等,即内存地址可以不一样,内容一样就可以了
27.简述Python的深浅拷贝以及应用场景?
浅拷贝只拷贝一层,深拷贝拷贝所有层,用于复制数据
28.Python垃圾回收机制?
引用计数机制
python中一切皆对象,他们的核心就是一个结构体pyobject,
其中ob_refcnt就是做为引用计数,当一个对象有新的引用时,它的ob_refcent就会增加,当引用它的对象被删除,它的ob_refcnt
就会减少,当引用计数为0时,改对象生命就结束了
29. Python的可变类型和不可变类型?
不可变类型 : 基础类型字符串,数字,布尔值,字节.另外还有一个元组
可变类型 : 数据结构列表,字典,集合
30. 求结果:
v = dict.fromkeys(['k1','k2'],[])
v[‘k1’].append(666)
print(v)
v[‘k1’] = 777
print(v)
fromkey生成的字典,指向同一个内存地址
{'k1':777,'k2':[666]}
31. 求结果:
理解:函数查找变量的时刻,函数调用时才会查找变量
num() --> [lambda x:i*x,lambda x:i*x,lambda x:i*x,lambda x:i*x]
m(2)调用时查找i,for循环结束后i是3
结果[6,6,6,6]
32. 列举常见的内置函数?
enumertae:枚举,返回索引与值的元组
zip:拉链函数,接收多个可迭代对象,将对象相同索引位置放在一个元组中,返回一个迭代器,返回迭代器中元素个数由最短的可迭代对象决定
filter:过滤函数,接收一个函数和一个可迭代对象,生成一个迭代器.将可迭代对象的每一个元素带入函数中,如果返回结果为True,则把元素添加入迭代器中
map:处理函数,接收一个函数和一个可迭代对象,生成一个迭代器,将可迭代对象的每一个元素带入函数中,把返回值添加入迭代器中
callble:判断参数是不是可调用的
dir:查看内置属性和方法的字符串
super:根据__mro__属性去查找方法
isinstance:判断一个对象是不是这个类实例化出来的
iscubclass:判断一个类是不是另一个类的子类,也可以判断两个类是不是相同的类
33. filter、map、reduce的作用?
filter:过滤函数,接收一个函数和一个可迭代对象,生成一个迭代器.将可迭代对象的每一个元素带入函数中,如果返回结果为True,则把元素添加入迭代器中
map:处理函数,接收一个函数和一个可迭代对象,生成一个迭代器,将可迭代对象的每一个元素带入函数中,把返回值添加入迭代器中
reduce函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:
用传给reduce中的函数(有两个参数)先对集合中的元素进行操作,得到的结果再与第三个参数用函数运算,最后得到一个结果。
34. 一行代码实现9*9乘法表
print ("
".join(" ".join(["%s*%s=%s" %(x,y,x*y) for y in range(1, x+1)]) for x in range(1, 10)))
35.如何安装第三方模块?以及用过哪些第三方模块?
pip install
PIL 图像处理标准库
requests处理URL
Tkinter图形界面
36,至少列举8个常用模块都有那些?
random模块
os模块
sys模块
time模块
re模块
序列化模块
hashlib模块
logging模块
collections模块
37.re的match和search区别?
re.match从开头开始匹配string
re.search从任意位置匹配
38.什么是正则的贪婪匹配?
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。
39.求结果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
a [0,1,0,1,0,1,0,1,0,1] 列表
b (0,1,0,1,0,1,0,1,0,1) 生成器
40. 求结果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
a. 1 b,2,c False,d,True
41. def func(a,b=[]) 这种写法有什么坑?
函数调用时b使用默认参数时,指向同一个内存地址
42.如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
a = "1,2,3"
b = a.split(',')
43. 如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
[int(i) for i in ['1','2','3']]
44. 比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
a,b列表元素都是数字,c元素是元组
45. 如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
[i**2 for i in range(1,11)]
46. 一行代码实现删除列表中重复的值 ?
list1 = [...]
list2 = list(set(list1))
47. 如何在函数中设置一个全局变量 ?
global变量
48. logging模块的作用?以及应用场景?
loggin用来记录日志,可以定制日志的格式,级别和输出形式
程序调试
了解软件程序运行情况,是否正常
软件程序运行故障分析与问题定位
49.请用代码简答实现stack【堆栈】。
Stack():创建一个新的空栈
push(item):添加一个新的元素
item到栈顶
pop():弹出栈顶元素
peek():返回栈顶元素,且不从栈中删除
is_empty():判断栈是否为空
size():返回栈的元素个数
class Stack:
def __init__(self):
self.items=[]
def is_empty(self):
return self.items==[]
def push(self,item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[-1]
def size(self):
return len(self.items)
50.常用字符串格式化哪几种?
f"{}abc{}",%,format()
51. 简述 生成器、迭代器、可迭代对象 以及应用场景?
生成器 : 自己实现的迭代器
迭代器 : 调用next()方法,从中取值,或抛出一个异常.也有__iter__方法
可迭代对象 : 拥有__iter__方法,返回一个迭代器
应用场景 : 处理大量数据时逐个取值,减少内存占用
52. 用Python实现一个二分查找的函数。
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def search(value,list1,start=0,end=None):
end = len(list1) if end is None else end
zj = (end - start) // 2+start
if start<=end:
if value>list1[zj]:
return search(3,list1,start=zj+1,end=end)
elif value<list1[zj]:
return search(3,list1,start=start,end=zj-1)
else:
return zj
return '找不到这个值'
53. 谈谈你对闭包的理解?
内部函数包含了对外部函数变量的引用,内部函数被执行
54. os和sys模块的作用?
os封装了系统相关功能,sys模块封装了解释器相关功能
55. 如何生成一个随机数?
random模块
56. 如何使用python删除一个文件?
os.remove('path')
57. 谈谈你对面向对象的理解?
面向对象是基于万物皆对象这个哲学观点. 所谓的面向对象就是将我们的程序模块化, 对象化,
把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面
面向对象的三大特征 继承,封装,多态
58. Python面向对象中的继承有什么特点?
1.在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
2.在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。
区别于在类中调用普通函数时并不需要带上self参数
3.Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找,
即先在本类中查找调用的方法,找不到才去基类中找。
59. 面向对象深度优先和广度优先是什么?
在经典类中,是深度优先,先把一条线查完
在新式类中,广度优先(顺着一条线查,如果还有别的路可以查到一个类,这条路就终止了,换一条线查)
python3中都是新式类,在python中如果你创建了一个类,并且该类没有继承任意类,那么他就是一个经典类
60. 面向对象中super的作用?
调用父类的方法
61. 是否使用过functools中的函数?其作用是什么?
装饰器修复的函数functool.wraps
functools.reduce(function, iterable[, initializer]),对可迭代对象进行函数处理
partial对象
62. 列举面向对象中带爽下划线的特殊方法,
__init__(self,...) 、__del__(self) 、__call__(self, *args) 、
__str__(self方法)、__add__、__dic__、__getitem__、__setitem__、__delitem__、__iter__
63.如何判断是函数还是方法?
isinstance(obj, FunctionType)
isinstance(obj, MethodType)
64. 静态方法和类方法区别?
静态方法 : 相当于在类作用域下的普通函数,不进行与类或实例相关的操作,不使用类或实例的资源
类方法 : 由类调用,进行与类有关的操作
65. 列举面向对象中的特殊成员以及应用场景
1. __doc__表示类的描述信息
2. __module__ 和 __class__
__module__ 表示当前操作的对象在哪个模块
__class__ 表示当前操作的对象的类是什么
3. __init__
构造方法,通过类创建对象时,自动触发执行。
4. __del__
析构方法,当对象在内存中被释放时,自动触发执行。
5. __call__
对象后面加括号,触发执行。
6. __dict__
类或对象中的所有成员
7. __str__
如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
8、__getitem__、__setitem__、__delitem__
用于索引操作,如字典。以上分别表示获取、设置、删除数据
9、__getslice__、__setslice__、__delslice__
该三个方法用于分片操作,如:列表 slice : 切片 切割
10. __iter__
用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__
11. __new__ 和 __metaclass__
66. 1、2、3、4、5 能组成多少个互不相同且无重复的三位数
list1 = [i*100+j*10+k for i in range(1,10) for j in range(1,10) for k in range(1,10)]
print(len(list1))
67.什么是反射?以及应用场景?
利用字符串获取对象的属性或方法,WEB框架的CBV,DRF接口框架中使用了大量反射
68. metaclass作用?以及应用场景?
metaclass是类的产生类,而并非继承类
通过它来控制类的产生,以及类实例化的操作
form组件中通过meta类控制字段
69.用尽量多的方法实现单例模式。
使用模块
使用装饰器
使用类
使用__new__方法
基于metaclass方式
70. 装饰器的写法以及应用场景。
def wrapper(f):
def inner(*args,**kwargs):
#函数执行前操作
ret = f(*args,**kwargs)
#函数执行后操作
return ret
return inner
@wrapper
def func(*args,**kwargs):
pass
应用场景:
1.可以在外层函数加上时间计算函数,计算函数运行时间;
2.计算函数运行次数;
3.可以用在框架的路由传参上;
4.插入日志,作为函数的运行日志;
5.事务处理,可以让函数实现事务的一致性,让函数要么一起运行成功,要么一起运行失败;
6.缓存,实现缓存处理;
7.权限的校验,在函数外层套上权限校验的代码,实现权限校验;
71.异常处理写法以及如何主动抛出异常(应用场景)
raise 异常名称(‘异常描述’) 语句主动抛出异常
应用场景时mysql操作数据库时,保证事务一致性
72. 什么是面向对象的mro
mro即method resolution order,主要用于在多继承时判断调的属性的路径(来自于哪个类)
mro基于c3算法
73. isinstance作用以及应用场景?
判断对象是不是一个类的子类或者后代类的对象,判断对象是方法还是函数
74. 写代码并实现:
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would
have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]
def func(iter,target):
for i in iter:
if target-i in iter:
findex = iter.index(i)
sindex = iter.index(target-i)
return [findex,sindex]
else:
pass
else:
return '没有符合条件的'
75. json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
字符串、列表、字典、数字、布尔值、None
自定义类
class MyTime(json.JSONEncoder):
def default(self, o): # o是数据类型
if isinstance(o,datetime.datetime):
return o.strftime('%Y-%m-%d')
else:
return super(MyTime,self).default(o)
76.json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
dumps时指定ensure_ascii=False
77. 什么是断言?应用场景?
断言条件为真时代码继续执行,否则抛出异常,这个异常通常不会去捕获他.
我们设置一个断言目的就是要求必须实现某个条件
78. 有用过with statement吗?它的好处是什么?
with语句的作用是通过某种方式简化异常处理,它是所谓的上下文管理器的一种
1、解决异常退出时资源释放的问题;
2、解决用户忘记调用close方法而产生的资源泄漏问题;
79.使用代码实现查看列举目录下的所有文件。
def print_directory_contents(sPath):
import os
for sChild in os.listdir(sPath):
sChildPath = os.path.join(sPath, sChild)
if os.path.isdir(sChildPath):
print_directory_contents(sChildPath)
else:
print(sChildPath)
80.简述 yield和yield from关键字。
yield : 生成器函数关键字
yield from : 相当于for i in obj : yield i