第二次考试题目

一.

1.列举Python2与Python3之间的区别

#python2的默认编码是ASCII,python3的默认编码是Unicode

#Python 2.x是遗留的,Python 3.x是该语言的现在和未来

#Python2 中存在老式类和新式类的区别,Python3 统一采用新式类。新式类声明要求继承 object,必须用新式类应用多重继承。

#Python3 采用的是绝对路径的方式进行 import,Python2 中相对路径的 import 会导致标准库导入变得困难(想象一下,同一目录下有 file.py,如何同时导入这个文件和标准库 file)。Python3 中这一点将被修改,如果还需要导入同一目录的文件必须使用绝对路径,否则只能使用相关导入的方式来进行导入。

#Python3 使用更加严格的缩进。Python2 的缩进机制中,1 个 tab 和 8 个 space 是等价的,所以在缩进中可以同时允许 tab 和 space 在代码中共存。这种等价机制会导致部分 IDE 使用存在问题。Python3 中 1 个 tab 只能找另外一个 tab 替代,因此 tab 和 space 共存会导致报错:TabError:inconsistent use of tabs and spaces in indentation.

#python2中range返回的是列表,xrange返回的是可迭代对象,而Python3中返回的是可迭代对象

#Python2中true和false是两个全局变量,在数值上对应1和0 16 ,Python3则把true和false指定为关键字,永远指向两个固定的对象,不能被重新赋值

#python2中整数分为int 和 lang,python3中统一归为int

#python3去除了 <> ,全部使用 != # python2两个都可以,python3则只能用!=

2.有整数3.14 如何去掉小数位? 请用一行代码实现不能使用切片

# print(int(3.14)) # 3
# print(round(3.14)) # 3 注意只能在3.x版本中这样试,2.x版本返回的是3.0
# print('%.0f' % 3.14) # 3

3.文件操作有哪些模式?请简述各模式的作用

# 'r' 打开文件,以读的方式,默认的方式
# 'w' 打开文件,写入文件,如果原文件存在则会被覆盖,如果没有此文件就会创建,前提是该模式下必须保证文件目录的存在
# 'x' 创建一个新文件并打开以写入,如果文件已存在则抛出FileExistsError错误
# 'a' 以追加的方式打开文件,如果文件存在则从原文件的末尾写入,否则会创建文件
# 'b' 二进制模式,可以搭配其他的模式使用,如'rb',
# 't' 文本模式,默认
# '+' 读/写模式,用于更新
# 'U' 通用的换行模式,现已弃用
# 'rt' 文本读模式,默认模式
# 'wt' 以文本写模式打开,打开前原文件会被清空
# 'rb' 打开文件,以二进制的形式读文件
# 'ab' 以二进制追加模式打开文件
# 'wb' 以二进制写模式打开,打开前原文件会被清空
# 'r+' 以文本读写模式打开文件,可以控制写入到文件任何位置,默认写的指针开始指在文件开头,所以会复写文件
# 'w+' 以文本读写模式打开文件
#' a+' 以文本读写模式打开文件,如果写那么指针将从文件末尾开始
# 'rb+' 以二进制读写模式打开文件
# 'wb+' 以二进制读写模式打开文件,原文件会被清空
# 'ab+' 以二进制读写模式打开文件

 4.字符串和列表如何互相转换?

s='123' 
l = ['a', 'b', 'c'] 
s1 = ''.join(l) 
print(s1) # abc 
print(list(s)) 

5.... 及 pass在Python中是否是占位 ?

是,为了程序的完成性,而又不能立即实现其功能或者不需要实现其功能,故采用pass或者...语句

6.a=10; b=20 用一行代码实现a,b数值交换:

a, b = b, a

7.读代码写结论为什么?

result = 1.2-1
while True:
    if round(result,1) == 0.2:
        print( 'hi guys!')
    else:
        print( False)

无限循环打印hi guys!

8.递归的最大层数?

import sys 
print(sys.getrecursionlimit()) # 1000 

997/998/1000

9.读代码写结果 如下代码输出的结果是?

def Generator():
   value =  yield 1
   yield value
gen = Generator()
print(gen.send(1))

答案是报错,因为当生成器第一次启动时,无法接收send传过来的值

10.列举你了解的5个模块并简述其作用

time模块,时间相关的
pickle模块,序列化相关
re模块, 正则相关
os模块,系统相关
sys模块,Python解释器相关
hashlib模块,加密相关

11.闭包函数有什么特点,应用场景?

# 保证了数据的安全,只能内部访问外部,外部不能访问内部 
# def foo(): 
# x = 1 
# y = 2 
# def bar(): 
  # print(x, y) 
# return bar 
# f = foo() 
# print(f) 
# print(f.__closure__[0].cell_contents) 
# print(f.__closure__[1].cell_contents) 
# 闭包函数是指:
#在函数(foo函数) 12 内部定义的函数(bar函数),称为内部函数,该内部函数包含对嵌套作用域的引用,而不是全局作用域的引用。那么,该内部函数称为闭包函数。
# bar函数还自带其外部的嵌套作用域。闭包函数相关的__closure__属性,__closure__ 属性定义的是一个包含 cell 对象的元组,其中元组中的每一个 cell 对象用来保存局部作用域中引用了哪些嵌套作用域变量
# 应用场景: 
# 保存局部变量 
# x = 1 
# def f1(x): 
  # def f2(y): 
    # return x < y 
#   return f2 
# f = f1(10) 
# print(f(5)) 
# print(f(15)) 
# 闭包的最大受益者是lambda 

# def f2(x): 
  # return (lambda y: x ** y) 
# f1 = f2(10) 
# print(f1(4)) # 10000 
# print(f1(8)) # 100000000 

12.写出下面代码的输出结果,并解释为什么?

def f(x,l=[]):
    for i in range(x):
            l.append(i*i)
            print(l)
f(2)
f(3,[3,2,1])
f(3)
结果
[0]
[0, 1]
[3, 2, 1, 0]
[3, 2, 1, 0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0]
[0, 1, 0, 1]
[0, 1, 0, 1, 4]

13.写出下面代码的输出结果,并解释为什么?

l = [1,2,3]
d = {"a":7,"b":8}
def f(arg1,arg2,*args,**kwargs):
    print(arg1,arg2,args,kwargs)
f(1,2,3,"groovy")
f(arg1=1,arg2=2,c=3,zzz="h1")
f(1,2,3,a=1,b=2,c=3)
f(*l,**d)
f(1,2,*l,q="winning",**d)
结果
1 2 (3, 'groovy') {}
1 2 () {'c': 3, 'zzz': 'h1'}
1 2 (3,) {'a': 1, 'b': 2, 'c': 3}
1 2 (3,) {'a': 7, 'b': 8}
1 2 (1, 2, 3) {'q': 'winning', 'a': 7, 'b': 8}

14.解释一下什么是迭代器,你在代码中如何获得一个迭代器?

# Python为了给类似集合这种不支持索引的数据类型,却能够像有索引一样方便取值,
# 就为一些对象内置__iter__方法来摆脱对对象对索引的依赖。即如果这个对象具有__iter__方法,
# 则成为可迭代对象。 
# 可迭代对象执行__iter__方法返回的结果称为迭代器 
# from collections import Iterable, Iterator 
# s = 'abc' 
# s1 = s.__iter__() 
# print(s1) 
# print(isinstance(s1, Iterable)) 
# print(isinstance(s1, Iterator)) 

15.迭代器如何取值?迭代器的好处?

迭代器的特点: 
重复。 下一次的重复是基于上一次结果。 
使用迭代器的优点: 
1. 提供一种不依赖于索引的取值方式。迭代器通过__next__方法取值 
2. 惰性计算,节省内存空间。迭代器每执行__next__方法一次,则“动作”一次,返回一个元素。就像懒驴似的,我们踹一脚,这懒驴(迭代器)才走一步,不踹不动弹。
那么迭代器的缺点也很明显: 
1. 取值不如索引方便。要每次执行__next__方法取值。
2. 迭代过程不可逆。也就是说这个懒驴(迭代器的迭代过程)走的是一条通往悬崖的路,每次执行__next__方法返回结果的同时都会向悬崖靠近一步。直到跳下悬崖(迭代完毕,抛出StopIteration异常)。所以说,迭代过程是无法回头的,只能一条路走到黑。
3. 无法获取迭代器的长度。因为可迭代对象通过__iter__方法返回的是迭代器(内存地址)。所以,我们无法获取这个迭代器内的元素有多少

16..什么是生成器?你在代码中如何获得一个生成器?

# 函数体内包含有yield关键字,该函数执行的结果(返回值generator_obj)为生成器,而该函数称为生成器函数。
# yield的功能: 
# 1. yield与return一样可以终止函数执行、可以返回值(不指定返回值默认返回None),但不同之处yield可以在函数内多次使用,而return只能返回一次。
# 2. 为函数封装好了__iter__和__next__方法,把函数得执行结果转换为迭代器,也就是说yield自动实现了迭代协议并遵循迭代器协议。
# 3. 触发函数的执行、暂停、再继续,包括状态都由yield保存。 
# 4. 生成器本质就是迭代器。 
# 5. 延迟计算,当你需要的时候,yield返回一次,不需要,就保留信息,等待下一次调用。
# 生成器函数和普通的函数最大的不同之处在于,生成器每当yield一次,在返回值的时候,将函数挂起,保存相关信息,在下一次函数执行的时候,从当前挂起的位置继续执行。
# def f1(): 
#   for i in range(10): 
#     yield i 
#  
# g = f1() 
# g1 = (lambda: i for i in range(10)) 
# print(g, g1)
#结果<generator object f1 at 0x00000000039578B8> <generator object <genexpr> at 0x0000000003957840>

17.请写出下面代码的执行结果

print([lambda: i for i in range(10)][0]())

结果:9 因为 i for循环完i=9,所以都是9

⼆.简洁编程

1)有列表 a = ["7net","www.7net","www.septnet","7net","www"]现需要从中将包含字符7net的元素给删掉,请以最少代码量实现。

# a = ["7net", "www.7net","www.septnet","7net","www"]
# print([i for i in a if "7net"not in i])

2)l = ['20','10','3','15','32'],按照数字的顺序从⼩到⼤排序,不改变原列表。(请⽤最简的⽅式)

# l = ['20', '10', '3', '15', '32']
# print(sorted(l, key=lambda x: int(x)))

3)l = ['班级20','班级10','班级3','班级15','班级32'],按照数字的顺序从⼩到⼤排序,不改变原列表。

# l = ['班级20','班级10','班级3','班级15','班级32']
# print(sorted(l, key=lambda x: int(x[2:])))

4)有⼀个列表l1 = ['alex', 'WuSir', '⽼男孩', '太⽩']⽤列表推导式将其构造成这种列表['alex0', 'WuSir1', '⽼男孩2', '太⽩3']

# l1 = ['alex', 'WuSir', '老男孩', '太白']
# print(list(map(lambda x:x+str(l1.index(x)),l1)))

5)现在有两元祖(('a'),('b')),(('c'),('d')),请使⽤python中的匿名函数和内置函数⽣成列表

# t1=(('a'),('b'))
# t2=(('c'),('d'))
# print(list({k:v} for k,v in zip(t1,t2)))

6)alist = [{“a”:5,”b”:2},{“a”:2,”b”:8},{“a”:8,”b”:2}]请写出以键a的值对alist进⾏排序的表达式

# alist = [{'a': 5, 'b': 2}, {'a': 2, 'b': 8}, {'a': 8, 'b': 2}]
# print(sorted(alist,key=lambda x:int(x['a'])))

7)现有列表alist = [3,1,-4,-2],按照元素的绝对值⼤⼩进⾏排序并将得到列表的每个元素求平⽅形成⼀个新的列表

# alist = [3,1,-4,-2]
# print(list(map(lambda x:x**2,sorted(alist,key= lambda x:abs(x)))))

8).写函数(lambda)实现字符串翻转,如:V = ‘oldboy’ (请⽤最简的⽅式)

# V ='oldboy'
# print(set(map(lambda x:V[::-1],V)))

9).请构建⼀个⽣成器,⾥⾯的元素是1,4,9,16,25,36,49。

# a=(i**2 for i in range(1,8))
# print(list(a))

10).写⼀个⽣成器,⾥⾯的元素是20以内所有奇数的平⽅减⼀

# a=(i**2-1 for i in range(21) if i%2==1 )
# print(list(a))

 

posted @ 2018-11-19 20:53  Python张梦书  阅读(771)  评论(0编辑  收藏  举报