首页 > 技术文章 > Python 学习笔记(一)

wilfredshen 2020-05-08 23:51 原文

date: 2019-09-06

我使用的Python版本为3.7,没有装配环境的同学可以到下方链接查看教程。

高阶函数

在Python中,函数名其实就是变量名,讲起来可能有点绕,直接看例子理解了就没问题了

print(abs(-9))
# 9
func = abs
print(func(-8))
# 8
abs = len
print(abs([1, 2, 3]))
# 3

abs是Python中求绝对值的函数,最后它变成了求元素个数的函数,这说明在Python中函数名其实就是变量名,它只是指向了一段代码而已

所以,既然函数名就是变量名,那么在Python中,函数自然可以当成参数进行传递

接下来就介绍几个比较常用的高阶函数,以函数为参数、返回值。函数是对某种功能的抽象,高阶函数则是更高一级的抽象。

这几个高阶函数的功能对于没有接触过这一概念的初学者来说可能会稍微有点难以理解,不用急,看一下例子就可以很快速地学会。

map

map(func, data)

  • func(x):接受一个参数,返回一个值
  • data:可迭代对象(list等)
  • 功能:
    1. 新建一个空的list,开始遍历data,以val标记
    2. 调用func,x = val,返回值标记为res
    3. 将res添加在list的最后
    4. 当没有更多元素时,返回list的迭代器(Python2返回list),否则回到第2步

以下是示例:

itr = map(abs, [0, -9, 3])
print(list(itr))
# [0, 9, 3]

新的list中的元素与data一一对应

reduce

reduce(func, data, init)

  • func(x, y):接受两个参数的函数,返回一个值
  • data:可迭代对象
  • init:初始值(可选)
  • 功能:
    1. 开始遍历data,以val标记
    2. 调用func,x = init或res,y = val,返回值标记为res
    3. 当没有更多元素时,返回res,否则回到第2步

以下是示例:

from functools import reduce

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

print(reduce(add, (0, -9, 3)))
# -6
print(reduce(add, [0, -9, 3], 10))
# 4

在Python高级版本中该函数被放在了functools中,更早的版本不需要引入functools

filter

filter(func, data)

  • func(x):接受一个参数,返回一个值
  • data:可迭代对象
  • 功能:
    1. 新建一个空的list,开始遍历data,以val标记
    2. 调用func,x = val,返回值标记为res
    3. 若res为true,则将val添加在list的最后,否则不做任何操作
    4. 当没有更多元素时,返回list的迭代器(Python2返回list),否则回到第2步

以下是示例:

def is_odd(x):
    return x % 2 == 1

itr = filter(is_odd, (1, 2, 3, 4, 5))
print(list(itr))
# [1, 3, 5]

sorted

这个函数在Python2和Python3中差别较大,两种都会列出

Python2: sorted(data, cmp)

  • data:可迭代对象
  • cmp(x, y):接收两个参数的函数,返回一个值(可选,以默认规则排序)
  • 功能:
    • 将data中的元素按func指定的规则排序
      • 当返回值为正数时,表示a在b后面
      • 当返回值为负数时,表示a在b前面
      • 当返回值为0时,表示a、b之间的顺序无所谓
    • 当所有元素均满足func规定的顺序时,返回新的list

以下是示例:

print sorted([0, -9, 3], lambda x, y: y-x)

Python3: sorted(data, key, reverse)

  • data:可迭代对象
  • key(x):接受一个参数,返回进行比较的键值(可选,默认None)
  • reverse:是否反转比较结果(可选,默认false)
  • 功能:
    1. 通过key提取data中每个元素的比较键
    2. 以默认规则排序
    3. 若reverse为true,反转排序结果,否则不做任何操作
    4. 将data中的元素按照比较键的顺序排列在新的list中并返回

以下是示例:

l1 = [('b',3), ('c',1), ('a',4), ('d',2)]

itr1 = sorted(l1, key = lambda x: x[0])
itr2 = sorted(l1, key = lambda x: x[1], reverse = True)

print(list(itr1))
# [('a', 4), ('b', 3), ('c', 1), ('d', 2)]
print(list(itr2))
# [('a', 4), ('b', 3), ('d', 2), ('c', 1)]

分别以元组中的第一个元素升序排序(默认)和元组中的第二个元素降序排序(反转)

个人博客:https://wilfredshen.cn/

推荐阅读