1、map( ):接受两个参数:一个是函数,一个是可迭代对象。map
将传入的函数依次作用到序列的每个元素。用 list 输出 map 函数产生的值。
r = map(str,[1,2,3,4]) print(list(r))
2、reduce(): reduce
把一个函数 f 作用在一个序列[x1, x2, x3, ...]
上,这个函数 f 必须接收两个参数. reduce
把结果继续和序列的下一个元素做累积计算 :reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
from functools import reduce
"""创建一个reduce函数的作用对象:函数 f ,且接受两个参数""" def f(x,y): return x*y l=[1,2,3]
""" reduce()接收一个函数f 和一个可迭代对象""" print(reduce(f,l))
3、字符串转数字。
from functools import reduce DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} """s 是一个字符串""" def str2int(s):
"""创建reduce()函数作用对象""" def fn(x, y): return x * 10 + y
"""创建map函数作用对象""" def char2num(s): return DIGITS[s]
"""map函数将char2num函数作用于字符串s的每一个元素,最终返回digitals的vlue。
reduce函数将 fn 函数作用于value"""
return reduce(fn, map(char2num, s)) print(str2int("1357"))
4、字符串转小数。
from functools import reduce dict={'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} def str2float(s): n = s.index(".") s1 = s[:n] s2 = s[n+1:] n = len(s2) def char2num(s): return dict[s] def f(x,y): return x*10+y return reduce(f,map(char2num,s1))+reduce(f,map(char2num,s2))/10**n print(str2float("123.456"))
3、filter():接受一个函数和一个序列,filter()
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素.同样用list取filter的值。
"""筛选回文数""" def is_palindrome(n): if str(n)==str(n)[::-1]: return n print(list(filter(is_palindrome,range(1000))))
"""所有的素数除了2以外都是奇数,所以从3开始在奇数里面筛选素数, 筛选出来的数加上2就可以得到所有素数。筛选条件:不能被其他奇数整除""" #定义一个从3开始的奇数序列.用生成器 f()保存。 def f(): n = 1 while True: if n%2==1: n +=2 yield n #定义一个筛选条件:不能被其他奇数整数 def g(n): return lambda x: x%n !=0 #定义一个生成器 primes() def primes(): yield 2 #primes()生成器第一个元素2 it = f()#生成器f()赋予一个变量it,it继承了f()从3开始的奇数序列。 while True:#一下步骤依次重复执行 n = next(it)#提取从3开始的奇数序列的元素 yield n #用生成器保存 it = filter(g(n),it)#按照既定条件过滤,过滤之后重复执行提取、保存这两步骤。 for n in primes(): if n < 20: print(n) else: break
4 、sorted()
函数也是一个高阶函数,它还可以接收一个key
函数来实现自定义的排序。sorted(L, key=f):L是一个序列,f 代表一个函数。key函数作用于序列L的每一个元素。
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] #该函数接受一个元组作参数,返回元组第一个元素的首字母 def by_name(t): return t[0][0] def by_score(t): return t[1] #按照姓名首字母排序 L1 = sorted(L,key = by_name) print(L1)
#按照成绩排序 L2 = sorted(L,key = by_score) print(L2)
5、lambda: lambda
表示匿名函数,只能有一个表达式,不用写return
,返回值就是该表达式的结果
def f(x):
return x**x
print(f(5))
"""等价于"""
f = lambda x: x**x
print(f(5))
""" def add(n): return lambda x: x+n x = add(2) print(x(4)) """ def add(n): def g(x): return x+n return g g = add(2) print(g(4))
6、不带参数的装饰器。
import functools, time #定义装饰器名称:log def log(func): #固定写法,作用是固定装饰器后续函数now()的名称 @functools.wraps(func) #固定写法:*args,**kw这两个参数使得wrapper可接受任何参数 def wrapper(*args, **kw):
print("start_time:", time.ctime())#该语句写在res之前,即在now函数调用前输出 res = func(*args, **kw)#固定写法
print("end_time:", time.ctime())#该语句写在res之后,即在now函数调用后输出 #固定写法 return res#固定写法 return wrapper #不带参数的装饰器 @log def now():
time.sleep(1) print("test") now()
7、带参数的装饰器。
import functools, time def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print("%s %s():" %(text,func.__name__)) return func(*args, **kw) return wrapper return decorator #带参数的装饰器 @log("hello") def now(): print("hello world", time.ctime()) now()
zip( [可迭代对象] )
a = [1,2,3] b = [4,5] print(list(zip(a,b))) """output:[(1, 4), (2, 5)]#元素序列与最短的列表一致 """
strs = ['flower','flow','flight'] for str in zip(*strs): print(str) print(str[0]) print(set(str)) """ ('f', 'f', 'f') f {'f'} ('l', 'l', 'l') l {'l'} ('o', 'o', 'i') o {'o', 'i'} ('w', 'w', 'g') w {'w', 'g'} """
最长公共前缀:输入: ["flower","flow","flight"] 输出: "fl";输入: ["dog","racecar","car"] 输出: " " ;解释: 输入不存在公共前缀。
def longestCommonPrefix(strs): res = "" for str in zip(*strs): if len(set(str))==1: res = res+str[0] else: break return res
8、排序指南:operator模块。student = [("dave",78),("jojo",78),("tom",60)]. 对student先按照成绩由低到高排序,如果成绩相同,就按照姓名排序。
from operator import itemgetter def f(student): res = sorted(student,key=itemgetter(1,0)) return res student = [("dave",78),("jojo",78),("tom",60)] print(f(student))
from operator import itemgetter data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)] data = sorted(data,key=itemgetter(0)) print(data) """ output:[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]
student = [('dave','B',10),('john','A',15),('jane','B',12)] 对年龄先按照升序排列,然后再对等级降序排列
from operator import itemgetter student = [('dave','B',10),('john','A',15),('jane','B',12)] s = sorted(student,key=itemgetter(2)) s = sorted(s,key=itemgetter(1),reverse=True) print(s) """ output:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] """