发布时间:2018-04-09 19:20:35编辑:Run阅读(7166)
一:选择题
1、python不支持的数据类型有
A、char
B、int
C、float
D、list
选择:A
解释:char类型在python中不存在,它是其他编程语言的一种数据类型,比如C/C++,JAVA
2、
x ="foo"
y = 2
print(x+y)
A.foo B.foofoo C.foo2 D.2 E.TypeError
选择:E
解释:x是字符串类型,y是整形,所以x+y执行报错
3、关于字符串下列说法错误的是
A、字符串应该视为长度为1的字符串
B、字符串可以转化成数字
C、既可以用单引号,也可以用双引号创建字符串
D、在三引号字符串中可以包含换行回车等特殊字符
选择:A
解释:字符串的长度,不只是有1个字符串,还有多个字符串
4、以下不能创建一个字典的语句是
A、dic1 = {}
B、dic2 = {123:345}
C、dic3 = {[1,2,3]:'uestc'}
D、dic3 = {(1,2,3):'uestc'}
选择:C
解释:list是可变类型,它不可哈希,它不能作为字典的key
5、Kvps = {'1':1,'2':2}(面试题)
theCopy = kvps
kvps['1'] = 5
sum = kvps['1'] + theCopy['1']
print(sum)
A.1 B.2 C.7 D.10
选择:D
解释:theCopy做了赋值,当kvps['1'] = 5改变时,theCopy也改变了,所以最终结果为10
6、已知x=43,ch='A',y = 1,则表达式(x>=y and ch <'b' and y)的值是(面试题)
A、0 B、1 C、出错 D、True
选择:B
解释:
先判断x>=y,结果为True。判断ch < 'b' 也就是'A' < 'b'这里比较是ascii码字母对应的顺序。
A对应的顺序是65,b对于的是97,结果为True。True and True ,结果为True
最后判断True and y 也就是True and 1。根据x and y判断规则,如果x为false,则取x,否则取y。那么这里取y,最终结果为1
7、下列Python语句正确的事(多选)
A、min = x if x < y else y
B、max = x > y ? x : y
C、if(x>y) print(x)
D、while True:pass
选择:AD
解释:A是一个三元运算符,语句正确。B是PHP里面的三元运算,语句错误。C的if判断结尾没有冒号,直接print了,语句错误D是whlie循环,语句正确
8、若k为整形,下述while循环执 的次数为:(python3上执行了10次,此题应该是py2上的题目)
k=1000
while k>1:
print(k)
k=k/2
A.9 B.10 C.11 D.100
选择:B
9、以下叙述正确的是:
A、continue语句的作用是结束整个循环的执行
B、只能在循环体内使用break语句
C、在循环体内使用break语句或continue语句的作用相同
D、从多层循环嵌套中退出时,只能使用goto语句
选择:B
10、下面的语句哪个会无限循环下去:
A、for a in range(10):
time.sleep(10)
B、while 1<10:
time.sleep(10)
C、while True:
break
D、a = [3,-1,',']
for i in a[:]:
if not a: break
选择:B
11、下列说法正确的是(多选,选错不得分):
A,
a = [1,2,3]
b = [1,2,3]
a与b指向同一个内存地址。
B,
i1 = 356
I2 = 356
i1 与 i2是同一个内存地址。
C,
s1 ='laonanhai'
s2 ='laonanhai'
s1 与 s2 是同一个内存地址。
D,tu = (1) tu是元组类型。
选择:C
12、下面的代码,哪些是输出1,2,3三个数字(多选,选错不得分):(面试题)
A、
for i in range(3):
print(i)
print(i+1)
B、
aList = [0,1,2]
for i in aList:
print(i+1)
C、
i = 1
while i < 3:
print(i)
i+=1
D、
for i in range(3):
print(i+1)
选择:BD
二,简答题
1、is 和 == 的区别
== 比较的是数值
is 比较的是内存地址
2、Python 如何实现tuple和list的转换
#tuple转换为list
a = (1,2,3)
b = list(a)
#list转换为tuple
a = [1,2,3]
b = tuple(a)
3、list和tuple有什么不同
list 的值可以改变,tuple的值不能改变
list 有增删改查的方法,tuple只有查看的方法。
list用[]符号存放元素,tuple用()符号存放元素
4、*args和**kwargs在什么情况下会使到?请给出使 **kwargs的事例
*args和**kwargs是动态参数,在参数数量不确定的情况下使用,它可以接收任何变量,它是万能参数
例子:
def fun1(**kwargs):
print(kwargs)
5、Python中什么数据类型存在小数据池?小数据池有什么作用?
只有数字和字符串类型,存在小数据池
小数据池的作用,就是节省内存
6、在Python3x版本中,s1 ='中国',如何将s1转化成utf-8的bytes类型?转化成功之后,得到了s2,如何将s2转化成gbk的bytes类型(请写出具体代码)
s1 ='中国'
s2 = s1.encode(encoding='utf-8') #转化成utf-8的bytes类型
s3 = s2.decode(encoding='utf-8').encode('gbk') #解码,再转化成gbk的bytes类型
print(s3)
7、有如下操作,最后dic的结果是什么?为什么?
dic = dict.fromkeys(['barry','alex',],[])
dic['barry'].append(666)
print(dic)
最后dic的结果是 {'barry': [666], 'alex': [666]}
fromkeys() 方法是创建一个新的字典,并以可迭代对象中的元素分别作为字典中的键,且所有键对应同一个值,默认为None
所以新的字典应该是 dic = {'barry': [], 'alex': []},这里的[]是同一个值[],它对应一个内存地址
执行dic['barry'].append(666)之后,列表的值为[666],由于2个key对应同一个内存地址
所以2个key对应的value是一样的,最终结果为{'barry': [666], 'alex': [666]}
8、请描述unicode,utf-8,gbk等编码之间的关系?
unicode,utf-8,gbk 英文,占用1个字符
unicode,gbk 中文,占用2个字符。utf-8中文,占用3个字符
unicode是万国码,保存所有国家的编码,升级之后是4个字节表示一个字符,
为了解决资源浪费问题,utf-8诞生了,是在unicode基础上,发展过来的。
gbk是国标
9、l = [1,1,2,2,3,4,5,5,6,6,7,8]将此列表去重。
l = [1,1,2,2,3,4,5,5,6,6,7,8]
l2 = list(set(l)) #先转换为集合去重,再转换为列表
print(l2)
10、有如下代码,写出最后结果,并解释为什么。
l1 = [1,[22,33,44],3,4,]
l2 = l1
l3 = l1.copy()
l1.append(666)
l1[1].append('55')
Print(l1,l2,l3)
最后结果为:
[1, [22, 33, 44, '55'], 3, 4, 666] [1, [22, 33, 44, '55'], 3, 4, 666] [1, [22, 33, 44, '55'], 3, 4]
l2 = l1 用的是同一内存地址,l3 = l1.copy() 用了浅copy
l1.append(666) 增加了一个元素,由于l2和l1的值,对应的是同一内存地址,所以值也变动了。l3不受影响
l1[1].append('55') 给l1里面的列表增加了一个元素,同上,l1和l2的值是一样的,l3依然不受影响
11、有如下代码,说出l1与l2的关系?
l1 = [1,2,3,4,5]
l2 = l1[:]
l1和l2的值是一样的,l2通过切片的方式,把l1的值都复制过来了。但是l2是一个新的变量,和l1的内存地址是不一样的(浅copy)
12、'1,2,3'如何变成['1','2','3']? ['1','2','3']如何变成[1,2,3]?(写具体代码)
a = '1,2,3'
b = a.split(',') #分割,转换成列表
print(b) #['1','2','3']
13、如何生成[1,4,9,16,25,36,64,81,100]尽量用一行实现。
ret = map(lambda x:x **2,[i for i in range(1,11)])
14、map(str,[1,2,3,4,5,6,7,8,9])输出什么?
生成器,迭代器,迭代器的地址,map对象
15、下面代码输出结果是什么?两次list1的结果相同么?为什么?
def extendList(val,list=[]):
list.append(val)
return list
list1 = extendList(10)
print('list1=%s'%list1)
list2 = extendList(123,[])
print('list2=%s'%list2)
list3 = extendList('a')
print('list3=%s'%list3)
print('list1=%s'%list1)
2次list1的结果不一样
第一次list1执行时候,函数用的是默认值list=[],所以值为[10]
由于list3执行时,也用了函数的默认值list,由于默认值对应同一内存地址,所以执行完成之后,list为[10, 'a']
那么最终list1输出list时,结果为[10, 'a']
16、下面代码的执行结果是什么?为什么?
a = 1
def func1():
a += 1
print(a)
func1()
这段代码呢?
def wrapper():
a = 1
def inner():
a += 1
print(a)
inner()
wrapper()
执行报错,因为内层函数只能引用全局变量,不能修改全局变量
第二个也是报错,内层函数可以引用父级函数变量,它不能修改
17、什么是闭包(closure),为什么要用它?
内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数
闭包的好处:
当函数开始执行时,如果遇到了闭包,他有一个机制,他会永远开辟一个内存空间,将必包中的变量等值放入其中,不会随着函数的执行完毕而消失。
三,代码题
1、用map来处理字符串列表,把列表中所有人都变成sb,比方Sam_sb
name=['Sam','Tom','Jack']
res = map(lambda x:x+'_sb',name) for i in res: print(i)
执行结果
Sam_sb
Tom_sb
Jack_sb
2,用filter函数过滤出单价大于100的股票。
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}]
ret = filter(lambda x:x['price'] > 100,portfolio) for i in ret: print(i)
执行结果
{'price': 543.22, 'shares': 50, 'name': 'AAPL'}
{'price': 115.65, 'shares': 75, 'name': 'ACME'}
3,有文件t1.txt里面的内容为:
id,name,age,phone,job
1,Sam,22,13651054608,IT
2,Tom,23,13304320533,Tearcher
3,Jack,18,1333235322,IT
利用文件操作,将其构造成如下数据类型。
[{'id':'1','name':'Sam','age':'22','phone':'13651054608','job':'IT'},
......]
创建一个t1.txt文件,把上面的内容复制进去
l1 = [] with open("t1.txt", encoding='utf-8', mode='r') as f1: name_list = f1.readline().strip().split(',') # 得到['1', 'Sam', '22', '13651054608', 'IT'] for i in f1: dic = {} i_list = i.strip().split(',') # 得到 # ['1', 'Sam', '22', '13651054608', 'IT'] # ['2', 'Tom', '23', '13304320533', 'Tearcher'] # ['3', 'Jack', '18', '1333235322', 'IT'] for j in range(len(i_list)): dic[name_list[j]] = i_list[j] l1.append(dic) print(l1)
执行结果
[{'job': 'IT', 'age': '22', 'phone': '13651054608', 'name': 'Sam', 'id': '1'}, {'job': 'Tearcher', 'age': '23', 'phone': '13304320533', 'name': 'Tom', 'id': '2'}, {'job': 'IT', 'age': '18', 'phone': '1333235322', 'name': 'Jack', 'id': '3'}]
4,写程序完成下列功能:
1),启动程序,首页面应该显示成如下格式:
欢迎来到博客园首页
1:请登录
2:请注册
3:文章页面
4:日记页面
5:评论页面
6:收藏页面
7:注销
8:退出程序
2),用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功。
3),用户选择登录,用户名密码从register文件中读取验证,三次机会,没成功则结束整个程 序运行,成功之后,可以选择访问3~6项,访问页面之前,必须要在log文件中打印日志, 日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,访问页面时,页面内容为:欢 迎xx用户访问评论(文章,日记,收藏)页面
4),如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录(完成自动登录+5 分),然后进入首页选择。
5),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
6),退出程序为结束整个程序运行。
首先创建一个密码文件register,里面随便放几个账号密码,用来做登录认证用的,格式如下:
整个代码如下
import time class Shopping(object): def __init__(self): self.timeout = 1 self.sign = True self.auth_dic = {'username': None, 'status': False, } self.run = { '0': self.error, '1': self.login, '2': self.register, '3': self.article, '4': self.diary, '5': self.comment, '6': self.collection, '7': self.login_out, '8': self.out_exit, } self.main() '''装饰器用于验证是否登录''' def wrapper(func): def inner(self): if self.auth_dic['status']: ret = func(self) return ret else: print('|| 请先进行登录!') if self.login(): ret = func(self) return ret return inner '''此装饰器用于打印日志''' def log_record(func): def inner(self): struct_time = time.localtime() time_now = time.strftime("%Y-%m-%d %H:%M:%S", struct_time) with open('log_func', encoding='utf-8', mode='a') as f1: f1.write('用户:{}在{}执行了{}函数\n'.format(self.auth_dic['username'],time_now,func.__name__)) ret = func(self) return ret return inner '''程序入口''' def main(self): while True: self.menu() op = input(u'|| 输入选项:').strip() '''map判断输入是否符合条件''' if op in map(str, range(len(self.run))): self.run.get(op)() else: self.error() continue '''此函数用于打印菜单''' def menu(self, *args, **kwargs): print(u'=' * 40) print(u'|| 欢迎来到博客园首页') print(u'|| 1:登陆') print(u'|| 2:注册') print(u'|| 3:文章页面') print(u'|| 4:日记页面') print(u'|| 5:评论页面') print(u'|| 6:收藏页面') print(u'|| 7:注销') print(u'|| 8:退出') print(u'=' * 42) '''此函数用于注册''' def register(self): while self.sign: username = input("|| 请输入用户名:").strip() with open('register', encoding='utf-8', mode='r') as f2: for i in f2: li = i.strip().split() if username == li[0] or not username.strip(): print('|| (账号名已存在)or(账号名不能为空)') break else: password = input('|| 请输入密码:').strip() again_password = input('|| 再次输入密码,确认:').strip() if password == again_password: with open('register', encoding='utf-8', mode='a') as f3: f3.write('\n{} {}'.format(username, password)) print('|| 注册成功') return self.login(username, password) else: print("|| 两次密码不一样") '''此函数用于三次登录''' def login(self, *args, **kwargs): i = 0 while i < 3: if args: self.auth_dic['username'] = args[0] self.auth_dic['status'] = True return True else: username = input('|| 请输入账号:').strip() password = input('|| 请输入密码:').strip() with open('register', encoding='utf-8', mode='r') as f1: for j in f1: ss = j.split() if username == ss[0] and password == ss[1]: print('|| {}登陆成功'.format(username)) self.auth_dic['username'] = username self.auth_dic['status'] = True return True else: print('|| 账号或密码错误,请重新输入,还剩{}次机会'.format(2 - i)) i += 1 if i == 3: return self.out_exit() @wrapper @log_record def article(self): # 文章页面 print(u'|| 欢迎{}访问文章页面'.format(self.auth_dic['username'])) @wrapper @log_record def diary(self): # 日记页面 print(u'|| 欢迎{}访问日记页面'.format(self.auth_dic['username'])) @wrapper @log_record def comment(self): # 评论页面 print(u'|| 欢迎{}访问评论页面'.format(self.auth_dic['username'])) @wrapper @log_record def collection(self): # 收藏页面 print(u'|| 欢迎{}访问收藏页面'.format(self.auth_dic['username'])) '''此函数用于注销''' def login_out(self): if self.auth_dic['username'] is None: print("|| 你还没有登录") else: self.auth_dic['username'] = None self.auth_dic['status'] = False print('|| 注销成功') self.main() '''此函数用于延迟''' def error(self, *args, **kwargs): print(u'|| 只能输入1-8的整数,等待{}秒后重新输入'.format(self.timeout)) time.sleep(self.timeout) '''此函数用于退出程序''' def out_exit(self): exit() if __name__ == '__main__': Shopping()
生成的日志文件截图
执行效果
47744
46234
37109
34626
29228
25885
24744
19862
19415
17907
5715°
6314°
5834°
5887°
6983°
5829°
5845°
6360°
6315°
7672°