跳至主要內容

表达式与序列

大约 3 分钟

表达式与序列

print(print('What happend?'))

函数式编程的起源可以追溯到数学逻辑和lambda演算的发展。Lambda演算由阿隆佐·丘奇(Alonzo Church)在20世纪30年代提出,旨在研究函数定义、函数应用和递归等概念。

LISP(1958年)是最早的函数式编程语言之一,由约翰·麦卡锡(John McCarthy)创建,它的设计受到lambda演算的影响。

函数是有输入和输出的

但是打印在屏幕上的内容,并不是函数的输出,那只是求值过程中的副作用罢了

我们在最开始时,已经学过了表达式,现在我可以告诉你,函数的调用也是一个表达式,它是有值的

让我们重新看看发生了什么:

  • python 读取到print(print('What happend?')),这是一个表达式。
    • 计算print(print('What happend?')),发现需要先算出print('What happend?')
      • 计算print('What happend?')在屏幕上输出What happend?,并得到None
    • 计算print(None)在屏幕上输出None,并得到None
  • 最外层没有东西了,返回的None被忽略(丢弃)。

这样就很清楚了,过程和我们教程一开始分析的数学表达式几乎一致,只是中间多了些副作用

还有一个问题……None是什么?

调用print(...)时,print会把输入的内容打印到屏幕上,然后什么都不返回(这很符合直觉)

在 python 中,函数如果什么都没返回就运行结束了,就默认得到None,它是和0类似的值,意味着什么都没有

我们可以显式地将它表达出来

print(None)

我们之前定义的函数都是没有返回值的,所以它们的返回值都是None

def area_of_a_rectangle(a, b):
    print(a*b)

print(area_of_a_rectangle(1, 2))

如果我们想要返回一个值,可以使用return语句,

这样我们就能够构造出更有用的函数了,

事实上,这才是函数的真正用法。

def square(a):
    return a ** 2

print(1 + square(3))

return 会结束函数的调用,并且将它后面的表达式的值,作为这次函数调用的值返回

一旦 return ,后面的内容不会被执行了,因为函数已经返回了

def square(a):
    print('start!')
    return a ** 2
    print('end!')

print(square(2))

python 执行了什么?

  • 注释和空白行会跳过
  • 没有返回值但是可以执行的,一般占一行,称为语句
    • def
    • =
    • return
    • 更多……
  • 有返回值的,可以嵌套,称为表达式
    • 1
    • 1+1
    • (2 * 3)
    • 1 + (2 * 3)
    • "awa"
    • name
    • print
    • print('awa')
    • 更多……

事实上,语句并不是必要的,经过恰当的语言设计,整个程序可以被写成一整个表达式

让程序运行的过程就是表达式求值的过程

现代大多数语言中都包括语句和表达式这两种东西,单纯是历史遗留问题

试试这个,它看起来就是一个计算圆的面积的函数

PI = 3.1415926

s = 0

def area_of_a_circle(radius):
    '''计算圆的面积'''

    s = PI * radius**2

area_of_a_circle(2)
print(s)

等等,为什么报错了?

递归

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.0.0-alpha.10