Contents

1.3.1:自学CS61A的1、2、3、4节课程笔记

CS61A-1:computer_science

计算机科学是一个很宏大的命题,每个人可能只是从事其中的一小块儿内容,但行业工作者都有一个共同的敌人,那就是复杂性,而我们的武器便是抽象 对于完全没有编程经验的人建议CS10课程 课程的目标是学习,而不是让人们去show off what they already know 第一节课相当于是导论,最后以莎士比亚的所有文章作为数据内容,向我们展示了一下一些有趣的对于数据的操作

一个难受的问题就是似乎不能注册,难受了,不过不影响,操作可以本地进行。

disc 00&lab 00

其实就相当于是环境搭建和一些基础的命令 感觉cs61a里面的这个全自动评分系统挺好的,而且还可以离线进行,真的很适合我们这种不是伯克利的学生偷学 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_1.png

CS61A-2:functions

Announcements

Expressions

所有表达式都能用函数表示,然后调用函数来使用——call https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_2.png 这里展示了程序是如何call这些函数来调用的

Name,Assignment,and User-Defined Functions

对于函数的名字进行了讲解,最后的一个例子很有意思反正我错了 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_3.png The answer is : min(max(2, min(max(1, 5),3)), 4) =>min(max(2, 3), 4) => min(3,4)

Environment Diagrams

在online python tutor中你可以一行一行的查看代码运行结果,形成paragram https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_4.png

Defining Functions

在def和:中间的是,函数签名,它告诉你函数的名字和参数 函数体,定义了函数的作用,最简单的函数体就是一个return表达式 在执行过程中,对于def,它会将函数名和函数体绑定在一起 环境是一系列frame,frame是一系列的函数名和函数体的绑定,环境可以是local frame或者global frame 寻找frame的时候先在本地然后在全局环境 这个代码如何运行的 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_5.png

CH1.1&1.2

SICP

HOMEWORK

HW 01:functions,control


CS61A-3:control

Announcements

我好羡慕啊,国外的老师真的是想让你狠狠的学会,连如何去办公室的路线都给你规划好了,并且专门留出了工作人员专门解决作业问题,专门的空间供大家讨论学习。当然,还是得主动参加才有效果。

函数分为pure function和side effect function,一般来说函数最后会return一个值,便是pure function side effect比如print函数就是将输入作为输出,返回的值是none,none是python里的空函数,这个值在解释器里不会被作为结果输出 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_6.png

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_7.png

![[1_3_1CS61A-1,2,3,4_image_1.png|运行原理图]]

Multiple environment

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_9.png def定义一个函数,但它并不会运行,在函数被call(调用)时用参数替换形参,会创建出一个新的frame,然后在新的环境下运行 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_10.png 调用的时候会在一个global frame下面生成几个不同的local frame也就是不同的环境来运行程序

Miscellaneous Python Features

目前还没有讲过python的内建函数,这实际上很复杂,以后会进行讲解,目前只是讲解一下add和mul https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_11.png 为什么需要有 整数除法,保留商和余数可以始终保留准确的解 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_12.png -i 参数交互式解释器,可以查看变量值 运行python3 -i ex.py后,运行,其中r被占位符默认为10,如果没有赋值就为10 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_13.png

Conditional statement

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_14.png 后面简单介绍了一下布尔函数

Iteration

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_15.png 在语句中评估header是否为真,然后执行并返回步骤1,会在一个body中重复很多次步骤

CS61A-4:high-order functions

Announcements

Example: Prime Factorization(质因数分解)

质因数分解,是大于1的每一个整数被证明只能由一组从小到大排列的质数相乘得到。 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_16.png

def prime_factors(n):
    """print the prime factors of n in non-decreasing order.

    
    >>>prime_factors(8)
    2
    2
    2
    >>>prime_factors(10)
    2
    5
    >>>prime_factors(11)
    11
    >>>prime_factors(12)
    2
    2
    3
    >>>prime_factors(858)
    2
    3
    11
    13
    """
    while n > 1:
        k = smallest_prime_factor(n)
        n = n // k
        print(k)

def smallest_prime_factor(n):
    """Return the smallest k>1 that evenly divides n."""
    k = 2
    while n % k != 0:
        k = k + 1
    return k

我们进入这个网站看它的运行框架图[[https://pythontutor.com/]] 可以一步一步查看这个代码是如何运行起来的 其中再写代码的时候,先不管底层如何实现,先写顶层代码,假装我们有这样的一个函数,它可以做某件事,这实际上就是一种抽象,然后在后续的代码中我们再写出smallest_prime_factor() 其实上面的代码可以写成一个函数,只是两个函数会有更好的易读性,它是一种高层次描述的算法

Iteration Example

迭代的一个例子:斐波那契数列 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_17.png https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_18.png当我们对代码进行了如上改变之后,它依旧是正确的,因为在运行后还是会进入正确的轨道,它甚至更好,因为它可以算出第一个斐波那契的值

Designing Functions

这一小节向我们介绍了函数的作用,如何设计一个好的函数 在以前没有函数的时候,人们用声明去编程,这常常导致很混乱,后面函数出现了,人们只需要关注函数本身的作用,而不需要去管那些详细的声明 在写函数的时候,我们应该尽量让他保持简单易读,或者有详细的文档讲解如何使用,尽量写出通用的一般函数,这样我们可以一次编写,到处调用。 我们尽量写出剪刀函数,而不是瑞士军刀,这也是linux哲学里的一个工具只做一件事,然后把这件事做到极致。

Higher-Order Functions

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_19.png 找到共同的可以复用的点,然后进行代码设计 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_20.png 这里就是一个高阶函数,将另一个函数作为参数传入高阶函数https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_21.png

Functions as return values

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_22.png 在local def 的语句中,可以引用enclosing函数的参数,将函数作为返回的值 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_23.png 它可以做的事情 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_24.png higher-order function的好处

  • 📅 2023-01-28 敲代码在网站里查看是如何运行的 ✅ 2023-01-28 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_25.png

从图中逐步分解步骤,我们可以看出,这段代码是以函数adder作为make_adder返回的值,所以我们的f = make_adder(2000)运行后其实就相当于是,f = adder(2000),而这个2000就是adder的参数k的值 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/1_3_1CS61A-1,2_image_26.png ^32405e

可以看出ai可以说出原因,但是原因并不是从ai这里找到的,只是理解之后发现它这样说没问题,我们还是不能完全依靠ai

Lab1 Office Hours

Flag Counter