函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!Python对函数式编程提供部分支持
什么是高阶函数?
高阶函数英文叫Higher-order function,把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式
map() 函数
会根据提供的函数对指定序列做映射
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合
当seq多于一个时,map可以并行(注意是并行)地对每个seq执行如下图所示的过程
注意: map无法处理seq长度不一致、对应位置操作数类型不一致的情况,这两种情况都会报类型错误
def line(num1, num2):
return num1 * 10 + num2
# map含有多个序列
nums1 = range(2, 6)
nums2 = range(1, 5)
# nums1 = 2 3 4 5
# nums2 = 1 2 3 4 5
# line=====> num1 * 10 + num2
# result = 21 32 43 54
result = list(map(line, nums1, nums2))
print(result)
# 运行结果
[21, 32, 43, 54]
reduce() 函数
会对参数序列中元素进行累积
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个结果
from functools import reduce
# 求两个数值和的匿名函数定义;
add = lambda x, y: x + y
# reduce的工作机制: result=add(add(add(1, 2), 3), 4)
result = reduce(add, [1, 2, 3, 4])
print(result)
# 求10的阶乘
result = reduce(lambda x, y: x * y, range(1, 10))
print(result)
# 运行结果
10
362880
filter() 函数
用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个序列
拿出10以内的所有偶数
# 拿出10以内的所有偶数; range(0, 11, 2)
# 方法一:
def is_odd(num):
"""
判断是否为偶数, 返回值为Bool类型
"""
return num % 2 == 0
odd_nums = filter(is_odd, range(0, 11))
for num in odd_nums:
print(num)
# 方法2:
odd_nums = filter(lambda num: num % 2 == 0, range(0, 11))
print(list(odd_nums))
# 运行结果
0
2
4
6
8
10
[0, 2, 4, 6, 8, 10]
获取100以内能被3或者5整除的所有数
# 获取100以内能被3或者5整除的所有数
result1 = filter(lambda num: num % 3 == 0 or num % 5 == 0, range(100))
print(list(result1))
# 运行结果
[0, 3, 5, 6, 9, 10, 12, 15, 18, 20, 21, 24, 25, 27, 30, 33, 35, 36, 39, 40, 42, 45, 48, 50, 51, 54, 55, 57, 60, 63, 65, 66, 69, 70, 72, 75, 78, 80, 81, 84, 85, 87, 90, 93, 95, 96, 99]
获取2000-2999年,所有的闰年
# 获取2000-2999年,所有的闰年
is_leap = lambda year: (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
result2 = filter(is_leap, range(2000, 3000))
print(list(result2))
# 运行结果
[2000, 2004, 2008, 2012, 2016, 2020, 2024, 2028, 2032, 2036, 2040, 2044, 2048, 2052, 2056, 2060, 2064, 2068, 2072, 2076, 2080, 2084, 2088, 2092, 2096, 2104, 2108, 2112, 2116, 2120, 2124, 2128, 2132, 2136, 2140, 2144, 2148, 2152, 2156, 2160, 2164, 2168, 2172, 2176, 2180, 2184, 2188, 2192, 2196, 2204, 2208, 2212, 2216, 2220, 2224, 2228, 2232, 2236, 2240, 2244, 2248, 2252, 2256, 2260, 2264, 2268, 2272, 2276, 2280, 2284, 2288, 2292, 2296, 2304, 2308, 2312, 2316, 2320, 2324, 2328, 2332, 2336, 2340, 2344, 2348, 2352, 2356, 2360, 2364, 2368, 2372, 2376, 2380, 2384, 2388, 2392, 2396, 2400, 2404, 2408, 2412, 2416, 2420, 2424, 2428, 2432, 2436, 2440, 2444, 2448, 2452, 2456, 2460, 2464, 2468, 2472, 2476, 2480, 2484, 2488, 2492, 2496, 2504, 2508, 2512, 2516, 2520, 2524, 2528, 2532, 2536, 2540, 2544, 2548, 2552, 2556, 2560, 2564, 2568, 2572, 2576, 2580, 2584, 2588, 2592, 2596, 2604, 2608, 2612, 2616, 2620, 2624, 2628, 2632, 2636, 2640, 2644, 2648, 2652, 2656, 2660, 2664, 2668, 2672, 2676, 2680, 2684, 2688, 2692, 2696, 2704, 2708, 2712, 2716, 2720, 2724, 2728, 2732, 2736, 2740, 2744, 2748, 2752, 2756, 2760, 2764, 2768, 2772, 2776, 2780, 2784, 2788, 2792, 2796, 2800, 2804, 2808, 2812, 2816, 2820, 2824, 2828, 2832, 2836, 2840, 2844, 2848, 2852, 2856, 2860, 2864, 2868, 2872, 2876, 2880, 2884, 2888, 2892, 2896, 2904, 2908, 2912, 2916, 2920, 2924, 2928, 2932, 2936, 2940, 2944, 2948, 2952, 2956, 2960, 2964, 2968, 2972, 2976, 2980, 2984, 2988, 2992, 2996]
获取1000内容所有的素数
# 获取1000内容所有的素数
def is_prime(num):
"""判断是否为素数"""
if num < 2:
return False
for i in range(2, num):
if num % i == 0:
return False
else:
return True
result3 = filter(is_prime, range(1001))
print(list(result3))
# 运行结果
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
sorted() 函数
sorted() 函数对所有可迭代的对象进行排序操作,返回重新排序的列表
sorted(iterable, key=None, reverse=False)
key: 主要是用来进行比较的元素,只有一个参数
reverse: 排序规则
True 降序
False 升序(默认)
python排序sort()和sorted()的区别是什么?
1. 排序对象不同: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作
2. 返回值不同: list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作,具体见下面例子
list = [2,5, 1,7]
list_sort = list.sort()
print(list)
print(list_sort)
list = [2,5, 1,7]
list_sorted = sorted(list)
print(list)
print(list_sorted)
# 运行结果
[1, 2, 5, 7]
None
[2, 5, 1, 7]
[1, 2, 5, 7]
max/min 函数
# 根据不同属性排序
goods = [
["苹果", 2, 1000],
["电脑", 9999, 300],
["手机", 5999, 790]
]
top_price = max(goods, key=lambda x: x[1])
print(top_price)
print("价格最高的商品名称: ", top_price[0])
low_count = min(goods, key=lambda x: x[2])
print("库存量最少的商品名称: ", low_count[0])
high_count = max(goods, key=lambda x: x[2])
print("库存量最多的商品名称: ", high_count[0])
# 运行结果
['电脑', 9999, 300]
价格最高的商品名称: 电脑
库存量最少的商品名称: 电脑
库存量最多的商品名称: 苹果
# 将所有的偶数移动到前面, 将所有的奇数移动到最后
li = list(range(10))
sorted_li = sorted(li, key=lambda num: 0 if num % 2 == 0 else 1)
print(sorted_li)
# 运行结果
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]