August Rush

一个还在努力成长的小火汁!

游龙当归海,海不迎我自来也。

We create our own demons.

You can reach me at augustrush0923@gmail.com
Python高阶函数使用总结
发布:2020年11月10日 | 作者:augustrush | 阅读量: 742

Map


语法


map函数的基本语法是map(func, seq), 其含义指的是:对后面可迭代序列中的每个元素执行前面的函数func的功能,最终获取到一个新的序列。

  • Python2中直接返回的是一个列表

  • Python3中返回的是一个迭代器。


示例


  1. 使用Python内置函数


map(abs, [1, -2, 3, -4])
# 返回的结果:<map object at 0x0000021C34D48A48>

# 可以使用list方法展开
list(map(abs, [1, -2, 3, -4]))
# 返回的结果:[1, 2, 3, 4]


  1. 使用自定义函数


def func(x):
    return x**2+2*x+1

result = map(func, [1, -2, 3, -4])

print(result) # [4, 1, 16, 9]


  1. 使用匿名函数lambda


使用匿名函数的时候可以有多个参数


list(map(lambda x: x+2, [1, 2, 3, 4]))
# 返回的结果:[3, 4, 5, 6]

list(map(lambda x,y: x+y, [1, 3, 5], [5, 3, 1]))
# 返回的结果:[6, 6, 6]

list(map(lambda x,y,z: x+y+z, [1,3,5], [5,3,1], [7,8,9]))
# 返回的结果:[13, 14, 15]


reduce


语法


reduce函数的定义:

reduce(function, sequence [, initial]) -> value


reduce依次从sequence中取一个元素,和上一次调用function的结果做参数,再次调用function


第一次调用function时,如果提供initial参数,会以sequence中的第一个元素和initial作为参数调用function,否则会以序列sequence的第一个数


使用

Python3中已将reduce函数移到functools模块中,需要先进行导入:


from functools import reduce


# 计算 ((((1+1)+2)+3)+4)
reduce(lambda x,y: x+y, [1,2,3,4], 1)
# >>> 11

# 计算 ((((1+2)+3)+4)
reduce(lambda x,y: x+y, [1,2,3,4])
# >>> 10


示例


  1. 使用自定义函数


def add(x, y):
    return x+y

reduce(add, [1, -2, 3 ,-4]) # (((1+-2)+3)+-4)
# -2


  1. 使用匿名函数lambda


reduce(lambda x, y: x*y, [1,2,3,4]) # (((1*2)*3)*4)
# 24

reduce(lambda x,y: x*y+1, [1,2,3,4]) # (((1*2+1)*3+1)*4+1)
# 41


  1. 带初始值的例子

初始化值和序列中的第一个值执行func函数,将得到的结果作为下次的起始值


reduce(lambda x,y: x+y, [1,2,3,4], 6) # ((((6+1)+2)+3)+4)
# 16


filter


语法


filter()函数用于过滤序列,过滤掉不符合条件的那些元素,返回符合条件的元素组成新列表。

序列中的每个元素作为参数传递给函数进行判断,返回True或者False,最后将返回True的元素放到新列表中。

filter()语法如下:

filter(function, iterable) # 前者为函数, 后者为待执行的序列


实例


  1. 使用自定义函数


def filterFunc(x):
    return x % 2 == 0

filter(filterFunc, list(range(10)))


  1. 使用匿名函数lambda


list(filter(lambda x: x%2 == 0, list(range(10))))

list(filter(lambda x:x>0, [1,-2,4,-5,9]))


  1. 对字符串的筛选


list(filter(lambda s: s=="python"), ["c/c++", "java", "python", "go"])


sorted


语法

sorted(iterable, key=None, reverse=False)


sorted()接受3个参数,返回的是一个排序后的列表

  • iterable, 可迭代对象

  • reverse=False, 接受一个布尔值,选择是否反转排序结果,默认是False

  • key=None, 接受一个回调函数,根据函数的返回值进行排序


示例


sorted([1,4,9,2,7])
# >>> [1, 2, 4, 7, 9]

dic = {'name': 'august', 'address': 'New York', 'age', 18}
sorted(dic.keys())
# >>> ['address', 'age', 'name']

sorted(range(5), reverse=True)
# >>> [4, 3, 2, 1, 0]


key


key参数的作用是我们自定义一个函数,然后通过将序列中的元素作用于函数之后再进行排序


sorted([1, -4 , 9, -2, 7], key=lambda x: abs(x))

list1 = [('python', 1), ('java', 4), ('c#', 10), ('Go', 2)]
sorted(list1, key = lambda list1:list1[0])
# >>> [('Go', 2), ('c#', 10), ('java', 4), ('python', 1)]


对比sort()


sort()方法只能对原列表list进行排序,参数和sorted是相同的

结果是将原来的列表直接原地修改,而sorted是生成新的列表,两者是不同的


zip

zip()Python中一个非常重要的方法,能够快速的实现很多功能


语法

zip([iterable, ...]) # iterable是一个或是多个可迭代对象

  • 函数执行的结果在Python3中返回的是一个zip对象,如果需要展示成列表的形式,直接使用list方法展开;展开的结果是列表中嵌套元组的形式

  • 在Python2中直接返回的是元组列表形式


zip接受一个序列


zip中可以接受列表、元组、字符串、字典等序列。


# 接受列表
li = [1, 2, 3]
result = list(zip(li))
print(result)  # >>> [(1,), (2,), (3,)]

# 接受元组
tup = (1, 2, 3)
result = list(zip(li))
print(result)  # >>> [(1,), (2,), (3,)]

# 接受字符串
strings = 'a string'
result = list(zip(strings))
print(result)  # >>> [('a',), (' ',), ('s',), ('t',), ('r',), ('i',), ('n',), ('g',)]

# 接受字典
dic = {'name': 'august', 'age': 22, 'address': 'Beijing, China'}
result = list(zip(dic))
print(result)  # >>> [('name',), ('age',), ('address',)]

# 接受range()
result = list(zip(range(1, 4)))
print(result)  # >>> [(1,), (2,), (3,)]


生成的结果都是列表中嵌套元组,元组中一个元素的后面要有逗号


zip也可接受空列表的形式,返回的扔为空列表


li = []

result = list(zip(li))
print(result)  # >>> []


zip接受多个序列


两个相同长度的序列

a = [1, 2, 3]
b = [4, 5, 6]

result = list(zip(a, b))
print(result)  # >>> [(1, 4), (2, 5), (3, 6)]

strings = '123'
dic = {'name': 'august', 'age': 22, 'address': 'Beijing, China'}

result = list(zip(strings, dic))
print(result)  # >>> [('1', 'name'), ('2', 'age'), ('3', 'address')]


当多个序列同时存在,取长度最小的那个序列的长度

a = [1, 2, 3, 4, 5]
b = ('a', 'b', 'c', 'd')
c = {'name':'august', 'age': 22, 'address': 'Beijing China'}
result = list(zip(a, b, c))
print(result)  # >>> [(1, 'a', 'name'), (2, 'b', 'age'), (3, 'c', 'address')]


zip(*iteralbes) -- (unzip)


我们一般认为该方法是zip的反过程,是一个unzip的过程

a = [1,2,3]
b = [4,5,6]
zip_result = list(zip(a,b))  # >>> [(1, 4), (2, 5), (3, 6)]
unzip_result = list(zip(*zip_result))  # >>> [(1, 2, 3), (4, 5, 6)]


一些例子


x = [4,5,6]
res = zip(*[x]*3)
print(list(res))  # >>> [(4, 4, 4), (5, 5, 5), (6, 6, 6)]


  1. x本身就是一个列表,所以[x]就是列表嵌套了一个列表

  2. [x]*3的结果为[x,x,x].实际上就是[[4,5,6],[4,5,6],[4,5,6]]

  3. *[x,x,x]的结果就为[(4, 4, 4), (5, 5, 5), (6, 6, 6)]


zip的运用


  1. 列表求和
x = [1,3,5]
y = [2,4,6]
z = []

for a, b in zip(x,y):
    z.append(a+b)

print(z)  # >>> [3, 7, 11]


  1. 数据合并
a = ['username', 'passwd', 'cap_code']
b = ['august', 'august_is_best', 'abcd']
c = []

for x, y in zip(a, b):
    c.append(x + ":" + y)

print(c)  # >>> ['username:august', 'passwd:august_is_best', 'cap_code:abcd']




  • 标签云

  • 支付宝扫码支持一下

  • 微信扫码支持一下



基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建

京ICP备20007446号-1 & 豫公网安备 41100202000460号

网站地图 & RSS | Feed