python110道基础面试题

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

1
print(sum(range(1, 101)))

2.如何在一个函数内部修改全局变量

1
2
3
4
5
6
7
8
9
#利用global修改全局变量

a = 5
def fun():
global a
a=3

fun()
print(a)

3.列出5个python标准库

1
2
3
4
5
#os:操作系统相关的函数
#re:正则匹配
#datetime: 处理日期操作
#math:数学运算
#sys:处理日期时间

4.字典如何删除键和合并两个字典

  • del和update方法
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))#生成5个随机小数
print(random.random())#不能传数值

15.避免转义给字符串加那个字母表示原始字符串?

  • r 表示需要原始字符串,不转义特殊字符

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个

  1. Python3使用print必须以小括号包裹打印内容,print(“hello world”)
    Python2既可以使用带小括号的方式,也可以使用空格分隔打印内容, print “hello world”
  2. Python2 range(1, 10) 返回列表
    Python3 range(1, 10) 返回迭代器
  3. Python2中使用ascii编码,
    Python3使用UTF-8编码
  4. Python2中Unicode表示字符串序列,str表示字节序列,
    Python3中str表示字符串序列,byte表示字节序列
  5. Python2中为正常显示中文,需要引入coding声明
    Python3中不需要
  6. Python2中输入是raw_input()函数
    Python3中是input()函数

21.列出Python中不可变数据类型和不可变数据类型,并简述原理

  • 不可变数据类型:数值型,字符串string,和tuple

    • 不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存则只有一个对象(一个地址),如下图用id()方法可以打印对象id
  • 可变数据数据类型:列表list和字典dict

    • 允许变量的值发生变化,即如果对变量进行append、+=操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址不会变化,不过对于相同值的不同兑现个,在内存中则会存在不同的对象,即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多分,这里不存在引用计数,是实实在在的对象

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)
```

#### 27.filter方法求出列表所有奇数并构造新列表,`a=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]`

* filter函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回TrueFalse,最后将返回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)) # <class 'tuple'>
print(type(b)) # <class 'int'>
print(type(c)) # <class 'str'>

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.请列出你会的任意一种统计图(条形图、折线图等)绘制的开源库,第三方也行

  • pychart
  • matplotlib

36.写一段自定义异常代码

  • 自定义异常用raise抛出
1
2
3
4
5
6
7
8
9
10
#raise自定义异常
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()函数用法

1
#TODO

44.a=”李俊 98分”,用re.sub,将98替换为100

1
#TODO

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]的结果是多少?

1
#TODO

48.提高python运行效率的方法

  1. 使用生成器, 因为可以节约大量内存
  2. 循环代码优化,避免过多重复代码的执行
  3. 核心模块用Cython PyPy等,提高效率
  4. 多进程,多线程,协程
  5. 多个if elif 条件判断,可以把最有可能发生的条件写在前面,可以减少程序判断的次数,提高效率

49.简述mysql和redis区别

  • redis: 内存型非关系数据库,数据保存在内存中,速度快
  • mysql: 关系型数据库,数据保存在磁盘中,检索的话,会有一定的IO操作,访问数据相对慢

50.遇到bug如何处理

51.正则匹配,匹配日期2018-03-20

1
#TODO

52.list=[2,3,5,4,9,6],从小到大排序,不许用sort,输出[2,3,4,5,6,9]

1
#TODO min()

53.写一个单例模式

54.保留两位小数

55.求三个方法打印结果

56.列出常见的状态码和意义

57.分别从前端、后端、数据库阐述web项目的性能优化

  • 前端优化:
    1. 减少http请求、例如制作精灵图(使用精灵图减少图片存储, 懒加载)
    2. html和css放在页面上不, javascript放在页面下面,因为js加载比Html和css慢,所以要优先加载html和css,以防页面显示不全,性能差,也影响用户体验差
  • 后端优化:
    1. 缓存存储读写次数搞,变化少的数据,比如网站首页的信息、商品的信息等。应用程序读取数据时,一般显示从缓存中读取,如果读取不到或数据已失效,再访问磁盘数据库,并将数据再次写入缓存。
    2. 异步方式,如果有耗时操作,可以采用异步,比如celery
    3. 代码优化,避免循环和判断次数太多,
  • 数据库优化:
    1. redis缓存
    2. 建立索引,外键

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()方法

  • any():只要迭代器中有一个元素为真就为真

  • all():迭代器中所有的判断项返回都是真,结果才为真

  • python中什么元素为假?

答案:(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.字符串转化大小写

1
2
str.upper()
str.lower()

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编码规范

  1. 顶级定义之间空两行, 比如函数或者类定义
  2. 方法定义、类定义与第一个方法之间,都应该空一行
  3. 三引号进行注释
  4. 使用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之间的随机小数,所以再乘以100
    1
    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.常见的网络传输协议

  • UDP、TCP、FTP、HTTP、SMTP等等

105.单引号、双引号、三引号用法

  1. 单引号和双引号具体使用上没有什么区别
  2. 如果直接用单引号包括单引号需要转义
  3. 三引号用于多行书写,常用语注释

106.python垃圾回收机制

  • python垃圾回收主要以引用计数为主,标记-清除分代清除为辅的机制,其中标记-清除和分代回收主要是为了处理循环引用的难题。
  • 引用计数算法

107.HTTP请求中get和post区别

  • get:
    1. 请求通过URL直接请求数据,数据信息可以在url中看到
    2. 提交数据有大小的限制,一般是1024字节,http协议并没有设定URL字节长度的上线,主要是浏览器做了处理。
    3. 请求因为数据参数是暴露在URL中,所以安全性较低
  • post:
    1. 请求放在请求头中,无法直接看到
    2. 一般没有数据限制,可以提交大量数据
    3. 请求参数放在请求头,安全性较高

108.python中读取Excel文件的方法

  • 应用数据分析库:pandas
    pandas.read_excel(file, converters="")

109.简述多线程、多进程、协程

  • 进程:
    1. 操作系统进行资源分配和调度的基本单位,多个进程之间相互独立;
    2. 稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制。
  • 线程:
    1. CPU进行资源费配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
    2. 如果IO操作秘籍,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃
  • 应用:
    1. IO密集的用多线程,在用户输入,sleep的时候,可以切换到其他线程执行,减少等待的时间 (如:网络并发)
    2. CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势(如:复杂的大量科学计算)

110.python正则中search和match

  • re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;
  • re.search匹配整个字符串,直到找到一个匹配字符串