内置函数map(),接收两个参数,参数一为函数,参数二为iterable, 将参数一的函数依次作用到参数二的每一个元素上,结果以新的Iterator返回。
解释:
1.Iterable (迭代对象):可直接用作for循环的对象,如:list tuple dict set str
2.Iterator(迭代器):可被next()调用,并不断返回下一个值的对象,如:generator(生成器)
#计算x^2 def fun(x): return x**2 for i in map(fun, [1, 2, 3, 4, 5]): print(i, end=' ') #把所有的数字变成字符串并把iterator变成list print(list(map(str, [1, 2, 3, 4, 5])))
reduce()接收两个参数,参数一是函数,参数二是序列,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。
from functools import reduce #str2int方法 #输出 738912 DIGITS = {"0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9} def str2int(s): def fn(x, y): return x*10+y def char2int(s): return DIGITS[s] return reduce(fn, map(char2int,s)) print(str2int("738912")) #输出12345 def add2(x, y): return x*10+y print(reduce(add2, [1, 2, 3, 4, 5])) #使用lambda匿名函数 DIGITS = {"0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9} def char2int(s): return DIGITS[s] print(reduce(lambda x, y: x*10+y , map(char2int, "987654")))
#将字符串的开头字母变大写,其他变小写 def normalize(name): if isinstance(name, str): return name[0].upper()+name[1:].lower() print(list(map(normalize, ["Jemma", "TOnnY", "JSHon"])))
练习:找素数(埃氏筛法)
#找排除掉偶数的序列(除2外,其他偶数都不是素数) 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(n), it) #找30以内的素数 for i in primes(): if i < 30: print(i) else: break
练习:找回数
def is_palindrome(n): s = str(n) return s[:] == s[-1::-1] for i in filter(is_palindrome, range(100, 300)): print(i)
练习:对列表中的元组排序
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] def by_name(t): return t[0] def by_score(t): return t[1] print(sorted(L, key=by_name)) print(sorted(L, key=by_score, reverse=True))
函数作为返回值。内部函数可以引用外部函数的参数和局部变量,当外部函数返回内部函数时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。
#计数器函数,返回递增整数 def createCounter(): i = 0 def counter(): nonlocal i i = i + 1 return i return counter counter = createCounter() print(counter(), counter()) print([counter(), counter()] == [3, 4])
print(list(map(lambda x: x**2, [1, 2, 3, 4, 5]))) print(list(map(lambda x: -x if x%2==1 else x, [1, 2, 3, 4, 5]))) print(list(filter(lambda x: x%2 == 0, [1, 2, 3, 4, 5]))) nums = [0, 7, 0, 1, 2, 1, 5, 1, 7, 8, 0, 67, 1, 3, 4] #print(sorted(nums, reverse=True)) print(sorted(nums, key=lambda x: 1 if x == 0 else 0)) dict = {'k1':10,'k2':20,'k3':30} print(dict[max(dict, key=lambda x: dict[x])])
在代码运行期间动态增加功能的方式 放在运行函数的开头@
import time, functools def log1(func): @functools.wraps(func) def wrapper(*args, **kw): print("call %s():" % func.__name__) return func(*args, **kw) return wrapper def logtext(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
def metric(fn): start = time.time() @functools.wraps(fn) def wrapper(*args, **kw): print('%s executed in %s ms' % (fn.__name__, 1000*(time.time()-start))) return fn(*args, **kw) return wrapper @metric def fast(x, y): time.sleep(0.0012) return x + y @metric def slow(x, y, z): time.sleep(0.1234) return x * y * z f = fast(11, 22) s = slow(11, 22, 33) if f != 33: print('测试失败!1') elif s != 7986: print('测试失败!2')
#偏函数 int2 = functools.partial(int, base=2) print(int2('101')) print(int2('101', base=10))