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分)
1is == 的区别 (2分)
 
2、Python 如何实现tuplelist的转换。(2分)
 
3listtuple有什么不同 (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分)
 
14map(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('您输入的选项有非法字符,请重新输入。')

  

 

posted @   肖祥  阅读(1919)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示