CS61A_FA2019_week2&3

CS61A课程2019年秋季学年网课学习笔记

Environment & Frame

通过这两个概念去理解函数的执行过程,以及name与函数或者是数值之间的关系。

Python 命令行参数

-m doctest <python_source_file>

结合下文docstring以及doctest内容,当以文件形式编辑Python的时候,可以通过该命令进行执行测试,达到使用run_docstring_examples函数的效果

如果想在此时看到具体的docstring以及调试内容,可以在doctest后加参数-v

8WSHiT.png

-i <python_source_file>

以交互模式打开文件,执行完后进入到"»>“状态

出现的词汇

  • boolean context
  • intrinsic name
  • scope:范围广度
  • interchangeability :互换性
  • exemplify: 是…的典型(或典范、榜样); 举例说明; 例证; 例示
  • suppress: 镇压; (武力) 平定; 压制; 禁止(发表); 查禁; 封锁; 抑制; 控制; 忍住;
  • dicard: 丢弃; 抛弃; 垫(牌); 打出(无用的牌);
  • recursive:递归的,循环的
  • iteration:迭代
  • enumerate:枚举
  • halt:中止
  • arduous:艰巨的
  • refinement:细化

代码规范——Python

https://www.python.org/dev/peps/pep-0008/

  1. 函数名使用小写字母,单词与单词中间用’_‘分割,最好使用一些解释说明。
  2. 函数名最好与函数中进行的运算或者是函数的结果有关。
  3. 参数名使用小写字母, 单词与单词中间用’_‘分割 。最好使用仅使用一个单词的参数名。
  4. 参数名应当与函数中该参数的作用有关,而不是仅仅i, j, k
  5. 在变量作用很显然的时候,可以使用单个字幕表示,但是尽量少取使用l, O, I这三个,避免其他看上去和数字混淆。

函数抽象概念 & 黑盒

将函数执行的过程忽略,只考虑函数的输入、输出以及输入输出之间的关系,其他的内容不去深究。如此去使用Python Library提供的大量函数,将这些黑盒进行不断地组合,然后拼接成为整体。

函数设计

  • 一个函数对应一个功能,如果需要连续进行多个功能,就拆分成多个函数
  • DRY原则,不要在代码中多次重复相同的内容。将那些相同的内容写成一个个函数
  • 将相似的东西抽象出共性然后写成函数。

docstring & doctests

docstring内容

code is written only once, but often read many times.

描述函数的输入输出以及作用,并给出一段例子

以课本上给出的为例

def pressure(v, t, n):
        """Compute the pressure in pascals of an ideal gas.

        Applies the ideal gas law: http://en.wikipedia.org/wiki/Ideal_gas_law

        v -- volume of gas, in cubic meters
        t -- absolute temperature in degrees kelvin
        n -- particles of gas
        """
        k = 1.38e-23  # Boltzmann's constant
        return n * k * t / v

doctest模块

run_docstring_examples

def sum_naturals(n):
        """Return the sum of the first n natural numbers.

        >>> sum_naturals(10)
        55
        >>> sum_naturals(100)
        5050
        """
        total, k = 0, 1
        while k <= n:
            total, k = total + k, k + 1
        return total

testmod()

结合函数给出的docstring的内容测试函数

>>> from doctest import testmod
>>> testmod()
TestResults(failed=0, attempted=2)

run_docstring_examples(fuction_name, globals(), True)

一处一处执行函数中docstring部分给出的测试数据,如果正确,就给出ok的返回

>>> from doctest import run_docstring_examples
>>> run_docstring_examples(sum_naturals, globals(), True)
Finding tests in NoName
Trying:
    sum_naturals(10)
Expecting:
    55
ok
Trying:
    sum_naturals(100)
Expecting:
    5050
ok

assert

assert 一段表达式, "该表达式不成立时的返回值"

通过assert进行非法输入的检测,也是在验证函数的行为符合预期,避免非法输入导致程序崩溃。

同时,assert也可以作为函数调用的例子,展示函数调用的期望方式与期望结果。

一般在编写Python程序的时候将这些测试用内容单独写一个文件”*_test.py",方便修改与删除。

感觉和try…expectation蛮相似的,后面应该会讲吧

higher-order function(貌似就是函数套函数)

数学例子黄金分割计算

可以通过将一个正数x重复以下步骤得到黄金分割比例:

x += 1
x = 1 / x

贼神奇,不过到底是为什么,网上给出的解释也不清楚。

Currying(咖喱?)(柯里)

有两段代码是之前没怎么见过的,留存一下,内容很简单,就是把单一参数与多参数的函数相互转换。

>>> def curry2(f):
        """Return a curried version of the given two-argument function."""
        def g(x):
            def h(y):
                return f(x, y)
            return h
        return g
>>> def uncurry2(g):
        """Return a two-argument version of the given curried function."""
        def f(x, y):
            return g(x)(y)
        return f
>>> pow_curried = curry2(pow)
>>> pow_curried(2)(5)
32
>>> map_to_range(0, 10, pow_curried(2))
1
2
4
8
16
32
64
128
256
512

Lambda Expressions

 lambda <parameters>: <return expression> 

相当于一个简单的定义函数的方式,但是lambda表达式只能有一个返回值,没啥

尽管lambda方式更加简洁,而且使用它可以让程序看起来短一些,但是它比较影响可读性。尽管Python中有这个方式,还是尽量用def吧,看起来简单明了。

Decorator

从网络上学习的,感觉已经有人写的很清楚了,我就不重复造轮子了。

https://www.cnblogs.com/zh605929205/p/7704902.html

简单说,就是将函数名所连接的对象变成了函数作为参数进入@的结果。

>>> def trace(fn):
        def wrapped(x):
            print('-> ', fn, '(', x, ')')
            return fn(x)
        return wrapped
>>> @trace
    def triple(x):
        return 3 * x
>>> triple(12)
->  <function triple at 0x102a39848> ( 12 )
36

>>> def triple(x):
        return 3 * x
>>> triple = trace(triple)

我遇到的问题

在通过ok进行练习或者测试的过程中,发现没有bcourse的邮箱,上网发现似乎是要邀请或者是伯克利本校的学生才能弄到,于是就自high地做做题吧,不提交了,等明年新一轮cs61a开课再补上作业,这样也有机会复习一遍。

听歌的时候偶尔听到一首歌很喜欢,评论区捞到是《四月物语》的插曲,码住码住,以后补上,以后一定看,一定看,咕咕咕。