笔记9 笨办法学python之练习18函数随感之一

笔记9 笨办法学python之练习18函数随感之一

这一次先把文本仔细看看之后,再来编码。因为这个练习提到了函数,真得把python中的函数和数学中的函数做个区分才对。希望这个练习可以在新浪博客上弄一个博客,已经很有些时间把新浪博客给忘掉了。
提到函数,让人想起微积分的发明者,德国哲学家莱布尼兹(1646-1706)。1694年,中国清朝的康熙年间,莱布尼兹在一篇论文中大概是首次提到函数这个词。这篇论文名为《有关切线的逆方法即函数》,函数在这篇论文中是这样提出来的:
设曲线上有一个点A在运动,与A点相对应的切线和曲率也随A的运动而产生变化,在点A运动状态下的这个同样也在运动的切线和曲率,就被称作为动点A的函数。
函数的这个说法后来被很多数学家所继承,可以列出很多,仅以法国数学家柯西(1789-1857)的说法为例。什么是函数呢?柯西在《分析学讲义》一书中这样说:
几个变量之间存在着关系,随着其中一方值的确定,另一方的值也可以确定下来的时候,一般考虑用前者来表示后者。此时,前者叫做独立变量,后者叫做这个变量的函数。
函数概念后来又被逻辑学家关注,现代逻辑的创始人,德国逻辑学家弗雷格(1848-1925),1904年发表了一篇专门讨论“函数”的论文《什么是函数?》。在这篇论文中,弗雷格从逻辑精确性的角度,对函数有了更为准确的论述。弗雷格极为敏锐地指出:函数不是一个数,用数来定义函数,那正是逻辑混淆的错误。
弗雷格说:
“如果用一个数来补充一个函数使之成为一个数,则我们称后面的这个数为前面那个作为自变元的数的函数值(不是函数而是函数值)。人们通常把“y=f(x)”这个函数读作:“y是x的一个函数”。这里有两个错误,第一,人们用连词翻译等号;第二,人们将函数与一个自变元的函数值混淆起来。由这些错误形成一种意见,认为函数是一个数,甚至是一个变量或者不确定的数。与此相反,我们已经看到,根本没有这样的数,函数与数根本不同。”

那么,究竟应该怎么看待函数这个概念呢?弗雷格在另一篇同样讨论函数的论文《函数和对象》的论文中,强化了他认为函数不是数的想法,而举了另外一个例子。
弗雷格认为,一个变元x是可以不是数字的,例如:
“X的首都”,弗雷格把这类表达式称为不完全或者未满足的表达式。当我们把x指定一个国家的时候,这个表达式总会有一个对应的东西。因此,这个“x的首都”就是一个函数表达式,尽管x表示的并不是一个数。于是,我们就看到有关函数的另外一种来自逻辑概念的表述:
“由此可以看出,逻辑中称为概念的东西与我们称为函数的东西十分紧密地联系在一起。人们确实完全可以说,一个概念是一个其值总是一个真值的函数。”

于是函数就真的不是一个数,而是把一个不完全的符号,转换为一个完全符号的操作过程。这个操作的对象,可能是数字,也可能是数字以外的东西。
这样,数学家和逻辑学家对于函数的历史陈述,在现代数学中就成了构成函数的几大要素的所谓“函数意识”。在弗雷格时代的新逻辑和康托的集合论基础上,我们对于函数的理解,也就是所谓函数意识,或者说函数涵盖的元素,就成了这样的几种东西:
第一个因素是集合,几乎涵盖任意对象的集合概念。无论是函数的哪一部分对象,都属于我们集合概念中的一个类别。
第二个因素是变量,函数的一般变量,传统称自变量,一个几乎可以装进任何东西的函数元素。再就是函数的从属变量,传统称应变量(或者因变量)。而把这个从属变量和一般变量联系起来的,则应该看作是函数的第三个要素,那就是对应要素。
第三个因素是对应,把函数的一般变量和从属变量关联起来的那个纽带,在集合论中有个概念称映射,还有所谓镜像这样的形象语词,大体表达了这个对应的基本涵义。但何以两大类集合能够对应起来呢,似乎需要一个有点神秘,并且相对模糊的东西来构成集合间的对应,这就需要第四个要素。
第四个要素从逻辑的角度看,有点像因果联系。让两个集合对应起来的,一定有某种趋势,某种类似,或者某种应景而生的类似缘分一样的东西。
例如x的首都这个不完全表达式,我给x填以中国,立刻就有一个对应的城市出现。这里的集合要素有了,变量要素有了,对应要素有了。但你还是会感觉到,那第四个要素隐然存在。
关于函数的常规理解,就到此为止了。那么,这个函数概念,在python语言中是不是有特殊之处呢?我们跟着教材走。
练习18一次就执行成功了,这个脚本总共有四个函数,我们慢慢理解分析。
执行ex18.py

# this one is like your scripts with argv.
def print_two(*args):
    arg1,arg2 = args
    print(f"arg1:{arg1}, arg2:{arg2}")

# ok, that *args is actually pointless, we can just do This
def print_two_again(arg1, arg2):
    print(f"arg1: {arg1}, arg2: {arg2}")

# this just takes one argument
def print_one(arg1):
    print(f"arg1:{arg1}")

# this one takes no arguments
def print_none():
    print("I got nothin'.")


print_two("Zed","Show")
print_two_again("Zed", "Show")
print_one("First!")
print_none()
这里插入代码片

第一个函数print_two,第二个函数print_two_again,第三个函数print_one,第四个函数print_none。我们得从学理上说明一下,何以这个脚本有四个函数?计算机语言的函数和我们上面讨论的函数是一回事情么?
先琢磨下def的涵义
A function definition defines a user-defined function object (see
section The standard type hierarchy):
A function definition is an executable statement. Its execution binds
the function name in the current local namespace to a function object
(a wrapper around the executable code for the function). This
function object contains a reference to the current global namespace
as the global namespace to be used when the function is called.

The function definition does not execute the function body; this gets
executed only when the function is called. [2]

A function definition may be wrapped by one or more decorator
expressions. Decorator expressions are evaluated when the function is
defined, in the scope that contains the function definition. The
result must be a callable, which is invoked with the function object
as the only argument. The returned value is bound to the function name
instead of the function object. Multiple decorators are applied in
nested fashion. For example, …….

一个函数的定义,它定义了这个被定义函数对象的使用者(可参看标准类型继承的那一部分):
一个函数定义是一个执行的陈述。它的执行绑定了函数名,而这个函数名处在当前局部名称空间到函数对象之中(执行该函数编码的一个封装器)。这个函数对象含有一个当前全局名称空间的一个参数,而这个全局名称空间则是指谓,当函数被调用时被使用的那个全局名称空间。
一个函数定义并不执行函数体(function body),仅当函数被调用时,这才被执行。
一个函数定义也许用一个或者多个“装饰器”表达式所封装。当函数被定义时,装饰器表达式将在含有函数定义的范围之内被赋值。结果就一定是可被调用的,用函数对象作为唯一的参量被引用。返回值限定在函数名而不是函数对象。多种装饰器被应用在嵌套模式之中。

相关概念太多,也拿不准翻译得是否准确,只是有一个关于函数定义的粗浅印象。
那么python中的函数是个什么东西呢?还是回到练习18中来。
从第一个函数print_two理解起。
可以看到,编码首行就定义出,print_two是一个函数的名称。这个函数准备干些什么呢,这就涉及到函数的功能。
函数的功能是由函数的参数来体现的,在python中,一个函数的参数总是紧跟在函数名称之后的圆括号中给出的字符。在函数print_two后,紧跟着(*args)。这个(*args),就是函数print_two的参数。
当我们这样来看python的函数时,似乎和我们在数学与逻辑中学到的函数概念,几乎就扯不上边。刚才讲一般函数的四个要素,在python中,是不是可以做同样的理解呢?大概是有差别,但还是有很多相一致的地方。
先琢磨它们关于函数相通的地方。
Python中的函数,有一个教材用以下图表来刻画它的结构。
函数定义 函数名称 圆括号()参数列表 函数命名的结束符号冒号(😃

             def  function_name(x ,y, z):
             def     print_two(*argvs):

这个函数名冒号之后,如果有文档说明,则这个文档说明只是函数之外的东西,可以忽略。
接下来就是所谓函数体(function body),在ex18中,空格缩进4格的行3和行4就是print_two这个函数的所谓函数体,也称为函数的内容(笨办法第114页),这里仅取第一个函数print_two为例。
函数体(function body)
行3 arg1,arg2 = args
行4 print(f”arg1: {arg1}, arg2: {arg2}”)
行19 print_two(“Zed”, “Show”)

这个内容中的行3大约相当于一个函数的一般变量,即自变量的变量吧。而这个内容中的行4,大约就相当于要提取某个和一般参量对应的东西,自然这个行4就可以简单地理解为该函数的从属变量,也就是应变量,教材称之为参数解包。
那么行4要提取什么对应的东西呢?这体现在行19的语句之中,一个对应Zed,一个对应Shaw。当我们在power shell终端中对以上脚本予以执行时,终端显出arg1的对应值是Zed,arg2的对应值是Shaw。
这就表明,python中的函数,本质上和数学逻辑的函数是一致的。
有差别的地方,待下篇再述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值