热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

日拱一卒,CS61A作业2,两道题熟悉Python函数式编程

日拱一卒,CS61A作业2,两道题熟悉Python函数式编程-大家好,日拱一卒,我是梁唐。本文始发于公众号:Coder梁我们今天继续来看伯克利CS61A的公开课,这次咱们聊聊hw

大家好,日拱一卒,我是梁唐。本文始发于公众号:Coder梁

我们今天继续来看伯克利CS61A的公开课,这次咱们聊聊hw02,也就是作业2。

这一次的作业关于Python函数式编程,其实哪怕是局限在Python语言当中,函数式编程也不是一个简单的概念。除了高阶函数之外,还有装饰器、偏函数、MapReduce等等许多内容。

Github

作业说明

但在日常使用当中,高阶函数的使用往往可以大幅提升代码质量,降低阅读难度,但大多数情况下并不是必须的。我不确定制定课程的教授是如何思考的,以我个人来看,作为初学者而言,了解函数式编程的思想以及它的使用场景,对这个概念熟悉起来,其实要比死记硬背一些所谓高端的用法更有用。

这一次的作业,刚好是一个非常好的用来学习、熟悉函数式编程思想的例子。

废话不多说,我们来看题。

首先,题目给定了一些代码,定义了一些函数。有常规函数,也有匿名函数。

def square(x):
    return x * x

def identity(x):
    return x

triple = lambda x: 3 * x

increment = lambda x: x + 1

add = lambda x, y: x + y

mul = lambda x, y: x * y

在Python当中,匿名函数以关键字lambda开头,后面跟函数的传参,冒号之后是函数的返回结果。在这种格式的限定下,使得匿名函数的逻辑往往不能太过复杂,只能用来解决一些简单的计算问题。

我们简单阅读一下代码,可以看到这几个函数的功能都非常简单。square是平方,identity就是返回本身,triple是乘3,increatment是自增1,add是两数相加,mul是两数相乘。

看完了这段代码之后,开始正式看题。

Q1: Product

课件当中有一个例子是函数summation(n, term),它是一个高阶函数,它返回term(1) + term(2) +...+ term(m)的结果。

请你仿照summation函数,实现一个product函数,来实现term(1) * term(2) *...*term(n)

其中课件中的summation函数代码如下:

def summation(n, term):
    """Sum the first N terms of a sequence.

    >>> summation(5, cube)
    225
    """
    total, k = 0, 1
    while k <= n:
        total, k = total + term(k), k + 1
    return total

核心点在于term不仅是函数的传参,而且它本身就是一个可以调用的函数。所以只要搞清楚这点,代码非常好写:

def product(n, term):
    """Return the product of the first n terms in a sequence.
    n    -- a positive integer
    term -- a function that takes one argument

    >>> product(3, identity)  # 1 * 2 * 3
    6
    >>> product(5, identity)  # 1 * 2 * 3 * 4 * 5
    120
    >>> product(3, square)    # 1^2 * 2^2 * 3^2
    36
    >>> product(5, square)    # 1^2 * 2^2 * 3^2 * 4^2 * 5^2
    14400
    >>> product(3, increment) # (1+1) * (2+1) * (3+1)
    24
    >>> product(3, triple)    # 1*3 * 2*3 * 3*3
    162
    """
    "*** YOUR CODE HERE ***"
    ret = 1
    for i in range(1, n+1):
        ret *= term(i)
    return ret

# The identity function, defined using a lambda expression!
identity = lambda k: k

我们仿照同样的逻辑,将加好改成乘号即可。

第二个问题是使用product函数实现阶乘函数factorial

def factorial(n):
    """Return n factorial for n >= 0 by calling product.

    >>> factorial(4)
    24
    >>> factorial(6)
    720
    >>> from construct_check import check
    >>> check(HW_SOURCE_FILE, 'factorial', ['Recursion', 'For', 'While'])
    True
    """
    "*** YOUR CODE HERE ***"
    return product(n, identity)

我们只需要依照逻辑,让n个整数依次相乘即可。我们可以传入函数identity,因为identity(x)=x

Q2: Make Adder with a Lambda

实现make_adder函数,它返回一个lambda表达式。

本题就是lambda表达式的基本使用,了解函数式编程之后,也很简单。

def make_adder(n):
    """Return a function that takes an argument K and returns N + K.

    >>> add_three = make_adder(3)
    >>> add_three(1) + add_three(2)
    9
    >>> make_adder(1)(2)
    3
    """
    "*** YOUR CODE HERE ***"
    return lambda x: x + n

对于返回的函数lambda x: x+n而言,这里的参数n的定义在它的外部。这里涉及到Python当中一个很重要的概念叫做——闭包,闭包的原理和应用也是函数式编程中的一个范畴。

大家要是感兴趣可以去研究一下,这里不做过多的展开了。


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • github上_idea上传本地项目到github上(图解)
    本文由编程笔记#小编为大家整理,主要介绍了idea上传本地项目到github上(图解)相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例为了方便查看源代码,关联导入源代 ... [详细]
  • 《Spark核心技术与高级应用》——1.2节Spark的重要扩展
    本节书摘来自华章社区《Spark核心技术与高级应用》一书中的第1章,第1.2节Spark的重要扩展,作者于俊向海代其锋马海平,更多章节内容可以访问云栖社区“华章社区”公众号查看1. ... [详细]
author-avatar
辞骸
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有