Python常见面试题(一)
1.Python2中的range和Python3中的range的区别?
python2中的range返回的是一个列表,直接创建内容 python3中的range返回的是一个迭代值,只有for循环时,内容才一个一个创建
2.实现一个整数加法计算器:
情形一:输入两个数,形如a+b
方法1:
content = input('请输入内容:') print(eval(content))

方法2:
content = input('请输入内容:') sum = int(content.split('+')[0]) + int(content.split('+')[1]) print(sum)

情形二:输入多个数,形如a+b+c+d
sum = 0 content = input('请输入内容:') li = content.split('+') for i in li: sum += int(i.strip()) print(sum)

扩展:用户输入随机个数的数字,输入的数两两相加,将最终结果添加在字典中。用到reduce函数
from functools import reduce # 导入函数 # 自定义两两相加的函数f() def f(x,y): return x + y dic={'最终结果':None,} L=[] while True: a=input('请输入一个数,结束请输Q.') if a=='Q': break elif a.isdigit(): #isdigit()判断字符串是否由数字组成 a=int(a) L.append(a) else: print('请重新输入数字') dic['最终结果']=reduce(f,L)
3.计算用户输入的内容中有几个十进制数?几个字母?
content = input('请输入内容:') number = 0 string = 0 for i in range(len(content)): if content[i].isdecimal(): number += 1 if content[i].isalpha(): string += 1 print('十进制数%s,字母数:%s'%(number,string))

4.如有一下变量 n1 = 5,请使用 int 的提供的方法,得到该变量最少可以用多少个二进制位表示?
n1 = 5 print(n1.bit_length()) # 3 print(bin(5)) # 查看一个数的二进制数使用bin()方法
5.简述位、字节的关系
1个byte = 8bit
在ASCII表中,一共有255个字符,一个字符占8位。
6.简述ascii、unicode、utf-‐8、gbk 的关系
- 最初的计算机是由美国人发明的,制定了一张包含他们能用到的所有字符和计算机能理解的数字的对应关系ASCII。
- 随着计算机的发展和普及,各国都制定了自己的编码,那么ASCII也容纳不了且无法形成统一标准,就推出了Unicode(万国码)。
- utf-8是可变长的编码,是unicode原本占2个字节的英文被编码成1个字节,汉字是3个字节,生僻的字符占4-6个字节,节省了传输英文编写文档的空间。
- gbk是中国人自己的字符集,容纳了2万1千多个字符。
7.请写出“张三”分别用utf-‐8 和gbk 编码所占的位数
utf-8用3个字节表示1个汉字,gbk用2个字节。所以,张三用utf-‐8 和gbk 编码所占的位数分别是6和4。
8.python中is和==的区别?
python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)、value(值)
- ==是python中的比较运算符,用来比较两个对象的value值是否相等;
- is 也被叫做同一性运算符,比较判断的是对象间的唯一身份标识,也就是id是否相同
注:
- 只有在数值型和字符串的情况下,a is b才为True;
- 当a和b是tuple,list,dict或set型时,a is b为False
9. 现有如下两个变量,请简述n1和n2是什么关系?
n1=123
n2=123
n1和n2指向同一块内存地址,数值是123
10. 现有如下两个变量,请简述n1和n2是什么关系?
n1=123456
n2=123456
开辟了2个内存地址存放数据123456,并分别起了个名称为n1和n2.
11.现有如下两个变量,请简述n1和n2是什么关系?
n1=123456
n2=n1
给数据123456起了另外一个别名n2,相当于n1和n2都指向该数据的内存地址.
12.可变对象与不可变对象
元祖(tuple)、数值型(number)、字符串(string)均为不可变类型 字典(dic)和列表(list)对象是可变类型 可以通过id体现 def test(a=[]): a.append(1) print(a) 连续多次调用test函数,输出什么? 参考博文http://www.cnblogs.com/evening/archive/2012/04/11/2442788.html
13.去除一个列表中的重复内容,原顺序不变
注意,使用set去重后,顺序后发生变化
方法1:
a = ['a','e','b','c','c','d'] a1 = list(set(a)) a1.sort(key=a.index) print(a1) # ['a', 'e', 'b', 'c', 'd'] # 或 a2 = sorted(set(a),key=a.index) print(a2) # ['a', 'e', 'b', 'c', 'd']
方法2:定义临时空列表,遍历原始列表,保存不重复的元素,最后打印临时列表。
li1 = ["a", "a", "a", "b", "b", "c", "d", "d", "f"] li2 = [] for i in li1: # 遍历原列表,判断如果元素不在临时列表,就追加进去,如果在,就不加。 if i not in li2: li2.append(i) print(li2) # ['a', 'b', 'c', 'd', 'f']
方法3:双重循环,外层循环遍历列表,内存循环控制删除重复元素的次数。如果元素个数统计大于1,则执行删除。
li = ["a", "a", "a", "b", "b", "c", "d", "d", "f"] li.reverse() # 先反转列表,从后往前删 for i in li: # 外层循环控制每次需要判定的元素 for _ in range(li.count(i)): # 内层循环控制每次执行删除元素的次数,循环多次就彻底删除。 if li.count(i) > 1: li.remove(i) # 如果该元素个数大于1,则执行删除操作 li.reverse() # 最后再反转列表,保证第一次出现的元素顺位保留下来 print(li) # ['a', 'b', 'c', 'd', 'f']
14.用sort进行排序,从最后一个元素开始判断a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3] a.sort() # a = [0, 1, 2, 2, 3, 4, 4, 5, 5, 5, 7, 7, 8, 9, 10] last=a[-1] for i in range(len(a)-2,-1,-1): if last==a[i]: del a[i] else:last=a[i] print(a) # [0, 1, 2, 3, 4, 5, 7, 8, 9, 10]
15.请写出一段Python代码实现删除一个list里面的重复元素
# 1,使用set函数 set(list) # 2,使用字典函数, a=[1,2,4,2,4,5,6,5,7,8,9,0] b={} b=b.fromkeys(a) print(b) # {1: None, 2: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None, 0: None} c=list(b.keys()) print(c) # [1, 2, 4, 5, 6, 7, 8, 9, 0]
16. Python里面如何拷贝一个对象?(赋值,浅拷贝,深拷贝的区别)
- 赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个;
- 浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数};
- 深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变){copy模块的deep.deepcopy()函数};
17、写代码
a.实现用户输入用户名和密码,当用户名为seven且密码为123时,显示登陆成功,否则登陆失败。
user = input("Username: ").strip() passwd = input("Password: ").strip() if user == "seven" and passwd == "123": print("Welcome to back,",user) else: print("Incorrect username or password!")
b.实现用户输入用户名和密码,当用户名为seven且密码为123时,显示登陆成功,否则登陆失败,失败时允许重复输入三次
for i in range(3): user = input("Username: ").strip() passwd = input("Password: ").strip() if user == "seven" and passwd == "123": print("Welcome to back,",user) break else: print("Incorrect username or password!")
18.写代码
a.使用while 循环实现输出2‐3+4‐5+6...+100的和
b.使用for 循环和range 实现输出1-2+3‐4+5‐6...+99的和
num = 0 for i in range(99): if i % 2 == 0: num = num - i else: num = num + i print(num)
c.使用while 循环实现输出1,2,3,4,5,7,8,9,11,12
i = 0 while i < 12: i +=1 if i == 6 or i == 10: continue else: print(i)
d.使用while 循环实现输出1-‐100内的所有奇数
i = 1 while i<=100: if i % 2 != 0: print(i) i += 1
e.使用while 循环实现输出1-‐100内的所有偶数
i = 1 while i<=100: if i % 2 == 0: print(i) i +=1
19.分别书写数字5,10,32,7 的二进制表示
print(bin(5)) print(bin(10)) print(bin(32)) print(bin(7)) ''' 0b101 0b1010 0b100000 0b111 ''' 101 1010 100000 111
20、写代码,有如下变量,请按照要求实现每个功能
name=" aleX"
a.移除name 变量对应的值两边的空格,并输入移除后的内容
print(name.strip())
b.判断name 变量对应的值是否以"al"开头,并输出结果
print(name.startswith("al")) # False
c.判断name 变量对应的值是否以"X"结尾,并输出结果
print(name.endswith("X")) # True
d.将name 变量对应的值中的“l”替换为“p”,并输出结果
print(name.replace("l","p")) # apeX
e.将name 变量对应的值根据“l”分割,并输出结果。
print(name.split("l")) # [' a', 'eX']
f.请问,上一题e分割之后得到值是什么类型?
列表
g.将name 变量对应的值变大写,并输出结果
print(name.upper()) # ALEX
h.将name 变量对应的值变小写,并输出结果
print(name.lower()) # alex
i.请输出name 变量对应的值的第2 个字符?
print(name[1]) # a
j.请输出name 变量对应的值的前3 个字符?
print(name[:3]) # al
k.请输出name 变量对应的值的后2 个字符?
print(name[-2:]) # eX
l.请输出name 变量对应的值中“e”所在索引位置?
print(name.index("e")) # 3
21、字符串是否可迭代?如可以请使用for 循环每一个元素?
name = " aleX" for i in name: print(i)
22、请用代码实现:利用下划线将列表的每一个元素拼接成字符串,li=['alex','eric','rain']
li = ["alex","eric","rain"] for i in li: print("_".join(i)) 执行结果 a_l_e_x e_r_i_c r_a_i_n
23、写代码,有如下列表,按照要求实现每一个功能
li=['alex','eric','rain']
a.计算列表长度并输出
print(len(li)) # 3
b.列表中追加元素“seven”
li.append("seven")
c.请在列表的第1个位置插入元素“Tony”
li.insert(0,"Tony")
d.请修改列表第2个位置的元素为“Kelly”
li[1] = "Kelly"
e.请删除列表中的元素“eric”
li.remove("eric")
f.请删除列表中的第2个元素
li.pop(1)
g.请删除列表中的第3个元素
li.pop()
h.请删除列表中的第2 至4 个元素
del li[1:]
i.请将列表所有的元素反转,并输出反转后的列表
li.reverse()
j.请使用for、len、range 输出列表的索引
li = ["alex","eric","rain"] for index in range(len(li)): print(index,li[index])
执行结果 0 alex 1 eric 2 rain
k.请使用enumrate 输出列表元素和序号(序号从100 开始)
li = ["alex","eric","rain"] for index,value in enumerate(li,100): print(index,value) 执行结果 100 alex 101 eric 102 rain
l.请使用for 循环输出列表的所有元素
li = ["alex","eric","rain"] for i in li: for item in i: print(item) 执行结果 a l e x e r i c r a i n
24、写代码,有如下列表,请按照功能要求实现每一个功能
li=["hello",'seven',["mon",["h","kelly"],'all'],123,446]
a.请输出“Kelly”
print(li[2][1][1])
b.请使用索引找到'all'元素并将其修改为“ALL”
li[2][2] = "ALL"
25、写代码,有如下元组,按照要求实现每一个功能
tu=('alex','eric','rain')
a.计算元组长度并输出
print(len(tu))
b.获取元组的第2个元素,并输出
print(tu[1])
c.获取元组的第1--‐2个元素,并输出
print(tu[:2])
d.请使用for、len、range 输出元组的索引
tu = ("alex","eric","rain") for index in range(len(tu)): print(index,tu[index]) 执行结果 0 alex 1 eric 2 rain
e.请使用enumrate 输出元祖元素和序号(序号从10 开始)
tu = ("alex","eric","rain") for index,values in enumerate(tu,10): print(index,values) 执行结果 10 alex 11 eric 12 rain
26、有如下变量,请实现要求的功能
tu=("alex",[11,22,{"k1":'v1',"k2":["age","name"],"k3":(11,22,33)},44])
a.讲述元组的特性
不可变类型,一旦一个对象被定义了,它的值就不能再被修改,如果包含可变的列表,字典等值,那这些值可以改变
b.请问tu 变量中的第一个元素“alex”是否可被修改?
不能被修改
c.请问tu 变量中的"k2"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素“Seven”
k2对应的值是列表类型,可以被修改. tu[1][2]["k2"].append("Seven")
d.请问tu 变量中的"k3"对应的值是什么类型?是否可以被修改?如果可以,请在其中添加一个元素“Seven”
k3对应的类型是元组,不能被修改
27、字典
dic={'k1':"v1","k2":"v2","k3":[11,22,33]}
a.请循环输出所有的key
for keys in dic.keys(): print(keys)
b.请循环输出所有的value
for values in dic.values(): print(values)
c.请循环输出所有的key 和value
dic = {"k1":"v1","k2":"v2","k3":[11,22,33]}
for k,v in dic.items():
print(k,v)
执行结果
k1 v1
k3 [11, 22, 33]
k2 v2
d.请在字典中添加一个键值对,"k4":"v4",输出添加后的字典
dic.setdefault("k4","v4") print(dic) 执行结果:{'k2': 'v2', 'k3': [11, 22, 33], 'k1': 'v1', 'k4': 'v4'}
e.请在修改字典中“k1”对应的值为“alex”,输出修改后的字典
dic["k1"] = "alex"
print(dic)
执行结果{'k3': [11, 22, 33], 'k2': 'v2', 'k1': 'alex'}
f.请在k3 对应的值中追加一个元素44,输出修改后的字典
dic["k3"].append("44")
g.请在k3 对应的值的第1个位置插入个元素18,输出修改后的字典
dic["k3"][0] = "18" print(dic) 执行结果:{'k3': ['18', 22, 33], 'k2': 'v2', 'k1': 'v1'}
28、转换
a.将字符串s="alex"转换成列表
s = "alex" print(list(s)) 执行结果:['a', 'l', 'e', 'x']
b.将字符串s="alex"转换成元组
s = "alex" print(tuple(s)) 执行结果:('a', 'l', 'e', 'x')
c.将列表li=["alex","seven"]转换成元组
li = ["alex","seven"] print(tuple(li)) 执行结果:('alex', 'seven')
d.将元组tu=('Alex',"seven")转换成列表
tu = ("alex","seven") print(list(tu)) 执行结果:['alex', 'seven']
e.将列表li=["alex","seven"]转换成字典且字典的key 按照10开始向后递增
li = ["alex","seven"] dic = {} for i,v in enumerate(li,10): dic.setdefault(i,v) print(dic) 执行结果 {'seven': 11, 'alex': 10}
29、转码
n="老男孩"
a.将字符串转换成utf-‐8 编码的字节,并输出,然后将该字节再转换成utf-‐8 编码字符串,再输出
print(n.encode(encoding="utf-8")) 执行结果: b'\xe8\x80\x81\xe7\x94\xb7\xe5\xad\xa9' print("\xe8\x80\x81\xe7\x94\xb7\xe5\xad\xa9".encode(encoding="utf-8")) 执行结果:b'\xc3\xa8\xc2\x80\xc2\x81\xc3\xa7\xc2\x94\xc2\xb7\xc3\xa5\xc2\xad\xc2\xa9'
b.将字符串转换成gbk 编码的字节,并输出,然后将该字节再转换成gbk 编码字符串,再输出
print(n.encode(encoding="gbk")) 执行结果:b'\xc0\xcf\xc4\xd0\xba\xa2' print("\xc0\xcf\xc4\xd0\xba\xa2".encode(encoding="gbk")) 执行结果:UnicodeEncodeError: 'gbk' codec can't encode character '\xc0' in position 0: illegal multibyte sequence
30、声明变量注意事项有那些?
(1)不能以数字开头
(2)只能是字母、数字或下划线的任意组合,但不能有特殊字符
(3)关键字通常不能声明为变量
31 分别解释"=","==","+="的含义
=是赋值语句; ==是运算符判断两个对象的值是否相等; +=是进行相加运算后,再赋值比如a+=1 等于a = a+1;
32 数据类型的可变与不可变分别有哪些?
可变:value变化后,id没有变化(字典,集合,列表)
不可变:value变化后,id变化(数字型(整型,float),布尔型,字符串,元祖)
33 写一个三次认证(编程)
实现用户输入用户名和密码,当用户名为 seven 或 alex 且 密码为 123 时,显示登陆成功,否则登陆失败,失败时允许重复输入三次
count = 0 while count < 3: user = input("user:") pwd = input("password:") if ( user == "seven" or user == "alex" ) and pwd == "123": print("登陆成功") break else: print("登陆失败") count += 1 else: print("重复输入三次错误")
34 解释'and','or','not'
and 与 x and y 若x为真,则取y值 ,若x为假,则取x值 or 或 x or y 若x为真,则取x值 ,若x为假,则取y值 not 非 not x 若x为真False,否则为True
35 元祖和列表的区别
元祖是不可变类型
列表是可变类型
36 列举一堆布尔值为False的情况
[] {} None False '' 数字0
37 python2和python3对于long(长整形)的区别。
python3对于long都是int python2中int值 在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1 在64位系统上,整数的位数为64位,取值范围为-2**63~2**63-1 整数发生溢出,Python会自动将整数数据转换为长整数
38 阐述一下unicode和utf-8的区别(或者unicode在python3的作用)
unicode对字符占2个字节 utf-8兼容ASCII码,对于中文字符占3个字节,ASCII码中的字符占1个字节
python3中,所有字符串在内存中都为unicode编码,文件默认为utf-8编码,读取到内存中转换为unicode编码 Python2中,有str和unicode两个类型,str编码为默认为文件头编码, 如文件头编码为utf-8,字符串已utf-8形式存放,系统不会自动转换为unicode编码,在windows系统中会出现乱码,因为 windows默认字符为GBK,GBK不兼容utf-8 u开头的字符串存为unicode编码形式 转换时需要先decode为unicode编码,在encode为需要编码
39 内存空间的考核。问修改前后info的id是否改变
# 不变:字典为可变数据类型。 问修改前后info['alex']['hobbies']的id是否改变 info['alex']['hobbies'].append('play') 不变:info['alex']['hobbies']列表为可变数据类型 info={ 'egon':{'pwd':'123','hobbies':['play','music','read']}, 'alex':{'pwd':'1234','hobbies':['music','read']}, 'wupeiqi':{'pwd':'135','hobbies':['read',]}, } print(id(info)) info['egon']['pwd']='456' print(id(info)) print(id(info['alex']['hobbies'])) info['alex']['hobbies'].append('play') print(id(info['alex']['hobbies']))
40 切割字符串"luffycity"为"luffy","city"(编程)
s = "luffycity" ind = s.index("city") print(s[:ind], s[ind:],)
41 猜年龄游戏(编程题)
- 优化猜年龄的游戏,允许用户最多猜3次,中间猜对了,结束;
- 如果再想玩,用户输入Y,可以再玩;
count = 0 age = 26 while count < 3: guess_age = int(input('input age:->')) if guess_age == age: print("恭喜你答对了,可以抱得傻姑娘回家!") break elif guess_age > age: print('bigger') elif guess_age < age: print('smaller') count += 1 if count == 3: input_key = input('猜的次数已经达到上限,若想继续请输入Y|y,否则按任意键退出') if input_key.strip().lower() == 'y': count = 0 else: break
42 求1~100间所有偶数的和(亦可奇数和,使用while循环写)
v_sum, count = 0, 0 v_str = "" while count < 101: if count % 2 == 0: v_sum += count v_str = v_str + "+" + str(count) count += 1 print(v_str[1:],v_sum)
43 从键盘接收一百分制成绩(0~100),要求输出其对应的成绩等级A~E。其中,
- 90分以上 为'A'
- 80~89分为'B'
- 70~79分为'C'
- 60~69分为'D'
- 60分以下为'E'
while True: grade = input("input grade->:") if grade.isdigit(): grade = int(grade) if grade < 101: if grade > 89: print("A") elif grade > 79: print("B") elif grade > 69: print("C") elif grade > 59: print("D") else: print("E") else: print("grade小于101,大于0") else: print("输入数字")
44 is"和“==”的区别(口述)
- is 是比较id值是否相等;
- == 是比较两个对象的值;
45 深浅copy-引用和copy(),deepcopy()的区别
对于嵌套列表
- 浅拷贝只复制了第一层,其他层公用;
- 深拷贝复制了所有层;
46 各个数据类型分别是有序的?还是无序的?
- 字符串,列表,元祖,数字类型是有序的;
- 集合和字典是无序的;
46 输入一年份,判断该年份是否是闰年并输出结果。(该程序可以重复使用while True)
注:凡符合下面两个条件之一的年份是闰年。
- (1) 能被4整除但不能被100整除。
- (2)能被400整除。
while True: year = int(input('input year: ')) if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0: print(year, "是闰年") else: print(year, "不是闰年")
47 有如下字符串:n = "路飞学城"(编程题)
- 将字符串转换成utf-8的字符编码,再将转换的字节重新转换为utf-8的字符编码
- 将字符串转换成gbk的字符编码,再将转换的字节重新转换为utf-8的字符编码
n = "路飞学城" print(n.encode("utf-8")) print(n.encode("utf-8").decode().encode("utf-8")) print(n.encode("GBK")) print(n.encode("GBK").decode("GBK").encode("utf-8"))
48 自定义两个,并求交集,合集,差集。
a = {1,2,3,4,5}
b = {2,4,6,8,10}
print(a & b)
print(a | b)
print(a - b)
print(b - a)
49 求100以内不能被3整除的所有数,并把这些数字放在列表sum3=[]里,并求出这些数字的 # 总和和平均数。(计算的时候告诉学员,sum是一个关键词,不能当作变量)
sum3 = [] count = 0 while count < 101: if count % 3 !=0: sum3.append(count) count += 1 print(sum(sum3)/len(sum3))
50 假设一年期定期利率为3.25%,计算一下需要过多少年,一万元的一年定期存款连本带息能翻番?
cash = 10000 year = 1 while cash < 20000: cash *= (1+3.25/100) year += 1 print(year)
51 对列表进行增删改查(查可以是索引,值是否存在列表当中)。
l = ['alex','egon','wusir','wen','jing'] l.insert(0,'ago') l.append('shan') print(l) l.pop() l.remove('wen') print(l) l[3] = 'wusirstr' print(l) def search(val,li): for k, v in enumerate(li): if v == val: return k else: return -1 print(search('alex',l))

浙公网安备 33010602011771号