Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >5 Python 基础: 高阶函数学习实践

5 Python 基础: 高阶函数学习实践

作者头像
野原测试开发
发布于 2019-09-16 08:48:18
发布于 2019-09-16 08:48:18
37400
代码可运行
举报
文章被收录于专栏:技术探究技术探究
运行总次数:0
代码可运行

目录

5 Python 基础: 高阶函数学习实践,共有 1 部分:

  • 高阶函数

高阶函数

编写高阶函数,就是让函数的参数能够接收别的函数。

变量可以指向函数

以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码:abs(-10)

什么是函数

函数本身也可以赋值给变量,即:变量可以指向函数,函数名其实就是指向函数的变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(abs(-1))
print(abs)
x = abs(-1)
print x
f = abs
print(f)
print(f(-1))


# 结果:
1
<built-in function abs>
1
<built-in function abs>
1
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(abs(-1))
abs = 2
print(abs(-1))


# 结果:
1
TypeError: 'int' object is not callable

什么是高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fun(x, y, f):
    print(f(x), f(y))
fun(1, -2, abs)
 
 
# 结果:
1 2

内置高阶函数

map函数

map( ) 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 list 返回。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fun(x):
     return x * x
print(map(fun, range(5)))


# 结果:
[0, 1, 4, 9, 16]

-------------------------------------

print(map(str, [1, 2, 3]))


# 结果:
['1', '2', '3']

reduce函数

reduce把一个函数作用在一个序列x1, x2, x3…上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add(x, y):
     return x + y
print(reduce(add, range(5)))


# 结果:
10

其实其运行过程为:add(add(add(add(0+1)+2)+3)+4)=10

综合编程:写出把 str 转换为 int 的函数(eg:’12345’–12345)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fun(N):
     return {"0": 0, "1": 1, "2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9}[N]
def fun1(x, y):
     return x * 10 + y
print(reduce(fun1,map(fun,"12345")))
 
 
# 结果:
12345

filter函数

filter( ) 也接收一个函数和一个序列。和 map( ) 不同的时,filter( ) 把传入的函数依次作用于每个元素,然后根据返回值是 True还是 False 决定保留还是丢弃该元素

在一个 list 中,删掉偶数,只保留奇数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fun(n):
     return n % 2 == 1
print(filter(fun,range(5)))


# 结果:
[1, 3]

sorted函数

排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。通常规定如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x < y, return -1
x == y, return 0
x > y, return 1

----------------------------

print(sorted([3, 1, 2]))
print(sorted([3, 1, 2], reverse=True))
 
# 结果:
[1, 2, 3]
[3, 2, 1] 

排序数字字符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
li = ['2', '1', '4', '3']
print(sorted(li, key=int))


# 结果:
['1', '2', '3', '4']

匿名函数

• 当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。

• 关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(map(lambda x: x * x, [1, 2, 3, 4]))
def fun(x):
     return x * x
print(map(fun, [1, 2, 3, 4]))


# 结果:
[1, 4, 9, 16]
[1, 4, 9, 16]

• 匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。

• 因为匿名函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f = lambda x: x * x
print(f)
print(f(3))


# 结果:
<function <lambda> at 0x7fde80eb7938>
9

• 把匿名函数作为返回值返回。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fun(x, y):
     return lambda: x * x + y * y
print(fun(1, 2))
f = fun(1, 2)
print(f())


# 结果:
<function <lambda> at 0x7f5c2942a9b0>
5

传入多个参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f = lambda x,y =1,*args,**kwargs :(x*y,args,kwargs)
print(f(2,4,5,a=1,b=5))

# 结果:
(8, (5,), {'a': 1, 'b': 5})

练习

1. (华为机试练习)

题目描述:数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相索引的数值进行求和运算,输出按照key值升序进行输出。

- 输入描述:先输入键值对的个数,然后输入成对的index和value值,以空格隔开

- 输出描述:输出合并后的键值对(多行)

- 示例1:

输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 4
 0 1
 0 2
 1 2
 3 4

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 0 3
 1 2
 3 4

脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
d = dict()
Num = input("please input Num: ")
for i in range(Num):
    N = raw_input("please input index and value: ")
    if d.has_key(N.split()[0]):
        New = str(int(d[N.split()[0]]) + int(N.split()[1]))
        d.pop(N.split()[0])
        d.setdefault(N.split()[0], New)
    else:
        d.setdefault(N.split()[0], N.split()[1])
        
for j, k in sorted(d.items()):
    print(j, k)

2. 题目描述

现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。现在需要你用程序来判断IP是否合法。

输入描述:输入一个ip地址

输出描述:返回判断的结果YES or NO

示例1:

输入: 10.138.15.1

输出: YES

脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IP = raw_input("please input IP: ")
for i in IP:
    if not (i.isdigit() or i =="."):
        print("NO")
        exit(1)
else:
    if len(IP.split(".")) == 4:
        for j in range(4):
            if int(IP.split(".")[j])>=0 and int(IP.split(".")[j])<=255:
                print("YES")
                exit()
            else:
                print("NO")
                exit(1)
    else:
        print("NO")
        exit(1)

3.函数式编程考察

用 filter()进行函数式编程,写一段代码来给出一个年份的列表并返回一个只有闰年的列表列表解析式实现方式呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fun(N):
     if (N % 400 == 0) or (N % 4 == 0 and N % 100 != 0):
         return True
     else:
         return False
Year = raw_input("please input Year: ")
li = []
for i in Year:
    if not (i.isdigit() or i.isspace()):
        print("input Error!!!")
        exit(1)
for j in Year.split():
    li.append(int(j))
li = list(set(li))
print(filter(fun, li))

4.携程旅行网

给定一个整型数组,将数组中所有的”0”移到末尾,非”0”项保持顺序不变在原始数组上进行操作,勿创建新的数组

输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
第一行是数组长度
后续每一行是数组的第一条记录

输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
调整后的数组内容

样例输入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 4
 0
 7
 0
 2

样例输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 7
 2
 0
 0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
array = [1, 0, 4, 0, 3, 2, 0, 1]
print(sorted(array, key=lambda x: 1 if x == 0 else 0))

# 结果:
[1, 4, 3, 2, 1, 0, 0, 0]
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 离不开的网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一文读懂Python 高阶函数
将函数作为参数传入,这样的函数称为高阶函数。函数式编程就是指这种高度抽象的编程范式。 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。如下所示:
Wu_Candy
2022/07/04
2740
一文读懂Python 高阶函数
Python 基础 高阶函数
python 把函数作为参数   如果传入abs 作为参数     def add(x,y,y):       return f(x) + f(y)     add(-5,9,abs)   根据函数的定义,函数执行的代码实际上是。     abs(-5) + abs(9) python 中map() 函数     map() 是 python 内置的高阶函数,它接收一个函数 f 和 一个list,并且把 f 一次作用在     list的每一个元素上,得到一个新的list 并返回。     我们需要传入函数
用户1197315
2018/04/03
7130
Python编程 匿名函数,高阶函数
infors = [{'name':'qian' , 'age':28},{'name':'amy' , 'age':20},{'name':j
网络豆
2023/10/15
1930
Python编程 匿名函数,高阶函数
python之高阶函数和匿名函数
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
py3study
2020/01/16
4580
Python学习笔记(五)——函数式编程
成功!说明变量f现在已经指向了abs函数本身。直接调用abs()函数和调用变量f()完全相同。
蛮三刀酱
2019/09/10
3740
第3章 Python 基础 ( 嵌套&匿名&高阶函数 )
通过上面的例子,我们理解了,每个函数里的变量是互相独立的,变量的查找顺序也是从当前层依次往上层找。
axiomxs
2021/11/26
2280
python内置常用高阶函数(列出了5个
引用自:http://www.cnblogs.com/duyaya/p/8562898.html
py3study
2020/01/16
6280
python内置常用高阶函数(列出了5个
5 Python 基础: 高阶函数学习实践
以Python内置的求绝对值的函数abs()为例,调用该函数用以下代码:abs(-10)
野原测试开发
2019/07/24
4060
5 Python 基础: 高阶函数学习实践
Python基础——4高阶函数
map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
py3study
2020/01/19
3010
Python学习 Day 5 高阶函数 map/reduce filter sorter 返回函数 匿名函数 装饰器 偏函数
>>> abs(-10) #把abs指向10后,无法通过abs(-10)调用该函数
统计学家
2019/04/10
3520
Python 高阶函数
高阶函数:简单来讲,一个函数可以接收另一个函数来作为参数,这样的函数称之为高阶函数
py3study
2020/01/19
6880
Python那些事——Python之函数式编程!
函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。函数式编程的一个特点就是,允许函数接收函数作为参数,也允许把函数作为返回值返回。Python对于函数式编程提供部分支持。由于Python允许使用变量,因此Python不是纯函数式编程语言。 #高阶函数 所谓高阶函数,就是允许函数的参数接收其他函数 下面介绍几个python内置的高阶函数: ##map() map()函数接收两个参数,一个序列,
企鹅号小编
2018/02/24
6370
Python那些事——Python之函数式编程!
Python进阶教程笔记(七)函数式编程
由于参数 x, y 和 f 都可以任意传入,如果 f 传入其他函数,就可以得到不同的返回值。
Lemon黄
2020/10/30
4770
Python进阶教程笔记(七)函数式编程
Python入门:9.递归函数和高阶函数
在 Python 编程中,函数是核心组成部分之一。递归函数和高阶函数是 Python 中两个非常重要的特性。递归函数帮助我们以更直观的方式处理重复性问题,而高阶函数通过函数作为参数或返回值,为代码增添了极大的灵活性和优雅性。无论是实现复杂的算法还是处理数据流,这些工具都在开发者的工具箱中扮演着重要角色。本文将从概念入手,逐步带你掌握递归函数、匿名函数(lambda)以及高阶函数的核心要领和应用技巧。
平凡之路.
2025/01/13
460
Python函数式编程-高阶函数、匿名函数、装饰器、偏函数
本篇文章我们来介绍下Python函数式编程的知识。最主要的一点,Python中的函数是对象,可以复制给变量!好了,我们来介绍几个Python函数式编程中的要点,包括高阶函数、匿名函数、装饰器、偏函数等等。精彩内容,不容错过!
QQ1622479435
2018/10/23
7540
Python基础【高阶函数】
高阶函数 map(fun,seq) 将seq中的元素依次作为参数传入fun,返回由函数返回值组成的新的列表。 python3:返回一个map对象 python2:返回列表 可以用list将对象转换为列
py3study
2020/01/15
3710
Python入门高阶教程-高阶函数
前面写的 Python 入门教程中只有基础入门和基础进阶两部分,可以在公众号下拉菜单中找到,小一我都已经分好类了。
小一不二三
2020/02/07
7260
Python入门高阶教程-高阶函数
Python常用高阶函数(文末粉丝红包)
高阶函数的定义:接收函数作为参数,或者将函数作为返回值的函数。函数式编程就是指这种高度抽象的编程范式。
吾非同
2020/11/04
4540
Python常用高阶函数(文末粉丝红包)
Python函数式编程学习笔记
高阶函数:既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
霍格沃兹测试开发Muller老师
2024/05/14
1150
Python小世界:匿名函数、高阶函数、
木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握。 另外,网上关于Python基础知识的各种普及已有太多太多。 附上相关大神的技术栈:
py3study
2020/01/15
4770
相关推荐
一文读懂Python 高阶函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验