1

第四次测试题+答案


一. 回答题


1. 写出Python查找一个变量的顺序 提示:4中作用域的顺序

本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in)

2. Python里的拷贝,打印结果并解释。

import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象

b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝

a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象

print('a = ', a)
print('b = ', b)
print('c = ', c)
print('d = ', d)

a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']]

 

3. 打印代码的值,并解释其原因。

a = 1
def fun(a):
a = 2
return a
print(fun(a))
print(a)

# 2 1

4. 打印代码的值,并解释其原因。

a = []
def fun(a):
a.append(1)
return a
print(fun(a))
print(a)

# [1] [1]

5. L = [x*x for x in range(10)] 和 g = (x*x for x in range(10))的结果分别为:

# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] <generator object <genexpr> at 0x0000028F8B774200>


6. 将列表生成式中[]改成() 之后数据结构是否改变?请说明原因。

是,从列表变为生成器

通过列表生成式,可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含百万元素的列表,不仅是占用很大的内存空间,如:我们只需要访问前面的几个元素,后面大部分元素所占的空间都是浪费的。因此,没有必要创建完整的列表(节省大量内存空间)。在Python中,我们可以采用生成器:边循环,边计算的机制—>generator

7. 创建一个闭包必须满足那些条件:

1.必须有一个内嵌函数
2.内嵌函数必须引用外部函数中的变量



8. 通过函数化编程实现5的阶乘 提示:在函数中使用递归 例如函数中传入5,计算出5*4*3*2*1的结果

def func(n):
if n == 1:
return 1
else:
return n * func(n - 1)

obj = func(3)
print(obj)


9. 为此函数加装饰器

def foo():
  print('hello foo')

(1)为此函数加一个装饰器,执行对应函数内容后,将当前时间写入一个文件做一个日志记录。
(2)改成参数装饰器,即可以根据调用时传的参数决定是否记录时间,比如@logger(True)


import time

def init(func):
def wrapper(*args,**kwargs):
a= str(time.time()) + "执行%s\n" % func
with open("record.txt","a+") as f:
f.write(a)
func(*args,**kwargs)
return wrapper

@init
def foo():
print('hello foo')
return()

foo()




import time

def auth(flag):
def init(func):
def wrapper(*args,**kwargs):
if flag == True:
a= str(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) + "执行%s\n" % func
with open("record.txt","a+") as f:
f.write(a)
func(*args,**kwargs)
return wrapper
return init

@auth(True)
def foo():
print('hello foo')

foo()

10. 写函数,将字典作为参数传进函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。PS:字典中的value只能是字符串或列表
dic = {"k1": "v1v1", "k2": [11,22,33,44]}

def my_dict(dic):
for key in dic:
if len(dic[key]) > 2:
dic[key] = dic[key][0:2]
else:
continue
return dic
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
res = my_dict(dic)
print(res)

11. 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

def my_fun(func):
my_count = 0
func1 = []
for i in func:
my_count = my_count + 1
if my_count % 2 == 0:
func1.append(i)
print(func1)
my_fun([1,2,3,'edj'])


12. 使用内置函数将 a="1234" 变为 [1, 2, 3, 4]

list(map(int, '1234'))


13. 使用内置函数对obj = [25, 9, -23, 9, -11]按绝对值大小排序。

sorted(obj,key=abs)


14. 1)提供2017-11-1 2017-11-30 打印出他们之间的日期
例如:2017-11-01
2017-11-02
2017-11-03

import time
start_time = time.mktime(time.strptime("2017-11-01","%Y-%m-%d"))
end_time = time.mktime(time.strptime("2017-12-01","%Y-%m-%d"))
while start_time <= end_time:
print(time.strftime("%Y-%m-%d",time.localtime(start_time)))
start_time += 86400.0 

2)打印出 2017-11-1 2017-11-30的之间日期,并打印出各自对应的星期。
例如:2017-12-01 星期五
2017-12-02 星期六
2017-12-03 星期日

import time
start_time = time.mktime(time.strptime("2017-12-01","%Y-%m-%d"))
end_time = time.mktime(time.strptime("2018-1-17","%Y-%m-%d"))
w_dic = {"0":"星期日","1":"星期一","2":"星期二","3":"星期三","4":"星期四","5":"星期五","6":"星期六"}
while start_time <= end_time:
date_num_mode = time.strftime("%Y-%m-%d %w",time.localtime(start_time))
date_ymd,date_w = date_num_mode.split(" ")
print(date_ymd,w_dic[date_w])
start_time += 86400.0


15. 使用生成器编写foo函数,调用该函数foo(21)产生如下结果(斐波那契数列),1,1,2,3,5,8,13,21

def fib(max):
a = 0
b = 1
while b<=max:
yield b
b,a = a+b,b
for i in fib(21):
print(i,end=' ')

16. 读取文件a.txt,匹配文中所有ip地址,将所有ip地址加入到一个列表中,打印该列表。

import re

li = []
with open("a","r") as f:
for line in f:
result = re.findall(r'\d+\.\d+\.\d+\.\d+', line)
if result:
li += result
print(li)

17. s = '123.33sdhf3424.34fdg323.324',计算字符串中所有数字的和
本题结果应为:123.33+3424.34+323.32

import re
s = '123.33sdhf3424.34fdg323.324sss12'
obj = re.findall(r'\d+\.\d+|\d+',s)

start = 0
for i in obj:
start += float(i)
print(start)


18. 正则替换:

1.将字符串中所有的数字换为大写字母A, 结果为 aakkAdddAkkA
result=aakk123ddd55kk66

print(re.sub("\d+","A",result))

2.将字符串的前4位数字转换为A

print(re.sub("\d","A",result,4))

19. 利用random模块随机生成四位验证码,包括字母和数字

import random
checkcode = ''
for i in range(4):
current = random.randrange(0,4)
if current != i:
temp = chr(random.randint(65,90))
else:
temp = random.randint(0,9)
checkcode += str(temp)
print(checkcode)


20. 如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格,用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}
]


name = list(filter(lambda x:x["price"] > 100,portfolio))
print(name)


21. 怎么理解迭代器和生成器?生成器有什么特点?


22. 函数的形参有哪几种方式,各自在什么情况下使用以及存放顺序?


23. 如下输出以下函数的执行结果

def foo(a1, args = []):
print("args before = %s" % (args))
args.insert(0, 10)
args.insert(0, 99999)
print("args = %s " % (args))

def main():
foo('a')
foo('b')

if __name__ == "__main__":
main()


args before = []
args = [99999, 10]
args before = [99999, 10]
args = [99999, 10, 99999, 10]


24. 解释一下是否会报错,原因是什么?要是不报错打印什么值?报错的可以怎么改就不报错

1).
def test():
print(luffy)
luffy = "the king of sea."

2).
def test():
print(luffy)
luffy = 'e'
luffy = "the king of sea."

3).
def test():
luffy = 'e'
print(luffy)
luffy = "the king of sea."

4).
def func(a,**kwargs):
print(kwargs)
print(a)
for k,v in kwargs.items():
print(k,v)
func({"name":"alex"})

结果:{'name': 'alex'}
{}
name alex


25. 实现9*9乘法口诀表


for i in range(1,10):
for j in range(1,10):
print(j, "x", i, "=", i * j,"\t",end="")
if i==j:
print("")
break

 

posted @ 2018-03-04 20:03  萌哥-爱学习  阅读(656)  评论(0编辑  收藏  举报