面试题 基础
自己不会的做记录
如何实现字符串的反转?name=”lzx”,请反转为name=’xzl’
name = 'lzx'
name = list(name)
name.reverse()
name ="".join(name)
print(name)
1,2,3,4,5 能组成多少互不相同且无重复的三位数
counter=0
for i in range(1,5):
for j in range(1,5):
for k in range(1,5):
if i !=j and j !=k and k !=i:
print("{}{}{}".format(i,j,k),end=" ")
counter +=1
print("")
print("共{}种组合".format(counter))
什么是反射,应用场景是什么
通过字符串映射object对象的方法或者属性 https://www.jianshu.com/p/628f61f01a54
直观点的例子 需求是这样的 需要从列表创建两个类的对象
深浅拷贝
python 垃圾回收机制
1 引用计数
2标记清除
3 分代
python 的可变与不可变类型
可变的 数组 和字典
不可变
求结果
v = {key1:666,key2:666]}
v = {key1:777,key2:666]}
一行代码删除列表中重复的值
set(list)
如何实现 “1,2,3,变成[1,2,3]
split()
如何用一行代码生存[1,4,9,16,25,36,49,64,81,100]
print([x**2 for x in range(11)])
常用的字符格式化有哪几种
1 format
2 %
什么是断言
assert
a = 8
assert(a>10)
print("被中断")
Traceback (most recent call last):
File "2.py", line 2, in <module>
assert(a>10)
AssertionError
有一个多层嵌套的列表A=[1,2,[3,4,[“434″,”323”]]] 请写一段代码遍历A中的元素
def extract_list(x):
for item in x:
if isinstance(item, list):
for i in extract_list(item):
yield i
else:
yield item
A=[1,2,[3,4,["434","323"]]]
print ([item for item in extract_list(A)])
a = range(10),a[::-3]的结果是
你以为的结果是
a = [0,1,2,3,4,5,6,7,8,9]
print(a[::-3])
[9, 6, 3, 0]
其实的结果的
range(9, -1, -3)
下面哪个命令可以从虚拟环境退出
exit
将列表内相同的元素合并成字典
lst = [1,2,4,8,16,32,64,128,256,512,1024,32769,65536,4294967296]
newdic={}
for i in lst:
keys = len(str(i))
if keys in newdic:
newdic[keys].append(i)
else:
newdic[keys] = [i,]
print(newdic)
请尽量用简洁的方法将二维数组转化成一唯数组
lst = [[1,2,3], [4,5,6], [7,8,9]]
print([i for item in lst for i in item])
import operator
from functools import reduce
a = [[1,2,3], [4,6], [7,8,9,8]]
print(reduce(operator.add, a))
将列表按下列规则排序,补全代码
1 正数在前负数在后
2 正数从小到大
3 负数从小到大
lst = [7, -8, 5, 4, 0, -2, -5]
print(sorted(lst,key=lambda x:(x<0, abs(x)) ))
哈希冲突回避算法有哪几种,分别有什么特点
https://zhuanlan.zhihu.com/p/29520044
简述Python的字符串驻留机制
字符串驻留是一种仅保存一份相同且不可变字符串的方法。
https://zhuanlan.zhihu.com/p/35362912
以下代码输出的是什么 ?list=[‘a’,’b’,’c’,’e’] print list [10:]
[]
Python 语言哪些可以 作为字典的key
一个对象能不能作为字典的key,就取决于其有没有hash方法。所以所有python自带类型中,除了list、dict、set和内部至少带有上述三种类型之一的tuple之外,其余的对象都能当key。
比如数值/字符串/完全不可变的元组/函数(内建或自定义)/类(内建或自定义)/方法/包等等你能拿出手的,不过有的实际意义不高。还有数值型要注意,因为两个不同的相等数字可以有相同的哈希值,比如1和1.0。
range xrange不一样
python2 中一个生成 list 一个是一个生成器
如下代码段的结果
import copy
a = [1,2,3,[4,5],6]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
b.append(10)
c[3].append(11)
d[3].append(12)
print(a) # [1,2,3,[4,5,11],6,11]
print(b) # 同a
print(c) # [1,2,3,[4,5,11],6]
print(d) # [1,2,3,[4,5,12],6]
现有字典d = {“a”:26,”g”:20,”e”:20,”c”:24,”d”:23} 请按照字段中的value 进行排序
#排序keys
d = {"a":26,"g":20,"e":20,"c":24,"d":23}
#排序keys
ret = sorted(d.items(), reverse=True)
print(ret)
给定两个listA,B请用Python找出相同元素,和不同元素
a=[1,2,3,4]
b=[1,5,6]
print(set(a)&set(b))
print(set(a)^set(b))
下列描述中错误的是C
线性结构是一个有序数据元素的集合。 其中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。
常用的线性结构有:线性表,栈,队列,双队列,数组,串。
非线性结构中各个数据元素不再保持在一个线性序列中,每个数据元素可能与零个或者多个其他数据元素发生联系。根据关系的不同,可分为层次结构和群结构。
常见的非线性结构有:二维数组,多维数组,广义表,树(二叉树等),图。(其中多维数组是由多个一维数组组成的,所以不再是线性结构)
A 栈是线性的
B 队列是线性的
C 二叉树是线性结构
D 线性列表是线性结构
一个栈的输入序列为1,2,3,4,5 则下列序列中不可能是栈的输出序列的是
B
A 1 5 4 3 2
B 2 3 4 1 5
C 1 5 4 2 3
D 2 3 1 4 5
那个PEP被认为涉及到代码规范
PEP8
下面哪些是python的合法标识符 那些是关键字
1 int32 关键字
2 40Xl 不能数字开头
3 saving$ 特殊符号
4 print 关键字
5 this 合法的 python 没有 this
6 self 合法的
7 0x40l 不能数字开头
8 true 合法的
9 big-daddy
10 True 关键字
11 if 关键字
12 do 合法的
13 yield 关键字
从0-99这100个数中随机取出10个,要求不能重复,可以设计数据结果
import random
a = [ x for x in range(100)]
while len(a) > 90:
print(a.pop(random.randint(0, 99)))
python 判断一个字典中是否有这些key:”AAA”,”BB”,”C”,”DD”,”EEE”
k in dic.keys()
有一个list[“This”,”is”,”a”,”Boy”],所有元素都是字符串,对他们进行大小写无关的的排序
lst = ["This","is","a","Boy"]
print(sorted(x.lower()for x in lst ))
print(sorted(lst, key = lambda x:x.lower()))
描述下dict的item()方法与iteritems()的不同
- 字典的items方法作用:是可以将字典中的所有项,以列表方式返回。因为字典是无序的,所以用items方法返回字典的所有项,也是没有顺序的。
- 字典的iteritems方法作用:与items方法相比作用大致相同,只是它的返回值不是列表,而是一个迭代器。iteritems()方法在需要迭代结果的时候使用最适合,而且它的工作效率非常的高。
- 在Python 3.x 里面,iteritems()方法已经废除了。
请列举你所知道的Pytho代码检测工具以及他们之间的不同
- pylint — 源代码分析器,可以分析python代码中的错误
- pyflakes — 检查源文件错误的简单程序,不会检查代码风格。
- pep8 — 检查代码规范的工具
- pyhecker是一个python代码静态分析工具,它可以帮助python代码找bug会对代码的复杂度提出警告
介绍一下try except 的用法和作用
用于 异常处理
输入一个字符串,返回倒序排列的结果
(1)切片(2)列表的reverse(3)reduce函数
阅读以下代码,并写出程序的输出结果
alist = [2, 4, 5, 6, 7]
for var in alist:
print(var%2)
if var %2 == 0:
alist.remove(var)
print(alist)
[4,5,7]
现有列表alist=[3,1,-4,-2],按照元素的绝对值进行排序
alist=[3,1,-4,-2]
print(sorted(alist, key=lambda x: abs(x)))
填空题
1 表达式 3<4<5 是哪个表达式的缩写** 3<4 and 4<5**
2 获取Python 解析器的版本的方法是 python3 -V
3 如果模块是导入的,__name__ 的值是 **模块的名字**
如果是被执行的__name__的值是 **__main__**
4 Python 的内存管理中,为了追踪内存的对象,使用了 **引用计数** 这一简单技术
现有字典mydic和变量onekey 请写出从mydic中取出onekey值的方法(不止一种写法,多写加分,并请描述不同写法的区别,mydic中是否存在onekey的键值不确定)
mydict[‘onekey’] 这种获取方式如果键不存在就会报错mydict.get(‘onekey’)
这种获取方式如果键不存在就返回None 我们可以自定义返回值
mydict.setdefault(‘onekey’)
这种方式也是查看键在字典中是否存在,不存在就返回None
if ‘onekey’ in mydict: 这种方式是利用字典的键来进行校验是否存在
现有一列表alist,请写出两种去除alist重复元素的方法
其中 要保持原有列表中的元素的排列顺序 无需考虑原有列表中元素的排列顺序
alist=[2,34,6,8,9,7,3,2]
2 # – 要求保持原有列表中元素的排列顺序。
3 L=[]
4 for i in alist:
5 if i not in L:
6 L.append(i)
7
8 # – 无需考虑原有列表中元素的排列顺序。
9 list(set(alist))
那些情况下, y! = x-(x-y) 成了
x,y是两个不相等的非空集合
用 Python 实现 99 乘法表(用两种不同的方法实现)
1 #方式一:for循环
2 for i in range(1,10):
3 for j in range(1,i+1):
4 print(f"{i}x{j}={i*j}\t",end='\n' if j==i else '' )
5 #方式二:while循环
6 i=1
7 while i <10:
8 j=1
9 while j<=i:
10 print(f"{i}x{j}={i*j}\t",end='\n' if j==i else '' )
11 j+=1
12 i+=1
13 #方式三:列表的推导式
14 print('\n'.join(['\t'.join([f"{i}x{j}={i*j}" for j in range(1,i+1)]) for i in range(1,10) ]))
获取list中元素的个数,和向末尾追加所有用的分别是什么
len()
append()
判断dict中有没有某个key用的方法是什么
has_key 现在没有了 现在用 key in dict 的方法
填空
l = range(100)
1 如何取第一到第三元素用的是 l[0:3]
2 如何取倒数第二个元素 l[-2]
3 如何取后十个 l[-10:-1]
如何判断一个变量是否是字符串
type()
isinstance()
list tuple 有什么的
list是一个可变的数据结构,能够进行增删改
tuple是一个不可变的数据结构,不能够进行增删改,可以存放一些重要的数据
a = dict(zip((“a”,”b”,”c”,”d”,”e”),(1,2,3,4,5))) 请问 a 是什么?
{‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5}
一行代码 生成列表[1,4,9,16,25,36,49,64,81,100]
x**2 for x in range(1,101)
以下描述正确的是 B
A continue 语句的作用是结束整个循环的执行 continue 只是结束单次
B 只能在循环体和switch 语句内使用break 语句
C. 在循环体内使用 break语句或者 continue语句的作用相同 Break 全部跳出
D. 从多层循环嵌套中退出时, 只能使用 goto语句
写结果
x = "foo"
y = 2
print(x+y)
会爆错
求结果
kvps = {“1″:1,”2”:2}
2. theCopy = kvps
3. kvps[“1”] = 5
4. sum = kvps[“1”] + theCopy [“1”]
5. print sum
浅拷贝
10
python 里如何实现tuple 和list的转化
list(tuple)
tuple(list)
type(1+2L*3.14)的结果是
float
若K为整型,下列while循环的执行次数是
2 * 2 10次数1024
1. k = 1000
2. while k>1:
3. print k
4. k = k/2
python3中 循环执行次数是10次
python2中 循环执行次数是9次
以下哪个不是合法的布尔表达式
3=a == 比值 = 是赋值运算
python 不支持的数据类型有
char
如何在 Python 中拷贝一个对象, 并说明他们之间的区别?
用[:]这样就可以进行拷贝一个对象,这个是浅拷贝
使用copy模块 copy.copy这是浅拷贝
使用copy模块 copy.deepcopy 这是深拷贝
浅拷贝就是拷贝对象的一层元素.
深拷贝是拷贝对象里的多层元素
99(10进制)的八进制
print(oct(99))
下列Python 语句正确的是
1 min = x is x<y = y
2 max = x>y?x:y python 没有三元
3 if(x>y) print x 少:
4 while True:pass
list 对象 alist =[{‘name’:’a’,’age’:20},{‘name’:’b’,’age’:30},{‘name’:’v’,’age’:25},]按 alist 中元素的 age 由大到小排序。
alist = [{'name': 'a', 'age': 20}, {'name': 'b', 'age': 30}, {'name': 'v', 'age': 25}, ]
2 print(sorted(alist,key=lambda x:x['age']))
关于Python程序的运行性能方面,有什么手段提升性能
- 多进程,充分利用机器的多核性能
- 性能影响较大的部分代码,可以使用C或C++编写
- IO阻塞造成的性能影响,可以使用IO多路复用来解决
- 使用Python的内建函数5、尽量使用局部变量
Python是如何进行内存管理的?Python的程序会内存泄漏嘛,说说有没有什么方面阻止或检测内存泄漏
Python GC主要使用 引用计数 来跟踪和回收垃圾。在引用计数的基础上,通过“标记-清除”解决容器对象可能产生的循环引用问题。通过分代
以空间换时间的方法提高垃圾回收效率
引用计数: 每个对象中都有ob-refcnt来做引用计数。当一个对象…,ob-refcnt就会增加,当引用的对象删除,那么ob-refcnt就会减少当ob-refcnt为零,就会释放该对象的内存空间
标记清除: 解决循环引用的问题。先按需分配,等到没有空闲内存的时候,从寄存器和程序栈上的引用出发,遍历所有对象和引用把所有能访问的打标记,最后将没有标记的对象释放掉
分代技术: 提高效率,提高垃圾回收的效率,按照存活时间,分成不同的集合。将内存块按照其存活时间划分为不同的集合。每个集合就称为一个“代”,垃圾回收的频率随代的存活时间增大而减小。Python默认定义分代对象集合,引用数越大,对象的存活时间越长
Python也会内存泄露,Python本身的垃圾回收机制无法回收重写了del的循环引用的对象.
程序员管理好每个python对象的引用,尽量在不需要使用对象的时候,断开所有引用
尽量少通过循环引用组织数据,可以改用weakref做弱引用或者用id之类的句柄访问对象
通过gc模块的接口可以检查出每次垃圾回收有哪些对象不能自动处理,再逐个逐个处理
详细说说tuple,list ,dict 的用法,他们的特点
list 是常用的数据结构 一个列表可以切片,删除,添加,排序元素
tuple 是不可变的列表
dict 是字典 利用键值段儿进行取值
一个大小为10g 的文件etl_log.txt,要读取文件中的内容,写出具体过程代码
可以使用生成器的方式节约内存
xreadlines
with open("",'r') as f:
for line in f:
print(line)
已知Alist = [1,2,3,1,2,1,3] 如果根据Alist 得到[1,2,3]
Alist = [1,2,3,1,2,1,3]
print(list(set(Alist)))
已知Alist[“a”,”b”,”c”],将Alist 转化为a,b,c的实现过程
Alist = ["a","b","c"]
s = ",".join(Alist)
print(s)
已知ip = ‘192.168.0.100’ 代码实现提取各部分并写入列表
ip = '192.168.0.100'
print(ip.split('.'))
python 代码如何获取命令行参数
args
写代码
tupleA = ('a', 'b', 'c', 'd', 'e')
tupleB = (1, 2, 3, 4, 5)
dic = {}
for i in range(len(tupleA)):
dic[tupleA[i]] = tupleB[i]
print(dic)
RES = {"a":1,"b":2,"c":4,"d":4,"e":5}
tupleA = ('a', 'b', 'c', 'd', 'e')
tupleB = (1, 2, 3, 4, 5)
print(dict(zip(tupleA,tupleB)))
选出一下表达式正确的选项
k = {1:0,2:0,3:0}
k2 = {'1':0,'2':0,'3':0}
# k3 = {(1,2):0,(4,3):0}
# k4 = {[1,2]:0,[4,3]:0}
# k5 = {{1,2}:0,{4,3}:0}
what get printed()?
kvps = {"1":1,"2":2}
theCopy = kvps.copy()
kvps["1"] = 5
sum = kvps["1"]+theCopy["1"]
print(sum) 6
what get printed()?
numbers = [1,2,3,4]
numbers.append([5,6,7,8])
print(len(numbers))
5
what get printed()?
names1 = ["Amir", "Barry", "Chaies", "Dao"]
if "amir" in names1:
print(1)
else:
print(2)
2
what getsprint() Asssuming python verson2.x
>>> print(type(1/2))
<type 'int'>
用来管理Python库管理工具的是
pip
which numbers are printed ?
for i in range(2):
print(i)
for i in range(4,6):
print(i)
0,1,4,5
求结果
Math.floor() === 向下取整
import math
print(math.floor(5.5))
5
关于Python的内存管理,下列说法错误
B
A 变量不用事先声明
B 变量无需先创建和赋值而直接使用 必然报错啊
C 变量无需指定类型
D 可以使用del释放资源
下面那个不是Python合法的标识符
B
A int32
B 40xl
C self
D name
下列表达为True的是
c 只在2.x 版本
A 5+4j >2-3j
B 3>2>2
C (3,2)<(“a”,”b”)
D ” abc” > “xyz”
关于Python的复数,下列说法错误的是
C
A 表示复数的语法岁real+imagej
B 实部和虚部都是浮点数
C 虚部后缀必须是j,并且小写
D 方法conjugate 返回复数的共轭复数
关于字符串说法错误的是 A
A 字符应该视为长度位1的字符串
B 字符串以\0的标志字符串的结束
C 即可以用单引号们,也可以用双引号创建字符串
D
以下不能创建一个字典的语句是
C D
A dic1 = {}
B dic2 = {3:5}
C dic3 = {[1,2,3],”usetc”}
D dic4 = {(1,2,3):”usetc”}
描述在Python中的元祖,列表,字典的区别
选择结果
names1 = ["Amir", "Barry", "Chales", "Dao"]
names2 = names1
#拷贝
names3 = names1[:]
names2[0] = "Alice"
names3[1] = "Bob"
sum = 0
for ls in (names1, names2,names3):
if ls[0] == "Alice":
sum += 1
if ls[1] == "Bob":
sum+=10
print(sum)
#12 两次 一样的值
下面程序的输出结果是
x = True
y = False
z =True
if x or y and z:
print("yes")
else:
print("No")
yes
1 or 2 和 1 and 2 的输出分别是什么 为什么
print(1 or 2)
print(1 and 2)
1
2
1 <(2==2) 和 1<2 ==2 的结果分别是什么
print(1 <(2==2)) false
print(1 <2 == 2) true
如何打乱一个排好序的list 对象alist
import random
alist= [1, 2, 3, 4, 5]
random.shuffle(alist)
print(alist) # alist会被改变
import random
alist = [1, 2, 3, 4, 5]
blist = random.sample(alist, len(alist))
print(blist) # alist未改变
如何查找一个字符串中特定字符?find 和index的差异?
find()方法:查找子字符串,若找到返回从0开始的下标值,若找不到返回-1
info = 'abca'
print info.find('a')##从下标0开始,查找在字符串里第一个出现的子串,返回结果:0
info = 'abca'
print info.find('a',1)##从下标1开始,查找在字符串里第一个出现的子串:返回结果3
info = 'abca'
print info.find('333')##返回-1,查找不到返回-1
python 的index方法是在字符串里查找子串第一次出现的位置,类似字符串的find方法,不过比find方法更好的是,如果查找不到子串,会抛出异常,而不是返回-1
info = 'abca'
print info.index('a')
print info.index('33')
把aaabbcccd 这种形式的字符串压缩成a3b2d1这种形式
Python 一个数如果恰好等于它的因子之和,这个数称为完数例如 6 = 1+2+3 编程找出1000以内的所有完数
for i in range(2, 1000):
4 l1 = []
5 for j in range(1,i):
6 if i % j == 0:
7 l1.append(j)
8 num = sum(l1)
9 if num == i:
10 print "%d ="%i,
11 for i in range(len(l1)):
12 if i == len(l1) - 1:
13 print l1[i]
14 else:
15 print "%d +"%l1[i],
输入一个字符串,输出该字符串中字符的所有组合
执行以下代码后 i 和 n 的值为
int i =10
int n = i++ %5
i = 11
n = 1