Python之内置高阶函数

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!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]

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值