这是一门非常经典的编程入门课,lab 质量非常好,可惜我当时不知道,后来才补刷的,所以我不会记录一些基础的语法相关的知识,只记录一些我认为有趣的地方,记录的顺序是我学习的顺序,不按照类别

Lecture 1 - Intro

TA 和 tutor 是两个概念,TA 更注重整体课程的管理和学术支持,而 tutor 则更专注于个别学生的学习需求和解答疑问,进一步感慨这门课师资力量的强大。

Lab 00 - Getting Started

因为没有账号,所以需要本地验证和提交

# 本地验证
python ok --local
# 解锁测试集
python ok -u

Lecture 2 - Function

在 Python 中,局部变量优先,所以下面的输出是 100

x = 1
def my_func():
	x = 100
	print(x)

Lecture 3 - Control

这一章提到了 Docstrings 的用法,这在写自己的库的时候非常有用,我以前都没有接触过这样的写法。

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

有点 man 的概念,但更像 jupyter notebook 的用法,将代码和说明放在一起,可惜不是 markdown,通过 print(pressure.__doc__) 就可以查看帮助信息

Python 有一个特殊的语法糖,断言 assert,要知道 Python 是解释性语言,逐行运行,那么通过断言就可以决定是否运行它下面的代码,不需要额外用一个 if 增加大缩进。而且可以直接在错误的时候推出程序并报告问题,方便检查。这在验证用户输入是否合法中非常有用,防御性编程了属于是。

score = int(input())
#断言考试分数是否合理
assert 0 <= score <= 150, "输入的分数不在 0 - 150 之间,请重新输入"
#断言正确,后续代码才能继续执行
...

Disc 01 - Control

在 Q4 中 unique_digits 有更好的思路,使用 set 来去重

def unique_digits(n):
    """Return the number of unique digits in positive integer n.

    >>> unique_digits(8675309) # All are unique
    7
    >>> unique_digits(13173131) # 1, 3, and 7
    3
    >>> unique_digits(101) # 0 and 1
    2
    """
    digits = set()
    while n > 0:
	    digits.add(n % 10)
	    n //= 10
	return len(digits)

Lecture 4 - Higher-Order Functions

  • Generalization 是 Python 非常重要的概念,Don’t Repeat Yourself!
from math import pi, sqrt

def area(r, shape_constant):
	return shapeconstant * r

def area_square(r):
	return area(r, 1)

def area_circle(r):
	return area(r, pi)

def area_hexagon(r):
	return area(r, 3 * sqrt(3) / 2)

这样一来就实现了复用,不需要每个函数都重写一遍

  • Currying 很少用,但很有趣,可以把多参数函数改写为多个单参数函数组合
def mul_three(x, y, z):
	return x + y + z

def f(x):
	def g(y):
		def h(z):
			return x + y + z
		return h
	return g

f(x)(y)(z) == mul_three(x, y, z)
  • Lambda 是常用的语法糖,非常适合用来表达和计算公式

  • Function Decorators 这个在 slides 里没有,在书里

    不想改函数定义,但是想实现新功能的时候非常有用

    def log(func):
        def wrapper(*args, **kw):
            print('call %s():' % func.__name__)
            return func(*args, **kw)
        return wrapper
    
    # 调用装饰器
    @log
    def now():
        print('2021-01-01')
    
    # 输出,相当于先执行了 log 函数
    >>> now()
    call now():
    2021-01-01