CS61A课程2019年秋季学年网课学习笔记
Environment & Frame
通过这两个概念去理解函数的执行过程,以及name与函数或者是数值之间的关系。
Python 命令行参数
-m doctest <python_source_file>
结合下文docstring以及doctest内容,当以文件形式编辑Python的时候,可以通过该命令进行执行测试,达到使用run_docstring_examples函数的效果
如果想在此时看到具体的docstring以及调试内容,可以在doctest后加参数-v
-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/
- 函数名使用小写字母,单词与单词中间用’_‘分割,最好使用一些解释说明。
- 函数名最好与函数中进行的运算或者是函数的结果有关。
- 参数名使用小写字母, 单词与单词中间用’_‘分割 。最好使用仅使用一个单词的参数名。
- 参数名应当与函数中该参数的作用有关,而不是仅仅i, j, k
- 在变量作用很显然的时候,可以使用单个字幕表示,但是尽量少取使用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
开课再补上作业,这样也有机会复习一遍。
听歌的时候偶尔听到一首歌很喜欢,评论区捞到是《四月物语》的插曲,码住码住,以后补上,以后一定看,一定看,咕咕咕。