一、lab00
1.lab00.py---简单的计算:
文档中的题目:
def twenty_twenty(): """Come up with the most creative expression that evaluates to 2020, using only numbers and the +, *, and - operators. >>> twenty_twenty() 2020 """ return ------
#任意组合数字之后的答案: def twenty_twenty(): """Come up with the most creative expression that evaluates to 2020, using only numbers and the +, *, and - operators. >>> twenty_twenty() 2020 """ return (1000+10)*2 result=twenty_twenty() print(result)
2.关于变量、赋值的小问题:
Q: 求最终输出的结果?
>>> f = min
>>> f = max
>>> g,h = min,max
>>> max=g
>>> max(f(2,g(h(1,5),3)),4)
A:
第一句将min赋值给f
第二句将max赋值给f
现在f是max
第三句g是min,h是max
第四句:max指向min的应用
最终变为:
max:求最小值
f:求最大值
g:求最小值
h:求最大值
故式子最终结果为:3
题外:一个很好用的可视化程序网站(Online Python tutor):Python compiler - visualize, debug, get AI help from ChatGPT
3.defining function(定义函数)
3.1基本格式:
<<<def <name>(<formal parameters>): #parameters:参数
return<return expression>
3.2understanding:
定义函数的过程是一个高度抽象化的过程,抽象就是将复杂的事情赋予一个简单的意义,封装起来,不考虑其中的细节。因此,函数的定义是简单的也是复杂的。
3.3step:
1. 创建一个带有签名<name>(<形式参数>)的函数
2. 将该函数体设置为第一行之后的所有内容缩进
3. 将<name>绑定到当前框架中的那个函数
3.4函数在环境的产物
环境是记录名称和值之间对应关系的内存
目前的环境只有两种:
一种是全局框架(global frame)
一种是局部框架后面跟着全局框架(local frame followed by the global frame)
框架:名称与值之间的绑定。
以下为粗略的示意图:
4.Q&A
4.1什么是frame
x = 12
def f(y):
x = 3
print(x)
f(7)
print(x)
frame就是C语言的一对大括号。
4.2global frame 与local frame的关系:
如同上段代码,先执行的是global frame:x=12,接着执行local frame 这是跳脱出global 的一段执行,紧接着回到global frame 执行函数外的代码。
其中:
print内容优先级:local frame>global frame ,global frame起到补充的作用。
运行顺序优先级:global frame>local frame,从整体到局部,从前到后。
可以在online python tutor 中运行如下代码来理解上述含义:
def f(x): return g(x + 1) + 2 def g(y): return y+3 f(7)
同样的,我们无法直接通过global frame去访问local frame中的某个变量,但是可以创建一个该变量在global frame中的名字, 间接去访问。
4.3内置函数如何定义frame(框架):
为了简化程序的environment,我们一般默认内置函数完成正确,程序的environment只包括我们自身构建的environment。包括:1.我们构建整体的框架 2.我们构建的frame内的程序功能与关系,等等。
这样可以有效降低关系之间的复杂程度,利于计算复杂度以及相关算法。
于是有些时候,我们可以通过改变内置函数从而优化程序。
4.4local frame与current frame 的关系?
任何时刻都会有一个local frame ,我们称它为current frame。
一个函数调用另一个函数会发生什么?
参见4.2的代码部分。
有好几个local frame的情况下,目前正在执行的叫做current frame。
4.5调用函数时是否使用了frame?
是
4.6print 与内置函数
print无法返回return,因此无法直接使用print的值进行运算,但是内置函数自带return,可以直接参与其它计算。