lambda表达式

from math import sin
def my_sin(x):s=round(sin(x),2)return s
my_sin=lambda x:round(sin(x),2)
#参数列表:  函数的返回值
a=[1,3,4,5]
#两个my_sin是一个意思
b=map(my_sin,a)
print(list(b))

改造方式
1.检查是否能精炼函数体
2.删除关键字:def,函数名,括号,return
3.合并为一行

lambda表达式不需要函数名,直接作为一个匿名函数使用

a=['213','232132141','23','21312432']
def longstr(s):return len(s)>3b=filter(longstr,a)
print(list(b))
#上下等价
c=list(filter(lambda s:len(s)<4,a))
print(c)
def my_add(x,y):return x**2+y**2
print(my_add(2,3))
#上下等价
f=lambda x,y:x**2+y**2
print(f(2,3))

如果函数本身不需要传参,那么lambda后面确实不用加参数

题目:函数转lambda

以下函数求 xⁿ + 2 的值,请将其改写为lambda表达式并测试功能。
def calc(x, n):
s = x ** n + 2
return s

def calc(x, n):s = x ** n + 2return sf=lambda x,n:x**n+2
print(f(5,3))

以下是一个传统的求和函数,可以计算从
1 到 指定数字 n 之间的整数总和。
def calc(n):
res = 0
for i in range(n + 1):
res += i
return res
请使用lambda表达式实现同样的功能,然后求1~100的累加和。
提示:可以通过 sum、range 等方法,把循环求和简化为单行代码。

x=lambda n:sum(list(range(n+1)))
print(x(100))

题目:无参数lambda表达式

某机构的数据模拟岗位,经常会用到一个功能,就是生成100个1到50之间的随机数并放入一个列表中。
传统方式下,实现此功能需要写一个循环或列表生成式。但总是这样重复书写非常繁琐。
因此请使用lambda表达式制作一个函数,可以自动返回一个列表,其中含有100个1~50之间的随机数。然后调用该函数得到一个列表并打印测试。

import random
my_list=[]
def list_tool():for i in range(50):my_list.append(random.randint(1,50))print(my_list)
list_tool()
#上下等价,下面用了列表生成式
my_fun = lambda: [random.randint(1, 50) for _ in range(100)]
print(my_fun())

题目:lambda作参数

以下是某个班级的学生成绩,请使用高阶函数 filter 将及格的分数过滤出来。但是不要单独编写自定义函数,而是直接在 filter 中用 lambda 表达式写出过滤函数。
vals = [97, 65, 43, 75, 59, 82, 46, 71]

vals = [97, 65, 43, 75, 59, 82, 46, 71]
print(list(filter(lambda s:int(s)>60,vals)))

我们已经学过,sorted函数可以对字符串按照字母ASCII码顺序进行排序。只不过大写字母与小写字母的ASCII码位不同,因而会出现 ‘C’ < ‘a’ 的情况,不符合题目“不区分大小写的要求”。
现在有以下列表,其中包含多个英文人名,并且需要不区分大小写排序。请使用sorted与 lambda 表达式完成此功能:
names = [‘Emily’, ‘olivia’, ‘sophia’, ‘ava’, ‘Grace’, ‘ella’]

names = ['Emily', 'olivia', 'sophia', 'ava', 'Grace', 'ella']
print(sorted(names,key=lambda s:s.lower()))

Reduce函数

reduce(函数名,可迭代对象)

from functools import reduce
def my_add(x,y):return x*y
print(reduce(my_add,[3,55,3,5]))
#先传两个参,然后返回值传入下次的参数,再补充列表第三个参数
# 计算后返回结果,最后补充第四个参数,得到结果

但是再看一种情况

def sq_add(x,y):return x**2+y**2
print(reduce(sq_add,[2,3,4]))

得到的结果是185,即(4+9)^2+4*2
为了得到三个数的平方和
需要改写一下程序

def sq_add(x,y):return x+y**2
print(reduce(sq_add,[2,3,4],0))

加一个初始值,因为实际工作的,只需要y的平方,前面x仅仅接受上一个y平方的结果
也可以用lambda函数一气呵成

print(reduce(lambda x,y:x+y**2,range(1,10),0))

也可以用来干字符串

from functools import reduce
c=['张宇','汤家凤','李永乐','王式安','高昆轮']
print(reduce(lambda x,y:x+y[0],c,''))
张汤李王高

题目:reduce基本用法

请使用reduce和filter等高阶函数计算0~100之间所有偶数的和。

from functools import reduce
print( reduce( lambda x,y:x+y, filter( lambda x:x%2==0, range(101) ) ) )
#filter(找偶数,从1-100)
#reduce(累加规则,新列表)

请使用reduce函数计算[2, 5, 7, 9]的立方和。

from functools import reduce
print(reduce(lambda x,y:x+y**3,[2,5,7,9],0))

题目:reduce实现口令保管

工作中经常需要将各种系统的口令统一保存到文件或数据库中。为了安全,保存之前需要对这些口令进行加密。
请使用 reduce 函数,按照下面规则实现一个加密程序,将用户输入的数字形式的口令进行加密。口令必须是多个数字的组合,且每个数字都在1~5之间。
编码规则(每个数字对应一个字符):
1 – s;2 – t;3 – #;4 – ^;5 – *;
例如:用户输入’134431’,会得到密文为’s#^^#s’。
请使用 reduce 编写该程序,要求用户输入一个口令,然后输出其密文形式。
(提示:reduce可以把字符串中的每一个字符处理后连接在一起,形成一个新的字符串)

from functools import reduce
d={'1': 's', '2': 't','3':'#','4':'^','5':'*'}
#字典存入键值对
pwd = input('请输入密码(1~5):')
print(reduce(lambda x,y:x+d[y],pwd,'' ))
#拼接累加用pwd作为参数

递归思想

计算一个阶乘

def 阶乘(n):if n==1:s=1else:s=n*阶乘(n-1)return sif __name__=='__main__':a=阶乘(4)print(a)

用迭代思想计算

def 迭代_阶乘(n):s=1for i in range(1,n+1):s=s*ireturn sprint(迭代_阶乘(5))

递归就是大事化小,小事化了
很多时候不知道要循环多少次,所以不适用迭代
比如读取子列表的子列表之类的

def 透视(s):for i in s:if not isinstance(i,list):print(i)else:透视(i)return
x = [5, [2, 3, ['a', 'b']], [[5, 8], [6, [9, 10]]]]透视(x)

题目:递归求和

使用递归计算1~n的累加和

def my_add(n):if n==1:s=1else:s=n+ my_add(n-1)return sif __name__=='__main__':n=int(input('请输入n的值'))print(my_add(n))

题目:递归改写While循环

以下是一个简单的while循环,可以在屏幕上连续输出 5 个星号。请使用递归函数改写它,实现相同的功能。
n = 5
while n > 0:
print(’*’)
n -= 1

def Star(n):if n==0:passelse:print('*')Star(n-1)Star(5)

题目:斐波那契数列

在递归的入门练习题中,斐波那契数列是最常见的一道。它又称为黄金分割数列,形如:1,1,2,3,5,8,13…。其特点是从第三项开始,每个数字都是它之前的两个数字之和,也就是 f(n)=f(n-1)+f(n-2)。
请编写一个程序,使用递归函数,可以求出第n项的值。

def fi(n):if n<=2:return 1else:return fi(n-1)+fi(n-2)
print(fi(7))

装饰器

为了实现一个周长,面积,体积的计算,写了下面的函数

def p(r):return 2*3.14*rdef s(r):return 3.14*r**2def v(r):return 4/3*3.14*r**3if __name__=='__main__':print(p(5))print(s(5))print(v(5))

如果想要让结果都四舍五入一下

def p(r):return round(2*3.14*r,2)def s(r):return round(3.14*r**2,2)def v(r):return round(4/3*3.14*r**3,2)if __name__=='__main__':print(p(5))print(s(5))print(v(5))

但这个round函数重复写了三次,而使用函数的初衷是想简化运算。
并且重复的三次调用,如果哪一次忘了写参数,导致精度会不一致

如果只是输出口改一下,得到下面的代码

def p(r):return round(2*3.14*r,2)def s(r):return round(3.14*r**2,2)def v(r):return round(4/3*3.14*r**3,2)if __name__=='__main__':print(round(p(5),2))print(round(s(5)),2)print(round,v(5),2)

可以考虑使用高阶函数,所用函数随用随取

def rounded(f,r):s=f(r)return round(s,2)def p(r):return round(2*3.14*r,2)def s(r):return round(3.14*r**2,2)def v(r):return round(4/3*3.14*r**3,2)if __name__=='__main__':print(rounded(p,5))print(rounded(s,5))print(rounded(v,5))

方便批量修改
还可以进一步修改:

def rounded(f):def a(r):s=f(r)return round(s,2)return a#函数里面定义函数def p(r):return 2*3.14*rdef s(r):return 3.14*r**2def v(r):return 4/3*3.14*r**3if __name__=='__main__':p=rounded(p)#p代表可以进行四舍五入的新函数s=rounded(s)v=rounded(v)#改造出三个函数print(p(5),s(5),v(5))

对比最上面的代码,源代码没有改动,只是添加了一部分,称为装饰器模式
主结构没变化,加了一个四舍五入功能而已

用@wraps语法糖来重写装饰器

from functools import wraps
def rounded(f):@wraps(f)#@是一个注解,实现声明功能的语法糖#直接告诉Python rounded是一个装饰器def a(r):s=f(r)return round(s,2)return a#函数里面定义函数
@rounded
def p(r):return 2*3.14*r
@rounded
def s(r):return 3.14*r**2
@rounded
def v(r):return 4/3*3.14*r**3
#加了三个rounded,相当于以下三句话
''' p=rounded(p)s=rounded(s)v=rounded(v)'''
if __name__=='__main__':print(p(5))print(s(5))print(v(5))

装饰器简单应用

标注函数调用时间

from functools import wraps
from datetime import datetime
def log(f):@wraps(f)def a(r):print('函数',f.__name__,'于',datetime.now(),'被调用')s=f(r)return round(s,2)return a@log
def p(r):return 2*3.14*r
@log
def s(r):return 3.14*r**2
@log
def v(r):return 4/3*3.14*r**3
#加了三个rounded,相当于以下三句话if __name__=='__main__':print(p(5))print(s(5))print(v(5))

题目:函数作为返回值

对列表排序有很多种算法。除了python自带的 sorted 之外,我们也可以自己编写各种排序方法。
以下代码定义了一个 bubble_sort 函数,就是参照“冒泡法”实现的自定义排序算法。作为测试,主程序中生成了一个包含10000个随机数的列表,并用该函数测试通过。
import random
array = [random.randint(0, 10000) for _ in range(10000)]
#冒泡排序
def bubble_sort(array):
n = len(array)
for i in range(n - 1):
for j in range(0, n - i - 1):
if array[j] > array[j + 1]:
array[j], array[j + 1] = array[j + 1], array[j]
return array
考虑到用户有时候需要用冒泡排序,有时候愿意使用python自己的sorted函数。所以请定义一个新的函数 select_func,当其参数为字符串“冒泡排序”时,返回bubble_sort函数;当参数为“内置排序”时,返回sorted函数。这样,用户在主程序中可以先调用select_func得到一个自己想要的排序函数,再用该函数执行排序。
请分别测试两种排序方法,打印排序后的列表。

import random
from functools import partial
#该包用来简化函数用法
sorted=partial(sorted,reverse=True)
#把内置函数定义为倒序排列array = [random.randint(0, 10) for _ in range(10)]
def select_func(s):if s=='冒泡排序':return bubble_sortelif s=='内置排序':return sortedelse:print('输入错误!')
# 冒泡排序
def bubble_sort(array):n= len(array)for i in range(n - 1):for j in range(0, n - i - 1):if array[j] > array[j + 1]:array[j], array[j + 1] = array[j + 1], array[j]return array
if __name__=='__main__':my_sort=select_func(input('请输入想要采取的排序方法'))print(array)print(my_sort(array))

题目:函数内部定义一个函数

自定义一个函数,将前面作业中的冒泡排序算法定义在它的内部并实现逆序排序,其他功能和前面练习一样。

import random
from functools import partial
#该包用来简化函数用法
sorted=partial(sorted,reverse=True)
#创造了新的函数round2array = [random.randint(0, 10) for _ in range(10)]
def select_func(s):def bubble_sort(array):n = len(array)for i in range(n - 1):for j in range(0, n - i - 1):if array[j] < array[j + 1]:array[j], array[j + 1] = array[j + 1], array[j]return arrayif s=='冒泡排序':return bubble_sortelif s=='内置排序':return sortedelse:print('输入错误!')
# 冒泡排序if __name__=='__main__':my_sort=select_func(input('请输入想要采取的排序方法'))print(array)print(my_sort(array))

全民一起玩Python提高篇第十五课:函数式编程初步(下)相关推荐

  1. 全民一起玩Python提高篇第十四课:函数式编程初步(上)

    函数与数字.字符串.列表等一样,本质上都是某种存放在内存中的数据类型,都可以用一个名字(变量名.函数名 -- )指向它 一个函数与一个数字.字符串等一样,都可以赋值给一个变量.比如,如果 f 是一个函 ...

  2. 全民一起玩Python提高篇第十二课:面向对象基本原理与语法(三)

    继承 class A:def __init__(self):self.money=50000000self.house=100def my_small_goal(self):print('先挣他一个亿 ...

  3. 全民一起玩python提高篇_杨洋博士:全民一起玩Python之基础篇+提高篇

    课程介绍 ▶制作精细.自带吐槽,每节课程(20分钟)均耗时数十小时精心打造! ▶"全民一玩Python"系列由杨洋博士精心制作,面向所有希望学习Python编程.进而能够在学习和工 ...

  4. 全民一起玩Python提高篇第四课:深入数据类型与语法细节(下)

    提高健壮性 如果 try 结构的位置不当,可能导致死循环等问题. file_name=input('请输入文件名:') try:with open(file_name) as f:#用with的方式读 ...

  5. 全民一起玩python提高篇,全民一起玩Python 基础篇+提高篇+笔记2019年

    介绍.png; a3 a* k# G% s' | " k% y: u' e& x' l5 N笔记及课后习题.rar+ F2 ~6 R9 f( i& Y" S+ W1 ...

  6. 杨洋python课程提高篇_杨洋老师《全民一起玩Python 基础篇+提高篇》

    全民一起玩Python 基础篇+提高篇 适用人群: 想用轻松系统的方式,从零开始真正理解掌握Python.进而学习办公.网抓.数据.AI.网站等技术的各界人士 课程概述: 制作精细.自带吐槽,每节课程 ...

  7. 杨洋python课程提高篇_杨洋老师:全民一起玩Python 基础篇+提高篇,老师幽默严谨不枯燥的学习编程...

    课程介绍 本套课程出自杨洋老师的全民一起玩Python 基础篇+提高篇官网售价299元,程保持了杨洋博士老师幽默严谨不枯燥的学习编程,清晰全面的授课风格,配有丰富的教学演示和插图.动画,是初学者学习P ...

  8. android相册幻灯片功能,玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增“幻灯片播放”功能...

    玩机教程 篇四十五:「MIUI玩机技巧63」MIUI相册新增"幻灯片播放"功能 2020-02-17 16:15:35 0点赞 0收藏 0评论 本帖主要解决2大问题: 1) 功能科 ...

  9. 全民一起玩python求分享_全民一起玩Python 基础篇+提高篇

    课程概述: 本课程是"全民一起玩Python"系列课程的前两部.该系列课程由杨洋博士精心制作,包括<基础篇>和<提高篇>,面向所有希望学习Python编程. ...

  10. 全民一起玩Python基础篇第六课:复杂结构初步(列表、对象、模块等)(下)

    多维列表 >>> x=[2,3,4,5,'a'] >>> y=['b','c'] >>> x[1]=y >>> q=[3,4,x ...

最新文章

  1. php多文件上传类源码,PHP单文件上传类或多文件上传类源码
  2. 写有效率的SQL查询(V)
  3. Python多线程(1)——介绍
  4. 利用Hyperledger Fabric开发第一个区块链应用
  5. c# 将图片转成透明背景的png 源代码_有机_有机认证标【高清png素材】
  6. Microsoft Office 2007的ContentType
  7. C++中的三种继承public,protected,private(转)
  8. php excel 函数,php实现excel中rank函数功能的方法
  9. 七种武器武装.NET(常用开发工具介绍)(转)
  10. 光栅衍射主极大个数_基于达曼光栅的双目视觉系统
  11. forEach与map
  12. python编程入门必备知识-Python快速编程入门,打牢基础必须知道的11个知识点
  13. 怎么录制自己手机上的视频
  14. 宋智孝那个机器人_陈柏霖机器人竟然冷落宋智孝
  15. html5 制作书架展示 PHP,基于HTML5 Canvas的CSG构造实体几何书架
  16. 西瓜书.第五章(神经网络)重点最全整理+课后习题
  17. 打印机不打印计算机原因,打印机正常但无法打印原因以及如何解决
  18. CTF 逆向之MD5短爆破
  19. vue实现微信公众号微信登录
  20. python抽奖简单小程序游戏_用Python做个年会抽奖小程序吧

热门文章

  1. 电脑提示文件或目录损坏且无法读取
  2. ASP.net的简单认识
  3. 别让蛋壳跑了、打工人的「爷青回」和今天团购了吗?|极客一周
  4. 地理(影像)配准中的变换方法的选择
  5. GraphPad Prism 中文版 科研绘图工具
  6. SQL Server上月同期 日期的计算
  7. 2011英语一长难句
  8. 基于OpenCV 的图像分割
  9. 梯形面积php,梯形的面积公式是什么
  10. 【微信小程序】微信小程序接口数据加密、解密算法