python110道基础面试题
1.一行代码实现1-100之和
1
| print(sum(range(1, 101)))
|
2.如何在一个函数内部修改全局变量
1 2 3 4 5 6 7 8 9
| a = 5 def fun(): global a a=3 fun() print(a)
|
3.列出5个python标准库
4.字典如何删除键和合并两个字典
1 2 3 4 5 6 7
| dict1={'name':'username', 'age':18} del dict1['name'] print(dict) dict2={'name':'ls'} dict1.update(dict2) print(dict1)
|
5.谈下python的GIL
GIL是python的全局解释器锁,同一 进程中加入有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁GIL),使该进程的其他线程无法运行,等该线程运行完后其他线程才能运行。如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行。所以在多线程,线程的运行仍是有先后顺序的,并不是同时进行的。
多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个Python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大
6.python实现列表去重的方法
1 2 3 4 5
| list=[1, 2, 4, 2, 6, 1, 1, 4] print(list) a = set(list) print(a)
|
7.fun(*args, **kwargs)
中的*args
,**kwargs
什么意思?
- 可变参数和key-value可变参数
-
*args
,**kwargs
主要用于函数定义,用于将不定量的参数传递给一个函数。
8.python2和python3的range(100)的区别
- python2返回列表
- python3返回迭代器,节约内存
9.一句话解释什么样的语言能够用装饰器
10.python内建数据类型有哪些
- 整型(int)
- 布尔型(bool)
- 字符串(str)
- 列表(list)
- 元祖(tuple)
- 字典(dict)
11.简述面向对象中__new__
和__init__
的区别
__init__
是初始方法,创建对象后,就立刻被默认调用了,可接受参数。
12.简述with方法打开处理文件帮我们做了什么
1 2 3 4 5 6 7
| file = open("", "wb") try: file.write("some text") except: pass finally: file.close()
|
- 打开文件读写时可能会出现一些异常的情况,如果按照常规的f.open写法,我们需要try, except, finally, 做异常判断,并且文件最终不管遇到什么情况,都会执行finally f.close() 关闭文件, with方法帮我们实现了finally中的f.close方法
13.列表[1,2,3,4,5], 请使用map()函数输出[1,4,9,16, 25]并使用列表推导式提取出大于10的数,最终输出[16,25]
- map()函数的第一个参数func, 第二个参数是一般的list, 第三个参数可以写list, 也可以不写,根据需要来。
1 2 3 4
| list=[1,2,3,4,5] result=map(lambda x:x**2, list) result=[i for i in result if i>10] print(result)
|
14.python中生成随机整数, 随机小数,0-1之间小数的方法
- 随机整数: random.randint(a, b),生成区间内的整数
- 随机小数:习惯用numpy库,利用np.random.randn(5)生成5个随机小数
- 0-1随机小数:random.random(),括号中不传参
1 2 3 4 5
| import random import numpy print(random.randint(10, 20)) print(numpy.random.randn(5)) print(random.random())
|
15.避免转义给字符串加那个字母表示原始字符串?
16.<div class="nam">中国</div>
,用正则匹配出标签里面的内容(“中国”),其中class的类名是不确定的
1 2 3 4
| import re str = '<div class="nam">中国</div>' res = re.findall(r'<div class=".*">'(.*?)</div>, str) print(res)
|
17.python中断言的方法举例
assert()
方法断言成功,则程序继续执行,断言失败,则程序报错
18.数据表student有id,name,score,city字段,其中name中的名字可有重复,需要消除重复行,请写sql语句
1
| select distinct name from student
|
19.10个Linux常用命令
- ls, pwd, cd, touch, rm, mkdir, tree, cp, mv, cat, more, grep, echo
20.python2和python3区别?列举5个
- Python3使用print必须以小括号包裹打印内容,print(“hello world”)
Python2既可以使用带小括号的方式,也可以使用空格分隔打印内容, print “hello world”
- Python2 range(1, 10) 返回列表
Python3 range(1, 10) 返回迭代器
- Python2中使用ascii编码,
Python3使用UTF-8编码
- Python2中Unicode表示字符串序列,str表示字节序列,
Python3中str表示字符串序列,byte表示字节序列
- Python2中为正常显示中文,需要引入coding声明
Python3中不需要
- Python2中输入是raw_input()函数
Python3中是input()函数
21.列出Python中不可变数据类型和不可变数据类型,并简述原理
22.s = "ajldjlajfdljfddd"
,去重并从小到大排序输出"adfjl"
1 2 3 4 5 6
| s = "ajldjlajfdljfddd" s = set(s) s = list(s) s.sort(reverse=False) res = "".join(res) print(res)
|
23.用lambda函数实现两个数相乘
1 2
| func = lambda x, y : x*y print(func(2,3))
|
24.字典根据键从小到大排序
dict={"name":"zs","age":18,"city":"深圳","tel":"1362626627"}
1 2 3 4 5 6 7
| dict={"name":"zs","age":18,"city":"深圳","tel":"1362626627"} list = sorted(dict.items(), key=lambda i:i[0], reverse=False) print(list) new_dict={} for i in list: new_dict[i[0]] = i[1] print(new_dict)
|
25.利用collections库的Counter方法统计字符串每个单词出现的次数”kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h”
1 2 3 4
| from collections import Counter a = "kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h" res=Counter(a) print(res)
|
26.字符串a = "not 404 found 张三 99 深圳"
,每个词中间是空格,用正则过滤掉英文和数字,最终输出"张三 深圳"
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
| import re
a = "not 404 found 张三 99 深圳" list = a.split(" ") print(list)
res = re.findall('\d+|[a-zA-Z]+', a)
for i in res: if i in list: list.remove(i) new_str = " ".join(list) print(new_str) ```
* filter函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回True或False,最后将返回True的元素放到新列表
```python a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] def func(num) return num%2==1 new_list = filter(func, a) print([i for i in new_list])
|
28.列表推导式求列表所有奇数并构造新列表,a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1 2 3
| a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] new_list = [i for i in a if i%2==1] print(new_list)
|
29.正则re.complie作用
re.compile是将正则表达式编译成一个对象,加快速度,并重复使用
30.a = (1,) b=(1),c=("1")
分别是什么类型的数据?
1 2 3 4 5 6 7
| a = (1,) b = (1) c = ("1")
print(type(a)) print(type(b)) print(type(c))
|
31.两个列表[1,5,7,9]
和[2,2,6,8]
合并为[1,2,2,3,6,7,8,9]
- extend可以将另一个集合中的元素逐一添加到列表中,区别于append整体添加
1 2 3 4 5
| list1 = [1, 5, 7, 9] list2 = [2, 2, 6, 8] list1.extend(list2) list1.sort(reverse=False) print(list1)
|
32.用python删除文件和用linux命令删除文件方法
- Python :
os.remove(file_name)
- linux命令:
rm file_name
33.log日志中,我们需要用时间戳记录error,warning等的发生时间,请用datetime模块打印当前时间戳 “2018-04-01 11:38:54”
1 2 3
| import datetime time_date=str(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + " 星期:" + str(datetime.datetime.now().isoweekday()) print(time_date)
|
34.数据库优化查询方法
35.请列出你会的任意一种统计图(条形图、折线图等)绘制的开源库,第三方也行
36.写一段自定义异常代码
1 2 3 4 5 6 7 8 9 10
| def try_except(): try: for i in range(5): if i > 2: raise Exception("数字不能大于2") except Exception as e: print(e)
try_except()
|
37.正则表达式匹配中,(.*)
和(.*?)
匹配区别?
(.*)
是贪婪匹配,会把满足正则的尽可能多的往后配
(.*?)
是非贪婪匹配,会把满足正则的尽可能少配
38.简述Django的orm
39.[[1,2],[3,4],[5,6]]
一行代码展开该列表,得出[1,2,3,4,5,6]
1 2 3
| list = [[1,2],[3,4],[5,6]] print([j for i in list for j in i ])
|
40.x="abc",y="def",z=["d","e","f"]
,分别求出x.join(y)
和x.join(z)
返回的结果
1 2 3 4 5
| x = "abc" y = "def" z = ["d", "e", "f"] print(x.join(y)) print(x.join(z))
|
41.举例说明异常模块中try except else finally
的相关意义
42.python中交换两个数值
43.举例说明zip()
函数用法
44.a=”李俊 98分”,用re.sub,将98替换为100
45.写5条常用sql语句
1 2 3 4 5 6
| show databases; show tables; desc 表名; select * from 表名; delete from 表名 where ? = ?; update students set gender=0, hometown=“bejing” where ? = ?
|
46.a="hello"
和b="你好"
编码成bytes类型
1 2
| a = b"hello" b = "你好".encode()
|
47.[1,2,3]
+[4,5,6]
的结果是多少?
48.提高python运行效率的方法
- 使用生成器, 因为可以节约大量内存
- 循环代码优化,避免过多重复代码的执行
- 核心模块用Cython PyPy等,提高效率
- 多进程,多线程,协程
- 多个if elif 条件判断,可以把最有可能发生的条件写在前面,可以减少程序判断的次数,提高效率
49.简述mysql和redis区别
- redis: 内存型非关系数据库,数据保存在内存中,速度快
- mysql: 关系型数据库,数据保存在磁盘中,检索的话,会有一定的IO操作,访问数据相对慢
50.遇到bug如何处理
51.正则匹配,匹配日期2018-03-20
52.list=[2,3,5,4,9,6]
,从小到大排序,不许用sort,输出[2,3,4,5,6,9]
53.写一个单例模式
54.保留两位小数
55.求三个方法打印结果
56.列出常见的状态码和意义
57.分别从前端、后端、数据库阐述web项目的性能优化
- 前端优化:
- 减少http请求、例如制作精灵图(使用精灵图减少图片存储, 懒加载)
- html和css放在页面上不, javascript放在页面下面,因为js加载比Html和css慢,所以要优先加载html和css,以防页面显示不全,性能差,也影响用户体验差
- 后端优化:
- 缓存存储读写次数搞,变化少的数据,比如网站首页的信息、商品的信息等。应用程序读取数据时,一般显示从缓存中读取,如果读取不到或数据已失效,再访问磁盘数据库,并将数据再次写入缓存。
- 异步方式,如果有耗时操作,可以采用异步,比如celery
- 代码优化,避免循环和判断次数太多,
- 数据库优化:
- redis缓存
- 建立索引,外键
58.使用pop和del删除字典中的"name"
字段,dic={"name":"zs","age":18}
59.列出常见MYSQL数据存储引擎
60.计算代码运行结果,zip函数历史文章已经说了,得出[("a",1),("b",2),("c",3),("d",4),("e",5)]
61.简述同源策略
62.简述cookie和session的区别
63.简述多线程、多进程
64.简述any()和all()方法
答案:(0,空字符串,空列表、空字典、空元组、None, False)
测试all()和any()方法
65.IOError、AttributeError、ImportError、IndentationError、IndexError、KeyError、SyntaxError、NameError分别代表什么异常
- IOError:输入输出异常
- AttributeError:试图访问一个对象没有的属性
- ImportError:无法引入模块或包,基本是路径问题
- IndentationError:语法错误,代码没有正确的对齐
- IndexError:下标索引超出序列边界
- KeyError:试图访问你字典里不存在的键
- SyntaxError:Python代码逻辑语法出错,不能执行
- NameError:使用一个还未赋予对象的变量
66.python中copy和deepcopy区别
67.列出几种魔法方法并简要介绍用途
__init__
:对象初始化方法
__new__
:创建对象时候执行的方法,单列模式会用到
__str__
:当使用print输出对象的时候,只要自己定义了__str__(self)
方法,那么就会打印从在这个方法中return的数据
__del__
:删除对象执行的方法
68.C:\Users\ry-wu.junya\Desktop>python 1.py 22 33
命令行启动程序并传参,print(sys.argv)会输出什么数据?
69.请将[i for i in range(3)]改成生成器
- 生成器是特殊的迭代器,
1、列表表达式的【】改为()即可变成生成器
2、函数在返回值得时候出现yield就变成生成器,而不是函数了;
中括号换成小括号即可,
70.a = “ hehheh “,去除收尾空格
a.lstrip()
a.rstrip()
71.举例sort和sorted对列表排序,list=[0,-1,3,-10,5,9]
72.对list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],使用lambda函数从小到大排序
73.使用lambda函数对list排序foo = [-5,8,0,4,9,-4,-20,-2,8,2,-4],输出结果为
74.列表嵌套字典的排序,分别根据年龄和姓名排序
1 2
| foo = [{"name":"zs","age":19},{"name":"ll","age":54}, {"name":"wa","age":17},{"name":"df","age":23}]
|
75.列表嵌套元组,分别按字母和数字排序
76.列表嵌套列表排序,年龄数字相同怎么办?
77.根据键对字典排序(方法一,zip函数)
78.根据键对字典排序(方法二,不用zip)
- 有没有发现dic.items和zip(dic.keys(),dic.values())都是为了构造列表嵌套字典的结构,方便后面用sorted()构造排序规则
79.列表推导式、字典推导式、生成器
80.最后出一道检验题目,根据字符串长度排序,看排序是否灵活运用
81.举例说明SQL注入和解决办法
- 当以字符串格式化书写方式的时候,如果用户输入的有;+SQL语句,后面的SQL语句会执行,比如例子中的SQL注入会删除数据库demo
- 解决方式:通过传参数方式解决SQL注入
82.s="info:xiaoZhang 33 shandong"
,用正则切分字符串输出['info', 'xiaoZhang', '33', 'shandong']
|
表示或,根据冒号或者空格切分
83.正则匹配以163.com结尾的邮箱
84.递归求和
1 2 3 4 5
| def fun_add(x): if x == 1 or x == 0: return 1 else: return x+fun_add(x-1)
|
85.python字典和json字符串相互转化方法
json.dumps()
:字典转json字符串,
json.loads()
:json转字典
86.MyISAM 与 InnoDB 区别:
- 1、
InnoDB
支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM
就不可以了;
- 2、
MyISAM
适合查询以及插入为主的应用,InnoDB
适合频繁修改以及涉及到安全性较高的应用;
- 3、
InnoDB
支持外键,MyISAM
不支持;
- 4、对于自增长的字段,
InnoDB
中必须包含只有该字段的索引,但是在 MyISAM表中可以和其他字段一起建立联合索引;
- 5、清空整个表时,
InnoDB
是一行一行的删除,效率非常慢。MyISAM
则会重建表;
87.统计字符串中某字符出现次数
1 2 3 4
| s = "Count, the number of spaces." print s.count(" ") x = "I like to program in Python" print x.count("i")
|
88.字符串转化大小写
89.用两种方法去空格
1 2 3
| str.split() filter(None, str.split(" ")) str.replace("", " ")
|
90.正则匹配不是以4和7结尾的手机号
91.简述python引用计数机制
92.int("1.4")
,int(1.4)
输出结果?
int('1.4')
:报错
int(1.4)
:强制转int, 输出1
93.列举3条以上PEP8编码规范
- 顶级定义之间空两行, 比如函数或者类定义
- 方法定义、类定义与第一个方法之间,都应该空一行
- 三引号进行注释
- 使用Pycharm、Eclipse一般使用4个空格来缩进代码
94.正则表达式匹配第一个URL
95.正则匹配中文
1 2 3 4
| """ python 3.5版本 正则匹配中文,固定形式:\u4E00-\u9FA5 """
|
96.简述乐观锁和悲观锁
97.r、r+、rb、rb+
文件打开模式区别
r
:read
b
:byte
w
:write
+
:read and write
a
:append
98.Linux命令重定向 >
和 >>
>
表示输出,文件写入内容,会覆盖原有的内容
>>
表示追加,会将内容追加到已有文件的末尾
99.正则表达式匹配出<html><h1>www.itcast.cn</h1></html>
100.python传参数是传值还是传址?
- python中的函数参数是引用传递(注意不是值传递)。对于不可变类型(数值型、字符串、元祖),因变量不能修改,所以运算不会影响变量自身;对于可变类型(列表字典)来说,函数体运算可能会更改传入的参数变量
101.求两个列表的交集、差集、并集
102.生成0-100的随机数
random.random()
生成0-1之间的随机小数,所以再乘以1001 2 3 4
| import random res1=100*random.random() res2=random.choice(range(0,101)) res3=random.randint(1, 100)
|
103.lambda匿名函数好处
- 精简代码,lambda省去了定义函数,map省去了写for循环过程
104.常见的网络传输协议
105.单引号、双引号、三引号用法
- 单引号和双引号具体使用上没有什么区别
- 如果直接用单引号包括单引号需要转义
- 三引号用于多行书写,常用语注释
106.python垃圾回收机制
- python垃圾回收主要以引用计数为主,标记-清除和分代清除为辅的机制,其中标记-清除和分代回收主要是为了处理循环引用的难题。
107.HTTP请求中get和post区别
- get:
- 请求通过URL直接请求数据,数据信息可以在url中看到
- 提交数据有大小的限制,一般是1024字节,http协议并没有设定URL字节长度的上线,主要是浏览器做了处理。
- 请求因为数据参数是暴露在URL中,所以安全性较低
- post:
- 请求放在请求头中,无法直接看到
- 一般没有数据限制,可以提交大量数据
- 请求参数放在请求头,安全性较高
108.python中读取Excel文件的方法
- 应用数据分析库:pandas
pandas.read_excel(file, converters="")
109.简述多线程、多进程、协程
- 进程:
- 操作系统进行资源分配和调度的基本单位,多个进程之间相互独立;
- 稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制。
- 线程:
- CPU进行资源费配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
- 如果IO操作秘籍,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃
- 应用:
- IO密集的用多线程,在用户输入,sleep的时候,可以切换到其他线程执行,减少等待的时间 (如:网络并发)
- CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势(如:复杂的大量科学计算)
110.python正则中search和match
- re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;
- re.search匹配整个字符串,直到找到一个匹配字符串