Python数组中指定位置插入元素,其他元素位置对应往后移动
yield含义?表层含义,产出
Python负数索引切片
序列是可以采用负数的索引来访问的,其范围是 -1 到序列的负长度(-1开始)
[-4:]从后往前取,从-1到-4
[:-4]从前往后取,从0到倒数第4个数的前一个数
zip函数作用?
两列表对应元素配对成元组存储在列表中,以元素少的列表为基准匹配
在钱数转化为对应的汉字时用到
Ord()获取字符对应的整数()
计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)
if ord(letter)>0 and ord(letter)<128:
如计算a对应的ACSII值是否在0-128间
Chr()把整数(ASCII码)转化为对应的字符
利用断言可以调试代码,断言的语句如果出错就不会继续往下执行
assert len(lis)==3判断列表的长度是否为3,如果是则继续往下执行,否则此句报错
简述多线程、多进程
进程:
1、操作系统资源分配的基本单位,多个进程之间相互独立
2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
线程:
1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃
应用: IO密集的用多线程,在用户输入,sleep 时候,可以切换到其他线程执行,减少等待的时间 CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势
IO多路复用
Python里面如何拷贝一个对象,并解析深浅拷贝
赋值b=a,改变一个b,另一个a也会改变,但是打印id相同,说明a,b指向同一个地址
浅复制:copy函数,打印id不同(指向不同的地址,但是共用一套值),但是改变b中元素值,a中元素也会跟着改变
深复制:deepcopy函数,地址id不同,改变b中元素,a中元素不会改变
如何在一个函数内部修改全局变量
利用global 修改全局变量(函数内定义)
Os m dj
os:提供了不少与操作系统相关联的函数
sys: 通常用于命令行参数
json: json格式文件
math: 数学运算
datetime:处理日期时间(重点)
- 请用datetime模块打印当前时间戳(返回系统当前时间),顺便把星期的代码也贴上了
两个datatime
.now().strftime(时间格式,年月日和时分秒用空格隔开)/isoweekday()
月日是小写 每个时间点前有%
4、字典如何删除键和合并两个字典
del和update方法
除了用del,还可用pop,Pop(“name”)
del json_data[session_id]['BVP']['single'] 删除键,键值都删除
字典遍历:
只取键
for语句就能循环字典的所有键
d = {'name1' : 'pythontab', 'name2' : '.', 'name3' : 'com'}
for key in d:(for循环取出的是字典中的键)
print (key, ' value : ', d[key])
name1 value : pythontab
name2 value : .
name3 value : com
取键值
如果想获取键和值d.items方法会将键-值对作为元组返回
for key, value in d.items():
print (key, ' value : ', value)
name1 value : pythontab
name2 value : .
name3 value : com
注意A2,i是整数,判断if i in A0,显然i与A0中的键不相符
5、谈下python的GIL(全局)
GIL 是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
7、fun(*args,**kwargs)中的*args(不定个数参数),**kwargs(不定长度键值对)什么意思?
可能有一个键值对,可能多个
- python2和python3的range(100)的区别
输入 输出 中文 编码 coding中文显示
①python2返回列表,python3返回迭代器,节约内存
迭代器是实现了__next__()方法的对象(这个方法在调用时不需要任何参数),它是访问可迭代序列的一种方式,通常其从序列的第一个元素开始访问,直到所有的元素都被访问才结束。 [注意]:迭代器只能前进不能后退
②Python3 使用 print 必须要以小括号包裹打印内容,比如 print('hi')
Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print 'hi'
③python2中使用ascii编码,python中使用utf-8编码
④python2中是raw_input()函数,python3中是input()函数
⑤python2中为正常显示中文,引入coding声明,python3中不需要
9、一句话解释什么样的语言能够用装饰器?
函数可以作为参数传递的语言,可以使用装饰器
10、python内建数据类型有哪些
整型--int
字符串--str
列表--list
元组--tuple
字典--dict 布尔型--bool
11、简述面向对象中__new__和__init__区别
__init__是初始化方法,创建对象后,就立刻被默认调用了,可接收参数,如图
if __name__ == '__main__':
preprocess()
- 简述with方法打开处理文件帮我我们做了什么?finally中关闭文件的作用
with open(pathname, 'wt', newline='') as f:
json.dump(json_data, f,indent=4) #含有单一波形的json文件
打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都要执行finally f.close()关闭文件,with方法帮我们实现了finally中f.close
41、举例说明异常模块中try except else finally的相关意义
try..except..else没有捕获到异常,执行else语句
try..except..finally不管是否捕获到异常,都执行finally语句
36、写一段自定义异常代码
自定义异常用raise抛出异常(异常抛出是在try中)
- 列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出大于10的数,最终输出[16,25]
①列表推到式
②map中平方
- python中生成随机整数、随机小数、0--1之间小数方法
随机整数:random.randint(a,b),生成区间内的整数
随机小数::生成0-100的随机小数。先生成0-1的随机小数,再乘100(0到1000,则可以成10000)
随机多个小数(3项):习惯用numpy库,利用np.random.randn(5)生成5个随机小数(注意np需要导入重命名)
0-1随机小数:random.random(),括号中不传参
进一步,任意区间的小数:random.uniform(a,b):返回指定范围内的浮点数。
生成0-100的随机小数。先生成0-1的随机小数,再乘100
15、避免转义给字符串加哪个字母表示原始字符串?
R(raw原始字符串) , 表示需要原始字符串,不转义特殊字符(字符串前面加r,表示禁止字符串转义)
17、python中断言方法举例
assert()方法,断言成功,则程序继续执行(继续向下执行),断言失败,则程序报错
21、列出python中可变数据类型和不可变数据类型,并简述原理
不可变数据类型:数值型、字符串型string和元组tuple
不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址)
变量值改变,新建一个对象(地址会改变);不同变量值相同,不同变量地址也相同
a=3
print(id(a))
a=4
print(id(a))
print(a)
输出结果:
140716430578784
140716430578816
4
可变数据类型:列表list和字典dict;
允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
100、python传参数是传值还是传址?
Python中函数参数是引用传递(注意不是值传递)。对于不可变类型(数值型、字符串、元组),因变量不能修改,所以运算不会影响到变量自身;而对于可变类型(列表字典)来说,函数体运算可能会更改传入的参数变量。
- 用lambda函数实现两个数相乘
Lambda 参数:表达式(中间用冒号隔开)
匿名函数被赋值给一个变量,变量中输入函数参数
24、字典根据键从小到大排序
dict={"name":"zs","age":18,"city":"深圳","tel":"1362626627"}
关键字是dict
使用Sorted函数
匿名函数,确定是键还是值排序,Lambda后面的参数是i,表达式i[0]/i[1]
Items函数
匿名函数补充:
74、列表嵌套字典的排序,分别根据年龄和姓名排序
foo = [{"name":"zs","age":19},{"name":"ll","age":54},
{"name":"wa","age":17},{"name":"df","age":23}]
73、使用lambda函数对list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],输出结果为
[0,2,4,8,8,9,-2,-4,-4,-5,-20],正数从小到大,负数从大到小
(传两个条件,x<0和abs(x))(未懂?)
- 利用collections库的Counter方法统计字符串每个单词出现的次数
与count的区别
"kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"
尽管输入的是字符串,但是还是会统计出所有的字符个数
27、filter方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表
过滤出的元素需要逐一取出
lis=[i for i in lis]必须有这一句
和map用法一样,map返回值就是列表,filter返回内容需要重新取值
- 列表推导式求列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
变量 for循环 带变量的条件判断/for循环
- [[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
运行过程:for i in a ,每个i是【1,2】,【3,4】,【5,6】,for j in i,每个j就是1,2,3,4,5,6,合并后就是结果
- 用python删除文件和用linux命令删除文件方法
删除文件和删除字典里面的键值区别
python:os.remove(文件名)
程序中用到的删除del json_data[session_id]['BVP']['single_waveforms'] ,删除字典中的某个键值
linux: rm 文件名
35、请列出你会的任意一种统计图(条形图、折线图等)绘制的开源库
matplotlib
- 正则表达式匹配中,(.*)和(.*?)匹配区别?
函数格式re.findall(匹配格式,需要操作的字符串)
(.*)是贪婪匹配,会把满足正则的尽可能多的往后匹配
(.*?)是非贪婪匹配,会把满足正则的尽可能少匹配
51、正则匹配,匹配日期2018-03-20
url='https://sycm.taobao.com/bda/tradinganaly/overview/get_summary.json?dateRange=2018-03-20%7C2018-03-20&dateType=recent1&device=1&token=ff25b109b&_=1521595613462'
提取一段特征语句,用(.*?)匹配即可
82、s="info:xiaoZhang 33 shandong",用正则切分字符串输出['info', 'xiaoZhang', '33', 'shandong']
|表示或,根据冒号或者空格切分
94、正则表达式匹配第一个URL
findall结果无需加group(),search需要加group()提取
正则结果为列表,可以进行索引操作
- x="abc",y="def",z=["d","e","f"],分别求出x.join(y)和x.join(z)返回的结果
在相邻的每个y中加入x
43、举例说明zip()函数用法
zip()函数在运算时,会以一个或多个序列(可迭代对象)做为参数,返回一个元组的列表。同时将这些序列中并排的元素配对。
钱币转化为对应汉字,不用字典,直接用两个列表进行配对
48、提高python运行效率的方法
1、使用生成器,因为可以节约大量内存
2、循环代码优化,避免过多重复代码的执行
3、核心模块用Cython PyPy等,提高效率
4、多进程、多线程、协程
5、多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断的次数,提高效率
50、遇到bug如何处理
1、细节上的错误,通过print()打印,能执行到print()说明一般上面的代码没有问题,分段检测程序是否有问题,如果是js的话可以alert或console.log
2、如果涉及一些第三方框架,会去查官方文档或者一些技术博客。
3、(自己对bug会进行单独总结分类)对于bug的管理与归类总结,一般测试将测试出的bug用teambin等bug管理工具进行记录,然后我们会一条一条进行修改,修改的过程也是理解业务逻辑和提高自己编程逻辑缜密性的方法,我也都会收藏做一些笔记记录。
- list=[2,3,5,4,9,6],从小到大排序,不许用sort,输出[2,3,4,5,6,9]
取最小,删除,递归调用函数
利用min()方法求出最小值,原列表删除最小值,新列表加入最小值,递归调用获取最小值的函数,反复操作
- 保留两位小数
两种方法:用round函数的方法
In [1]: a = 5.026
In [3]: round(a,2)
Out[3]: 5.03
In [7]: float('%.2f' % a)
Out[7]: 5.03
55、求三个方法打印结果(字典操作)
fn("one",1)直接将键值对传给字典;
fn("two",2)因为字典在内存中是可变数据类型,所以指向同一个地址,传了新的额参数后,会相当于给字典增加键值对
fn("three",3,{})因为传了一个新字典,所以不再是原先默认参数的字典
64、简述any()和all()方法
any():只要迭代器中有一个元素为真就为真
all():迭代器中所有的判断项返回都是真,结果才为真
65、python中什么元素为假?
答案:(0,空字符串,空列表、空字典、空元组、None, False)
65、IOError、AttributeError、ImportError、IndentationError、IndexError、KeyError、SyntaxError、NameError分别代表什么异常
IOError:输入输出异常
AttributeError:试图访问一个对象没有的属性
ImportError:无法引入模块或包,基本是路径问题
IndentationError:语法错误,代码没有正确的对齐
IndexError:下标索引超出序列边界
KeyError:试图访问你字典里不存在的键
SyntaxError:Python代码逻辑语法出错,不能执行
NameError:使用一个还未赋予对象的变量
67、列出几种魔法方法并简要介绍用途
__init__:对象初始化方法
__new__:创建对象时候执行的方法,单列模式会用到
__str__:当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
__del__:删除对象执行的方法
68、C:\Users\ry-wu.junya\Desktop>python 1.py 22 33命令行启动程序并传参,print(sys.argv)会输出什么数据?
文件名和参数构成的列表,格式为字符串
[‘1.py’,’22’,’33’]
69、请将[i for i in range(3)]改成生成器
生成器是特殊的迭代器,
1、列表表达式的【】改为()即可变成生成器
2、函数在返回值得时候出现yield就变成生成器,而不是函数了;
- 举例sort和sorted对列表排序,list=[0,-1,3,-10,5,9]
有负数的情况还是按照大小顺序来排序
Sort无返回值,sorted与返回值
- 用两种方法去空格
将空格代替为空,字符串操作
93、列举3条以上PEP8编码规范
1、函数或之间空两行
3、三引号进行注释
4、使用Pycharm、Eclipse一般使用4个空格来缩进代码
9、以下不能创建一个字典的语句是
A、dict1 = {} B、dict2 = { 3 : 5 }
C、dict3 ={[1,2,3]: “uestc”} D、dict4 = {(1,2,3): “uestc”}
答案:C(字典的键必须是不变的,而列表是可变的)
1、what getsprinted? Assuming python version 2.x()
print type(1/2)(注意1/2结果)
A. int
再次错,注意不是加的i
字符串转列表自己用了str.split(),这是按空格分开,直接对字符串进行list即可
注意大小写
1. 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址(旧瓶装旧酒)。
2. 浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素(新瓶装旧酒)。
3. 深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说(新瓶装新酒)。
赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}
深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数}
1, python常见的命令行交互自动化模块有哪些?(2分)
答案:a)Import module
b) Import module1,module2
c) From module import *
d) Frommodule import m1,m2,m3
2,python的底层网络交互模块有哪些?(2分)
答案:socket, urllib
4,python的测试框架有哪些?试列出常用的3个或更多(6分)
答案:unittest, nose,unittest2, doctest, pytest
Python里面如何实现tuple和list的转换?
答:直接使用tuple和list函数就行了,type()可以判断对象的类型
Python中pass语句的作用是什么?
答:pass语句不会执行任何操作,一般作为占位符或者创建占位程序,whileFalse:pass
如何用Python来进行查询和替换一个文本字符串?
答:可以使用re模块中的sub()函数或者subn()函数来进行查询和替换,
格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量)
>>> import re
>>>p=re.compile(‘blue|white|red’)
>>>print(p.sub(‘colour’,'blue socks and red shoes’))
colour socks and colour shoes
>>>print(p.sub(‘colour’,'blue socks and red shoes’,count=1))(替换最前面的)
colour socks and redshoes
Python里面match()和search()的区别?
答:re模块中match(pattern,string[,flags]),检查string的开头是否与pattern匹配。
re模块中re.search(pattern,string[,flags]),在string搜索pattern的第一个匹配值。
>>>print(re.match(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.match(‘super’, ‘insuperable’))
None
>>>print(re.search(‘super’, ‘superstition’).span())
(0, 5)
>>>print(re.search(‘super’, ‘insuperable’).span())(span()函数返回的是区间)
(2, 7)
1.Python是如何进行内存管理的?
答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制
一、对象的引用计数机制
Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。
引用计数增加的情况:
1,一个对象分配一个新名称
2,将其放入一个容器中(如列表、元组或字典)
引用计数减少的情况:
1,使用del语句对对象别名显示的销毁
2,引用超出作用域或被重新赋值
sys.getrefcount( )函数可以获得对象的当前引用计数
多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。
二、垃圾回收
1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。
2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,
因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。
三、内存池机制
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。
3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做)。
- Python是一种解释型语言。这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需要编译。其他解释型语言还包括PHP和Ruby。
- Python是动态类型语言,指的是你在声明变量时,不需要说明变量的类型。
Python代码编写快,但是运行速度比编译语言通常要慢。
Python用途非常广泛,常被用作“胶水语言”