python 全栈开发,Day16(函数第一次考试)
考试题
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 | Python11 期第二次考试(基础数据类型与函数部分) 考试时长: 3 个小时 满分: 105 分 一,选择题(每题 2 分,共 24 分) 1 、python不支持的数据类型有 A、char B、 int C、 float D、 list 2 、 x = "foo" y = 2 print (x + y) A.foo B.foofoo C.foo2 D. 2 E.TypeError 3 、关于字符串下列说法错误的是 A、字符串应该视为长度为 1 的字符串 B、字符串可以转化成数字 C、既可以用单引号,也可以用双引号创建字符串 D、在三引号字符串中可以包含换行回车等特殊字符 4 、以下不能创建一个字典的语句是 A、dic1 = {} B、dic2 = { 123 : 345 } C、dic3 = {[ 1 , 2 , 3 ]: 'uestc' } D、dic3 = {( 1 , 2 , 3 ): 'uestc' } 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 6 、已知x = 43 ,ch = 'A' ,y = 1 ,则表达式(x> = y and ch < 'b' and y)的值是 A、 0 B、 1 C、出错 D、 True 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 8 、若k为整形,下述 while 循环执 的次数为: k = 1000 while k> 1 : print (k) k = k / 2 A. 9 B. 10 C. 11 D. 100 9 、以下叙述正确的是: A、 continue 语句的作用是结束整个循环的执行 B、只能在循环体内使用 break 语句 C、在循环体内使用 break 语句或 continue 语句的作用相同 D、从多层循环嵌套中退出时,只能使用goto语句 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 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是元组类型。 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 ) 二,简答题(共 42 分) 1 、 is 和 = = 的区别 ( 2 分) 2 、Python 如何实现 tuple 和 list 的转换。( 2 分) 3 、 list 和 tuple 有什么不同 ( 2 分) 4 、 * args和 * * kwargs在什么情况下会使到?请给出使 * * kwargs的事例( 2 分) 5 、Python中什么数据类型存在小数据池?小数据池有什么作用?( 2 分) 6 、在Python3x版本中,s1 = '老男孩' ,如何将s1转化成utf - 8 的bytes类型?转化成功之后,得到了s2,如何将s2转化成gbk的bytes类型(请写出具体代码)?( 3 分) 7 、有如下操作,最后dic的结果是什么?为什么?( 2 分) dic = dict .fromkeys([ 'barry' , 'alex' ,],[]) dic[ 'barry' ].append( 666 ) print (dic) 8 、请描述 unicode ,utf - 8 ,gbk等编码之间的关系?( 2 分) 9 、l = [ 1 , 1 , 2 , 2 , 3 , 4 , 5 , 5 , 6 , 6 , 7 , 8 ]将此列表去重。( 2 分) 10 、有如下代码,写出最后结果,并解释为什么。( 3 分) l1 = [ 1 ,[ 22 , 33 , 44 ], 3 , 4 ,] l2 = l1 l3 = l1.copy() l1.append( 666 ) l1[ 1 ].append( '55' ) Print (l1,l2,l3) 11 、有如下代码,说出l1与l2的关系?( 2 分) l1 = [ 1 , 2 , 3 , 4 , 5 ] l2 = l1[:] 12 、 '1,2,3' 如何变成[ '1' , '2' , '3' ]? [ '1' , '2' , '3' ]如何变成[ 1 , 2 , 3 ]?(写具体代码)( 4 分) 13 、如何生成[ 1 , 4 , 9 , 16 , 25 , 36 , 64 , 81 , 100 ]尽量用一行实现。( 2 分) 14 、 map ( str ,[ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ])输出什么?( 2 分) 15 、下面代码输出结果是什么?两次list1的结果相同么?为什么?( 4 分) 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) 16 、下面代码的执行结果是什么?为什么?( 4 分) a = 1 def func1(): a + = 1 print (a) func1() 这段代码呢? def wrapper(): a = 1 def inner(): a + = 1 print (a) inner() wrapper() 17 、什么是闭包(closure),为什么要用它?( 2 分) 三,代码题。 1 、用 map 来处理字符串列表,把列表中所有人都变成sb,比方alex_sb name = [ 'oldboy' , 'alex' , 'wusir' ]( 4 分) 2 ,用 filter 函数过滤出单价大于 100 的股票。( 4 分) 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 }] 3 ,有文件t1.txt里面的内容为:( 6 分) id ,name,age,phone,job 1 ,alex, 22 , 13651054608 ,IT 2 ,wusir, 23 , 13304320533 ,Tearcher 3 ,taibai, 18 , 1333235322 ,IT 利用文件操作,将其构造成如下数据类型。 [{ 'id' : '1' , 'name' : 'alex' , 'age' : '22' , 'phone' : '13651054608' , 'job' : 'IT' }, ......] 4 ,写程序完成下列功能:( 20 分,有 5 分加分项,共计 25 分) 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 ),退出程序为结束整个程序运行。 |
答案:
一、
1.A
解释:char类型在python中不存在,它是其他编程语言的一种数据类型,比如C/C++,JAVA
2.E
解释:x是字符串类型,y是整形,所以x+y执行报错
3.A
解释:字符串的长度,不只是有1个字符串,还有多个字符串。
4.C
解释:list是可变类型,它不可哈希,它不能作为字典的key
5.D (面试题)
解释:theCopy做了赋值,当kvps['1'] = 5改变时,theCopy也改变了,所以最终结果为10
6.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.AD
解释:A是一个三元运算符,语句正确。B是PHP里面的三元运算,语句错误。C的if判断结尾没有冒号,直接print了,语句错误
D是whlie循环,语句正确。
8.B (面试题)
直接上代码,测试一波
1 2 3 4 5 6 7 8 9 | k = 1000 count = 0 while k> 1 : count + = 1 k = int (k) print (k) k = k / 2 print ( '循环执的次数为{}' . format (count)) |
执行输出:
1000
500
250
125
62
31
15
7
3
1
循环执的次数为10
9.B (面试题)
A.continue的作用是结束当前循环,继续下一次循环,叙述错误
B.循环体,也即是for和while,这里面可以使用breck,叙述正确
C.break是结束循环,continue的作用是结束当前循环,继续下一次循环,叙述错误
D.goto语句也称为无条件转移语句,它是C语言和GO语言的语法,叙述错误
10.B
A.是for循环,它是一个有限循环
B.1<10是成立的,它会无限循环下去
C.break直接结束循环了
D.是for循环,它是一个有限循环
11.C
A. a和b是重新赋值了,所以2个都是新的内存地址
B. 小数据池的范围是数字: -5~256 ,i1和I2的数值超出范围了,所以不是同一内存地址
C.字符串不含有特殊字符,且长度不超过20,存在小数据池。这里的s1和和s2没有超过20,所以内存地址是同一个
D.tu = (1)缺失逗号,tu = (1,)才是元组类型。
12.BD (面试题)
A.执行输出:
0
1
1
2
2
3
B.执行输出:
1
2
3
C.执行输出:
1
2
D.执行输出:
1
2
3
二、简答题
1.
1 2 | = = 比较的是数值 is 比较的是内存地址 |
2.
1 2 3 4 5 6 7 | #tuple转换为list a = ( 1 , 2 , 3 ) b = list (a) #list转换为tuple a = [ 1 , 2 , 3 ] b = tuple (a) |
3.
1 2 3 | list 的值可以改变, tuple 的值不能改变 list 有增删改查的方法, tuple 只有查看的方法。 list 用[]符号存放元素, tuple 用()符号存放元素 |
4.
1 2 3 4 5 | * args和 * * kwargs是动态参数,在参数数量不确定的情况下使用,它可以接收任何变量,它是万能参数 事例: def fun1( * * kwargs): print (kwargs) |
5.
1 2 | 只有数字和字符串类型,存在小数据池 小数据池的作用,就是节省内存 |
6.
1 2 3 4 | s1 = '老男孩' s2 = s1.encode(encoding = 'utf-8' ) #转化成utf-8的bytes类型 s3 = s2.decode(encoding = 'utf-8' ).encode( 'gbk' ) #解码,再转化成gbk的bytes类型 print (s3) |
7.
1 2 3 4 5 | 最后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.
1 2 3 4 5 | unicode ,utf - 8 ,gbk 英文,占用 1 个字符 unicode ,gbk 中文,占用 2 个字符。utf - 8 中文,占用 3 个字符 unicode 是万国码,保存所有国家的编码,升级之后是 4 个字节表示一个字符, 为了解决资源浪费问题,utf - 8 诞生了,是在 unicode 基础上,发展过来的。 gbk是国标 |
9.
1 2 3 | l = [ 1 , 1 , 2 , 2 , 3 , 4 , 5 , 5 , 6 , 6 , 7 , 8 ] l2 = list ( set (l)) #先转换为集合去重,再转换为列表 print (l2) |
10.
1 2 3 4 5 | 最后结果为: [ 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.
1 | l1和l2的值是一样的,l2通过切片的方式,把l1的值都复制过来了。但是l2是一个新的变量,和l1的内存地址是不一样的 |
12.
1 2 3 | a = '1,2,3' b = a.split( ',' ) #分割,转换成列表 print (b) #['1','2','3'] |
13.
1 | ret = map ( lambda x:x * * 2 ,[i for i in range ( 1 , 11 )]) |
14.
1 | 生成器,迭代器,迭代器的地址, map 对象 |
15.
1 2 3 4 | 2 次list1的结果不一样 第一次list1执行时候,函数用的是默认值 list = [],所以值为[ 10 ] 由于list3执行时,也用了函数的默认值 list ,由于默认值对应同一内存地址,所以执行完成之后, list 为[ 10 , 'a' ] 那么最终list1输出 list 时,结果为[ 10 , 'a' ] |
16.
1 2 | 执行报错,因为内层函数只能引用全局变量,不能修改全局变量 第二个也是报错,内层函数可以引用父级函数变量,它不能修改 |
17.
1 2 3 | 内部函数包含对外部作用域而非全剧作用域变量的引用,该内部函数称为闭包函数 闭包的好处: 当函数开始执行时,如果遇到了闭包,他有一个机制,他会永远开辟一个内存空间,将必包中的变量等值放入其中,不会随着函数的执行完毕而消失。 |
三、代码题
1.
1 2 3 | res = map ( lambda x:x + '_sb' ,name) for i in res: print (i) |
2.
1 2 3 | ret = filter ( lambda x:x[ 'price' ] > 100 ,portfolio) for i in ret: print (i) |
3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #空列表,存放结果 li_1 = [] with open ( 't1.txt' , encoding = 'utf-8' ) as f1: # 读取第一行,去除空格,使用逗号切割成列表 title_name = f1.readline().strip().split( ',' ) for i in f1: dic = {} # 去除空格,以逗号切割成列表 i = i.strip().split( ',' ) for j in range ( len (i)): # 添加字典, list_name[j]表示key, i[j]表示value,比如'id': '1' dic[title_name[j]] = i[j] # 添加到列表中 li_1.append(dic) print (li_1) |
4.
老师的代码:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | import time status_dic = { 'username' : None , 'status' : False , } flag1 = True def login( * args, * * kwargs): i = 0 while i < 3 : if args: status_dic[ 'username' ] = args[ 0 ] status_dic[ 'status' ] = True return True else : username = input ( '请输入用户名:' ).strip() password = input ( '请输入密码:' ).strip() with open ( 'register' ,encoding = 'utf-8' ) as f1: for line in f1: line_list = line.strip().split() if username = = line_list[ 0 ] and password = = line_list[ 1 ]: print ( '登录成功' ) status_dic[ 'username' ] = username status_dic[ 'status' ] = True return True else : print ( '输入不正确,请重新输入,还剩%s机会' % ( 2 - i)) if i = = 2 : return Quit() i + = 1 def register( * args, * * kwargs): flag = True while flag: username = input ( '请输入要注册的用户名:' ) f1 = open ( 'register' ,encoding = 'utf-8' ) for i in f1: if username in i: print ( '用户名重复,请重新输入' ) f1.close() break else : f1.close() password = input ( '请输入要注册的密码:' ).strip() f2 = open ( 'register' , encoding = 'utf-8' , mode = 'a' ) f2.write( '\n{}\t{}' . format (username, password)) f2.close() print ( '恭喜你,注册成功,已经自动为您登录,现在跳转到首页...' ) return login(username,password) def wrapper(func): ''' :param func:此函数是的登录认证的装饰器, 直接利用login()函数进行登陆认证。 :return: 执行被装饰的函数。 ''' def inner( * args, * * kwargs): if status_dic[ 'status' ]: ret = func( * args, * * kwargs) return ret else : print ( '请先进行登录' ) if login(): ret = func( * args, * * kwargs) return ret return inner def log_record(func): def inner( * args, * * kwargs): struct_time = time.localtime() time_now = time.strftime( "%Y-%m-%d %H:%M:%S" , struct_time) with open ( 'log_func' , 'a' ,encoding = 'utf-8' ) as f1: f1.write( '用户:%s 在%s 执行了 %s函数\n' % (status_dic[ 'username' ],time_now,func.__name__)) ret = func( * args, * * kwargs) return ret return inner @log_record # article = wrapper(article) article --> inner @wrapper # article = wrapper(article) 里面的 func = article article --.inner()(wrapper) def article(): print ( '欢迎%s访问文章页面' % status_dic[ 'username' ]) @wrapper @log_record def diary(): print ( '欢迎%s访问日记页面' % status_dic[ 'username' ]) @wrapper @log_record def comment(): print ( '欢迎%s访问评论页面' % status_dic[ 'username' ]) @wrapper @log_record def enshrine(): print ( '欢迎%s访问收藏页面' % status_dic[ 'username' ]) def login_out(): status_dic[ 'username' ] = None status_dic[ 'status' ] = False print ( '注销成功' ) def Quit(): global flag1 flag1 = False return flag1 choice_dict = { 1 : login, 2 : register, 3 : article, 4 : diary, 5 : comment, 6 : enshrine, 7 : login_out, 8 : Quit, } while flag1: print ( '欢迎来到博客园首页\n1:请登录\n2:请注册\n3:文章页面\n4:日记页面\n5:评论页面\n6:收藏页面\n7:注销\n8:退出程序' ) choice = input ( '请输入您选择的序号:' ).strip() if choice.isdigit(): choice = int (choice) if 0 < choice < = len (choice_dict): choice_dict[choice]() else : print ( '您输入的超出范围,请重新输入' ) else : print ( '您输入的选项有非法字符,请重新输入。' ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix