1、一行代码实现1-100之和 利用sum()函数求和
sum(range(1, 101))
2、如何在一个函数内部修改全局变量
利用global将函数内的变量指定成全局变量
a = 5
def fn():
global a
a = 4
fn()
print(a)
3、 列出5个python标准库
sys/os/threading/multiprocessing/re/math/datetime
4、字典如何删除键和合并两个字典
删除是delete,合并是update方法
5、谈下python的GIL
GIL(Global Interpretor Lock), 全局解释器锁, 是Python线程处理的一种机制,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程中,线程的运行仍是有先后顺序的,并不 是同时进行。多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器, 所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
6、python实现列表去重的方法
先通过集合去重,在转列表
ll = [4, 2, 1, 6, 6]
s = set(ll)
ll = list(s)
print(ll)
7、fun(*argsf, **kwargs)中的*argsf, **kwargs是什么意思?
*argsf和**kwargs主要用于函数定义。你可以将不定数量的参数传递给一个函数。这里的不定的意思是:预先并不知道,函数使用者会传递多少个参数给你,所以在这个场景下使用这两个关键字。**kwargs是用来发送一个非键值对的可变数量的参数列表给一个函数.这里有个例子帮你理解这个概念:
def demo(*args_f, **argsv):
print(args_f)
for x in argsv:
print(x)
demo(1, 3, 5, a='hello', b='world')
输出:
(1, 3, 5)
a
b
argsv还提供了items方法,方便一起取出key,value
def demo(**argsv):
for x, y in argsv.items():
print(x, y)
demo(a='hello', b='world')
8、python2和python3的range (100)的区別
python2返回列表,python3返回迭代器,节约内存
9、一句话解释什么样的语言能够用装饰器?
函数可以作为参数传递的语言,可以使用装饰器
10、python内建数据类型有哪些
- 数值类型--包括int(整型),float(浮点型)
- 布尔型--bool,只有两个值True和False
- 字符串--str
- 列表--list
- 元组--tuple
- 字典--dict
11、简述面向对象中__new__ 和__init__区別
1、 __new__ 至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别
__init__ 至少要有一个参数self,代表当前对象
2、__new__ 必须要有返回值,返回实例化出来的实例,这点在自己实现_new_时要特别注意,可以return父类(通过super(当前类名,cls)) __new__出来的实例,或者直接 是objec1__new__ 出来的实例
__init__ 不需要返回值
3、如果__new__创建的是当前类的实例,会自动调用__init__ 函数,通过return语句里面调用的__new__ 函数的第一个参数是cis来保证是当前类实例,如果是其他类的类名,那么实际创建返回的就是其他类的实例,其实就不会调用当前类的_init_函数,也不会调用其他类的__init__函数。
12、简述with方法打开处理文件帮我我们做了什么?
打开文件在进行读写的时候可能会出现一些异常状况,如果按照常规的f.open写法,我们需要try,except,finally,做异常判断,并且文件最终不管遇到什么情况,都 要执行finally f.close()关闭文件,with方法帮我们实现finally中f.close (当然还有其他自定义功能,有兴趣可以研究with方法源码)
13、列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用列表推导式提取出
大于10的数,最终输出[16,25]
l1 = [1, 2, 3, 4, 5]
l2 = list(map(lambda x: x**2, l1))
print(l2)
l3 = filter(lambda x: x > 10, l2)
print(list(l3))
14、python中生成随机整数、n个随机小数、0-1之间小数方法
随机整数:random.randint(a,b),生成区间内的整数
n个随机小数:习惯用numpy库,利用np.random.randn(5)生成5个随机小数
0-1随机小数:random.random(),括号中不传参
15、避免转义给字符串加哪个字母表示原始字符串?
在字符串前加r,表示需要原始字符串,不转义特殊字符,如:
a = r'\n'
print(a)
输出:\n
16、 <div class="nam">中国</div>,用正则匹配出标签里面的内容("中国"),其中class的类名是不确定的
import re
a = '<div class="nam">中国</div>'
res = re.findall(r'<div class=".*">(.*)</div>', a)
print(res)
17、python中断言方法举例
assert ()方法,断言成功,则程序继续执行,断言失败,则程序报错
18、数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句
select distinct name from student
19、10个Linux常用命令
Is pwd cd touch rm mkdir tree cp mv cat more grep echo
20、python2和python3区別?列举5个
1、Python3使用print必须要以小括号包裹打印内容,比如print('hi') Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比 如 print 'hi'
2、python2 range(1,10)返回列表,python3中返回迭代器,节约内存
3、python2中使用ascci编码,python中使用unicode编码
4、python2中unicode表示字符串序列,str表示字节序列 python3中str表示字符串序列,byte表示字节序列
5、python2中为了正常显示中文,必须有coding声明,python3中不需要
6、python2中是rawInput()函数,python3中是input()函数
更多Python3,Python3区别,参照:www.runoob.com/python/pyth…
21、列出python中可变数据类型和不可变数据类型,并简述原理
不可变数据类型:数值型、字符串型string和元组tuple。
不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同 的值的对象,在内存中则只有一个对象(一个地址)
可变数据类型:列表list和字典dict;
允许变量的值发生变化,即如果对变量进行append, +=等这种操作后,只是改变了变 量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
22、s = "ajldjlajfdljfddd",去重并从小到大排序输出"adfjl"
a = set('ajldjlajfdljfddd')
b = list(a)
b.sort()
print(''.join(b))
23、用lambda函数实现两个数相乘
sun=lambda a,b:a b (
sum(5,4)
24、字典根据键从小到大排序 dict={"name":"zs","age":18,"city":"深圳362626627", "tel":"11223344"}
dict={"name":"zs","age":18,"city":"深圳362626627", "tel":"11223344"}
keys = dict.keys()
keys = sorted(keys)
new_dict = {key: dict[key] for key in keys}
print(new_dict)
25、利用collections库的Counter方法统计字符串每个单词出现的次数"kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"
from collections import Counter
a = 'Mkjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;hM '
res = Counter(a)
print(res)
26、字符串a = "not 404 found 张三 99 深圳",每个词中间是空格,用正则过滤掉英 文和数字,最终输出”张三 深圳"
a = "not 404 found 张三 99 深圳"
b = re.sub(r'[\d.a-zA-Z]', '', a)
b = re.sub(r'\s+', ' ', b)
print(b.strip())
27、filter方法求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列 表。该接收两个参数,第一个为函数,第二个为序列的每个元素作为参数传递给函 数进行判,然后返回True或False,最后将表达式为True的元素放到新列表
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list(filter(lambda x: x % 2 == 1, a)))
28、列表推导式求列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print([x for x in a if x % 2 == 1])
31、两个列表[1,5,7,9]和[2,2,6,8]合并为[1,2,2,3,6,7,8,9]
extend可以将另一个集合中的元素逐一添加到列表中,区别于append整体添加
a, b= [1, 5, 7, 9], [2, 2, 6, 8]
c = []
c.extend(a)
c.extend(b)
c.sort()
print(c)
32、用python删除文件和用linux命令删除文件方法
python: os.remove(文件名)
linux: rm文件名
33、log日志中,我们需要用时间戳记录error,warning等的发生时间,请用datetime
模块打印当前时间戳"2018-04-01 11:38:54"
import datetime
a = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(a)
34、数据库优化查询方法
外键、索引、联合查询、选择特定字段等等
35、请列出你会的任意一种统计图(条形图、折线图等)绘制的开源库,第三方也行
pychart、matplotlib、seaborn
36、写一段自定义异常代码
def testEx(num):
if (num > 5):
raise Exception("数字不能大于5")
testEx(6)
37、正则表达式匹配中,(.)和(.?)_配区別?
(.*)是贪婪匹配,会把满足正则的尽可能多的往后匹配
(.*?)是非贪婪匹配,会把满足正则的尽可能少匹配
38、简述Django的orm
ORM,全拼Object-Relation Mapping,意为对象-关系映射
实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,不需要修改代码。
代码只需要面向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句,所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle, sqlite....,如果数据库迁移,只需要更换Django的数据库引擎即可。
39、[[1,2],[3,4],[5,6]]一行代码展开该列表,得出[1,2,3,4,5,6]
a = [[1,2],[3,4],[5,6]]
print([j for i in a for j in i])
40、x = "abc", y = "def", z=["d, "e", "f"], 分别求出x.join(y), x.join(z)
dabceabcf
dabceabcf
41、举例说明异常模块中try except else finally的相关意义
try..except..else没有捕获到异常,执行else语句
try..except..finally不管是否捕获到异常,都执行finally语句
42、python中交换两个数值
Python里面可以用a, b = b, a来交互两个变量的值,非常方便
a = 1
b = 2
print('a, b', a, b)
a, b = b, a
print('a, b', a, b)
43、举例说明zip ()函数用法
zip()函数在运算时,会以一个或多个序列(可迭代对象)做为参数,返回一个元组的列表。同时将这些序列中并排的元素配对。
zip()参数可以接受任何类型的序列,同时也可以有两个以上的参数;当传入参数的长度不同时,zip能自动以最短序列长度为准进行截取,获得元组。
44、a ="张明98分",用re.sub,将98替換为100
import re
a = '小明 98分'
ret = re.sub(r'\d+', '100', a)
print(ret)
45、写5条常用sql语句
show databases;
show tables;
desc 表名;
select * from 表名;
delete from 表名 where id = 5;
update students set gender=0,hometown = '北京' where id = 5
46、a = "hello"和b="哈哈,你好"编码成bytes类型
a = b'hello'
b = '哈哈,你好'.encode()
print(a, b)
47、[1,2,3]+ [4,5,6]的结果是多少?
两个列表相加,等价于extend
48、 提高python运行效率的方法
1、 使用生成器,因为可以节约大量内存
2、 循环代码优化,避免过多重复代码的执行
3、核心模块用Cython PyPy等,提高效率
4、多进程、多线程、协程
5、多个if elif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序 判断的次数,提高效率
49、 简述mysql和redis区別
redis:内存型非关系数据库,数据保存在内存中,速度快
mysql:关系型数据库,数据保存在磁盘中,检索的话,会有一定的Io操作,访问速度相对慢
50、遇到bug如何处理
1、细节上的错误,通过print()打印,能执行到print()说明上面的代码没有问题,分段检测程序是否有问题,如果是js的话可以alert或console.log
2、如果涉及一些第三方框架,会去查官方文档或者一些技术博客。
3、对于bug的管理与归类总结,一般测试将测试出的bug用teambin等bug管理工具进行记录,然后我们会一条一条进行修改,修改的过程也是理解业务逻辑和提高自己编程逻 辑缜密性的方法,我也都会收藏做一些笔记记录。
4、导包问题、城市定位多音字造成的显示错误问题
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'
import re
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'
print(re.findall(r'dateRange=(.*?)%7C(.*?)&', url)[0])
52、list=[2,3,5,4,9,6],从小到大排序,输出[2,3,4,5,6,9],不能使用系统提供的排序方法
可以用插入排序或冒泡排序
53、写一个单例模式
class MetaClass(type):
def __call__(self, *args, **kwargs):
"""
self : class Singleton
"""
if not hasattr(self, "ins"):
insObject = super(__class__, self).__call__(*args, **kwargs)
setattr(self, "ins", insObject)
return getattr(self, "ins")
class Singleton(object, metaclass=MetaClass):
pass
if __name__ == "__main__":
ins = Singleton()
print(id(ins))
ins = Singleton()
print(id(ins))
54、输出保留两位小数
a = "%.03f"%1.3335
print(a)
55、求程序的打印结果
def fn(k, v, dict={}):
dict[k] = v
print(dict)
fn('one', 1)
fn('two', 2)
fn('three', 3, {})
{'one': 1}
{'one': 1, 'two': 2}
{'three': 3}
56、列出常见的状态码和意义
1xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。
| 代码 | 说明 |
|---|---|
| 100 | (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。 |
| 101 | (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。 |
2xx (成功)
表示成功处理了请求的状态代码。
| 代码 | 说明 |
|---|---|
| 200 | (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 |
| 201 | (已创建) 请求成功并且服务器创建了新的资源。 |
| 202 | (已接受) 服务器已接受请求,但尚未处理。 |
| 203 | (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。 |
| 204 | (无内容) 服务器成功处理了请求,但没有返回任何内容。 |
| 205 | (重置内容) 服务器成功处理了请求,但没有返回任何内容。 |
| 206 | (部分内容) 服务器成功处理了部分 GET 请求 |
3xx (重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。
| 代码 | 说明 |
|---|---|
| 300 | (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 |
| 301 | (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。 |
| 302 | (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 |
| 303 | (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。 |
| 304 | (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 |
| 305 | (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 |
| 307 | (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 |
4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。
| 代码 | 说明 |
|---|---|
| 400 | (错误请求) 服务器不理解请求的语法。 |
| 401 | (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 |
| 403 | (禁止) 服务器拒绝请求。 |
| 404 | (未找到) 服务器找不到请求的网页。 |
| 405 | (方法禁用) 禁用请求中指定的方法。 |
| 406 | (不接受) 无法使用请求的内容特性响应请求的网页。 |
| 407 | (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。 |
| 408 | (请求超时) 服务器等候请求时发生超时。 |
| 409 | (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。 |
| 410 | (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。 |
| 411 | (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。 |
| 412 | (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。 |
| 413 | (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 |
| 414 | (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。 |
| 415 | (不支持的媒体类型) 请求的格式不受请求页面的支持。 |
| 416 | (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。 |
| 417 | (未满足期望值) 服务器未满足”期望”请求标头字段的要求 |
5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。
| 代码 | 说明 |
|---|---|
| 500 | (服务器内部错误) 服务器遇到错误,无法完成请求。 |
| 501 | (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 |
| 502 | (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 |
| 503 | (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 |
| 504 | (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 |
| 505 | (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本 |
59、列出常见MYSQL数据存储引擎
InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的 完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择I n n o D B 有很 大的优势。如果需要频繁的更新、删除操作的数据库,也可以选择I n n o D B , 因为支持事 务的提交(commit)和回滚(rollback)。
MylSAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出 记录,那么选择MylSAM能实现处理高效率。如果应用的完整性、并发性要求比较低, 也可以使用。
MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很 快的读写速度,对数据的安全性要求较低,可以选择MEMOEYo它对表的大小有要求, 不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。