Python列表解析详解【基础语法】+map filter lambda高阶函数详解

前言:列表解析的出现真的是神了,我们可以通过一种极其简洁的列表解析的式子,完成符合某种规律的列表的构建,或者替代函数式编程中 map(), filter() 这些函数的作用(函数式编程以后我会再做总结),实现对一个序列的筛选,依次计算等功能。
语法规则[expr for iter_val in iterable]
expr:生成对象(可以是表达式或者函数等)
iter_val:迭代对象
iterable:迭代范围
根据需要还可以加if等判断语句(下面将会详细举例解释)

1.依次对序列的值进行计算

例一:对序列中每个值进行平方运算

a = [1, 2, 3, 4, 5]
result = [x ** 2 for x in a] # x是元素,列表a是可迭代对象
print(result) # 运行结果 [1, 4, 9, 16, 25]

例二:用range表示

print([x + 1 for x in range(10)]) #运行结果[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

例三:expr可以是函数

def compute(x):
    return 4*x*x-3
print([compute(x) for x in range(4)])#运行结果[-3, 1, 13, 33]

2.筛选序列

通过if实现筛选功能(在前一个基础上增加功能)
例一:0-9的偶数

print([x for x in range(10) if x%2==0])#运行结果[0, 2, 4, 6, 8]

例二:求素数

import math

# 定义素性判断函数
def isPrime(num):   
    k = int(math.sqrt(num))
    for i in range(2, k + 1):
        if num % i == 0:
            return False
    return True

print([x for x in range(2, 31) if isPrime(x)]) 
#运行结果[2, 3, 5, 7, 11, 13, 19, 23, 29]

3.矩阵,嵌套循环
例一:生成一个的数对为元素的列表

print([(x,y) for x in range(2) for y in range(3)])
#运行结果[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]

例二:访问列表里列表的值

rect=[[1, 2, 3], [3, 4, 5]]
print([row[1] for row in rect]) #运行结果[2,4]

4.统计字符串个数

这个例子当中,先是通过 s.split() 构成序列,序列的每一个元素是字符串s的每一个单词,然后通过 [len(i) for i in s.split()] 生成由这些单词的长度构成的列表,最后通过 sum() 函数加和,可见,本来需要好几行代码才完成的工作,通过列表解析,我们只需要简单的1行代码。

s = "I wrote Python"
print(sum([len(i) for i in s.split()])) # 运行结果 12

5.字典和集合解析

例一:集合解析(无序)

print({x*x for x in range(9)})#运行结果{0, 1, 64, 4, 36, 9, 16, 49, 25}

例二:字典解析 颠倒一个字典的键值对
例如原来的字典是:{‘A’:’a’, ‘B’:’b’, ‘C’:’c’}
跌倒过来是{‘a’:’A’, ‘b’:’B’, ‘c’:’C’}

D = {'A':'a', 'B':'b', 'C':'c'}
res = {v:k for k,v in D.items()}
print(res)#运行结果{'a': 'A', 'b': 'B', 'c': 'C'}

6.map filter lambda 几种常见用于遍历计算的函数

One:map函数
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
**语法规则:**map(function, iterable, …)
例:

def f(x):
    return x * x
print map(f,[1,2,3,4,5,6,7]) #list里的每个元素都会走一遍f(x)方法
#运行结果[1, 4, 9, 10, 25, 36, 49]

Two:filter函数
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
该函数接收两个参数,第一个为函数(function),第二个为序列(iterable),序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
语法规则 : filter(function, iterable)
例:过滤出1~100中平方根是整数的数:

import math
def is_sqr(x):
    return math.sqrt(x) % 1 == 0 
tmplist = filter(is_sqr, range(1, 101))
newlist = list(tmplist)
print(newlist)
#运行结果[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Three:lambda(匿名函数)
所谓匿名,即不再使用 def 语句这样标准的形式定义一个函数。
* lambda 只是一个表达式,函数体比 def 简单很多。
* lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中 封装有限的逻辑进去。
* lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
例:

def test(a,b,func):
    result = func(a,b)
    return result
num = test(11,22,lambda x,y:x+y)
print(num)
#运行结果:33

例:对字典进行排序

infors = [{"name":"wang","age":10},{"name":"xiaoming","age":20},{"name":"banzhang","age":10}]

infors.sort(key=lambda x:x['age']) #根据age对字典排序
print(infors)
#运行结果[{'name': 'wang', 'age': 10}, {'name': 'banzhang', 'age': 10}, {'name': 'xiaoming', 'age': 20}]

例:倒序交叉两列表(使用了map和lambda)

L1 = [1,2,3,4]
L2 = [5,6,7,8]
L3 = list(zip(L1,L2))
L4 = []
list(map(lambda item:L4.extend([item[0],item[1]]),L3[::-1]))
print(L4)
#运行结果[4, 8, 3, 7, 2, 6, 1, 5]

猜你喜欢

转载自blog.csdn.net/qq_42849332/article/details/81541504