一、高阶函数
写出下列代码运行结果:
def f(x):
return x*x
if __name__=='__main__':
r = map(f,[1,2,3,4,5,6,7,8,9])
s = map(str,[1,2,3,4,5,6,7,8,9])
print(type(r))
print(type(s))
print(list(s))
print(list(r))
答:r和s都是map对象,在转换成list之后才是列表。
class map
class map
#得到str的list
[‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’]
#转化为整型的数
[1,4,9,16,25,36,49,64,81]
二、写出下列代码的运行结果:
from functools import reduce
def add(x,y):
return x+y
if __name__=='__main__':
result = reduce(add,[1,3,5,7,9])
print(type(result))
print(result)
答:
class int
25
三、写出下列代码的运行结果:
from functools import reduce
def fn(x, y):
return x * 10 + y
def CharToInt(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8':
8, '9': 9}[s]
if __name__ == '__main__':
result = reduce(fn, map(CharToInt, '13579'))
print(result)
答:#(((1*10+3)*10+5)*10+7)*10+9,
13579
这个{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
是一个一个返回的?
四、写出下列代码的运行结果:
from functools import reduce
def fn(x,y):
return x*10+y
def CharToInt(s):
return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8':
8, '9': 9}[s]
if __name__=='__main__':
result = reduce(lambda x,y:x*10+y,map(CharToInt,'13579'))
print(result)
答:
13579
五、写出下列代码的运行结果:
def is_odd(n):
return n % 2 == 1
def not_empty(s):
return s and s.strip()
if __name__ == '__main__':
result=filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
print(type(result))
print(list(result))
print(list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])))
答:得到所有通过筛选,为True的数
class filter
[1,5,9,15]
去掉首尾空白后非空的字符
[‘A’,‘B’,‘C’]
六、写出下列代码的运行结果:
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
if __name__ == '__main__':
f = lazy_sum(1, 3, 5, 7, 9)
print(type(f))
print(f())
答:f指向sum函数
class function
25
sorted(iterable, cmp=None, key=None, reverse=False)
- iterable – 可迭代对象。
- cmp --比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
- key-- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回新生成的数组
七、写出下列代码的运行结果:
from operator import itemgetter
L = ['bob', 'about', 'Zoo', 'Credit']
print(sorted(L))
print(sorted(L, key=str.lower))
students = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
print(sorted(students, key=itemgetter(0)))
print(sorted(students, key=lambda t: t[1]))
print(sorted(students, key=lambda t: t[1],reverse=True))
print(sorted(students, key=itemgetter(1), reverse=True))
答:
[‘Credit’, ‘Zoo’, ‘about’, ‘bob’]
#字母升序
[‘about’, ‘bob’, ‘Credit’, ‘Zoo’]
#小写字母升序
[(‘Adam’, 92), (‘Bart’, 66), (‘Bob’, 75), (‘Lisa’, 88)]
#元组第一个数为key升序
[(‘Bart’, 66), (‘Bob’, 75), (‘Lisa’, 88), (‘Adam’, 92)]
#元组第二个数为key升序
[(‘Adam’, 92), (‘Lisa’, 88), (‘Bob’, 75), (‘Bart’, 66)]
#元组第二个数为key降序
[(‘Adam’, 92), (‘Lisa’, 88), (‘Bob’, 75), (‘Bart’, 66)]
#元组第二个数为key降序
八、写出下列代码的运行结果,并用lambda表达式改写:
def square(num):
return num**2
items = [1, 2, 3, 4]
squared = list(map(square, items))
print(squared)
答:
[1,4,9,16]
#使用lambda为
print(list(map(lambda x:x**2,[1,2,3,4])))
九、写出下列代码运行结果,并实现阶乘的lambda表达式版本:
from functools import reduce
def add(x, y):
return x + y
n = 4
result = reduce(add, range(n+1))
print(result)
答:0+1+2+3+4
10
#lambda表达式版本
from functools import reduce
n = 4
result = reduce(lambda x,y:x+y,range(n+1))
print(result)
十、写出下列代码的运行结果:
l = [1, 2, 3, 4]
result = filter(lambda x: x % 2 == 1, l)
print(type(result))
答:
class filter
十一、写出下列代码的运行结果:
from collections.abc import Iterable, Iterator
def g():
yield 1
yield 2
yield 3
print('Iterable? [1, 2, 3]:', isinstance([1, 2, 3], Iterable))
print('Iterable? \'abc\':', isinstance('abc', Iterable))
print('Iterable? 123:', isinstance(123, Iterable))
print('Iterable? g():', isinstance(g(), Iterable))
print('Iterator? [1, 2, 3]:', isinstance([1, 2, 3], Iterator))
print('Iterator? iter([1, 2, 3]):', isinstance(iter([1, 2, 3]), Iterator))
print('Iterator? \'abc\':', isinstance('abc', Iterator))
print('Iterator? 123:', isinstance(123, Iterator))
print('Iterator? g():', isinstance(g(), Iterator))
答:
Iterable? [1, 2, 3]:True
Iterable? ‘abc’:True
Iterable? 123:False
Iterable? g():True
Iterator? [1, 2, 3]:False
Iterator? iter([1, 2, 3]):True
Iterator? ‘abc’:False
Iterator? 123:False
Iterator? g():True
十二、使用生成器编写代码,代码实现功能:不断生成杨辉三角:
输出格式:
[1]
[1,1]
[1,2,1]
[1,3,3,1]
[1,4,6,4,1]
[1,5,10,10,5,1]
[1,6,15,20,15,6,1]
import copy
def yhsj():
a = []
while True:
a.append(1)
if len(a)>=3:
b = copy.copy(a)
for i in range(1,len(a)-1):
a[i]=b[i]+b[i-1]
yield a
if __name__ =='__main__':
for i in yhsj():
print(i)
#设一个上限
if(len(i)>=100):
break
十三、生成器和迭代器有什么关系?请简要说明。
答:首先,生成器是特殊的迭代器。
迭代器是指有__iter__和__next__方法的对象,可以一个一个输出迭代器内的数据;
生成器内存放的是数据产生的方式,而不是数据本身,这就可以节约大量的内存。生成器使用时和迭代器是一样的。
另外,生成器可以实现send()方法,能够改变生成器的状态,这就为协程提供了条件。