# map# 对每一个元素做个操作# -*- coding: utf-8 -*-# 利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。# 输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']def normalize(name): temp = name.lower() return temp[0].upper() + temp[1:] def test(): # 测试: L1 = ['adam', 'LISA', 'barT'] L2 = list(map(normalize, L1)) print(L2)if __name__ == "__main__": test()
['Adam', 'Lisa', 'Bart']
# reduce# -*- coding: utf-8 -*-# Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:from functools import reducedef pro(x, y): return x * ydef prod(L): return reduce(pro, L)def test(): print('3 * 5 * 7 * 9 =', prod([3, 5, 7, 9])) if prod([3, 5, 7, 9]) == 945: print('测试成功!') else: print('测试失败!')if __name__ == "__main__": test()
3 * 5 * 7 * 9 = 945测试成功!
# map & reduce# -*- coding: utf-8 -*-# 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456from functools import reduceimport mathdef fn(x, y): return x * 10 + ydef char2num(s): digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} return digits[s] def str2float(str): # 利用.作分割,然后前面的作整数,后面的作小数 num_list = str.split('.') length = len(num_list) + 1 pre = reduce(fn, map(char2num, num_list[0])) nex = reduce(fn, map(char2num, num_list[1])) return pre + nex * (1/math.pow(10, length )) def test(): print('str2float(\'123.456\') =', str2float('123.456')) if abs(str2float('123.456') - 123.456) < 0.00001: print('测试成功!') else: print('测试失败!')if __name__ == "__main__": test()
str2float('123.456') = 123.456测试成功!
# filter# 用filter求素数# -*- coding: utf-8 -*-# 用生成器构造一个奇数数列def _odd_iter(): n = 1 while True: n = n + 2 yield n# 定义一个筛选函数def _not_divisible(n): return lambda x: x % n > 0# 定义生成器,不断返回下一个素数def primes(): yield 2 it = _odd_iter() while True: n = next(it) yield n it = filter(_not_divisible, it)# 打印1000以内的素数def test(): for n in primes(): if n < 1000: pass# print(n) else: breakif __name__ == "__main__": test()
# filter# -*- coding: utf-8 -*-# 回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数:def is_palindrome(n): return str(n) == str(n)[::-1]def test(): # 测试: output = filter(is_palindrome, range(1, 1000)) print('1~1000:', list(output)) if list(filter(is_palindrome, range(1, 200))) == [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]: print('测试成功!') else: print('测试失败!')if __name__ == "__main__": test()
1~1000: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242, 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393, 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, 525, 535, 545, 555, 565, 575, 585, 595, 606, 616, 626, 636, 646, 656, 666, 676, 686, 696, 707, 717, 727, 737, 747, 757, 767, 777, 787, 797, 808, 818, 828, 838, 848, 858, 868, 878, 888, 898, 909, 919, 929, 939, 949, 959, 969, 979, 989, 999]测试成功!
# sorted # -*- coding: utf-8 -*-# 假设我们用一组tuple表示学生名字和成绩:# L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]# 请用sorted()对上述列表分别按名字排序:# 再按成绩从高到低排序L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]def by_name(t): return t[0]def by_score(t): return t[1]def test(): L2 = sorted(L, key=by_name) # 正向排序 print(L2) L3 = sorted(L, key=by_score, reverse=True) # 进行反向排序 print(L3)if __name__ == "__main__": test()
[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)][('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]
# 返回函数,闭包def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fsf1, f2, f3 = count()print(f1(), f2(), f3()) # 9 9 9# 返回的函数并没有立刻执行,而是直到调用了f()才执行# 返回闭包时牢记一点:返回函数不要引用任何循环变量,或者后续会发生变化的变量。 def count(): def f(j): def g(): return j*j return g fs = [] for i in range(1, 4): fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f() return fsf4, f5, f6 = count()print(f4(), f5(), f6()) # 1 4 9# 如果一定要引用循环变量怎么办?# 方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变
9 9 91 4 9
# 闭包# -*- coding: utf-8 -*-# 利用闭包返回一个计数器函数,每次调用它返回递增整数s = 0def createCounter(): s = [0] def counter(): s[0] = s[0]+1 return s[0] return counterdef test(): # 测试: counterA = createCounter() print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5 counterB = createCounter() if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]: print('测试通过!') else: print('测试失败!')if __name__ == "__main__": test()
1 2 3 4 5测试通过!
# lambda def is_odd(n): return n % 2 == 1list(filter(lambda x: x % 2 == 1, range(1, 20)))
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
# 现在,假设我们要增强now()函数的功能,比如,在函数调用前后自动打印日志,但又不希望修改now()函数的定义,# 这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。# -*- coding: utf-8 -*-# 装饰器# def log(func):# def wrapper(*args, **kw):# print(func.__name__)# return func(*args, **kw)# return wrapper# 装饰器传入参数def log(text): def decrator(func): def wrapper(*args, **kw): print(text, func.__name__) return func(*args, **kw) return wrapper return decrator@log('哈哈哈')def print_date(): print('2015-05-58')if __name__ == "__main__": print_date()
哈哈哈 print_date2015-05-58
# 偏函数# functools.partial的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。import functools int2 = functools.partial(int, base=2)int2('1000000')# 当函数的参数个数太多,需要简化时,使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
64