8

灵活编码要义:Python中一切皆对象

 4 years ago
source link: http://developer.51cto.com/art/202004/614036.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Python是一门真正意义上面向对象的编程语言,你或许也听过这句话:Python中一切皆对象。

而谈及对象,人们通常将之引用到数据集,并称其为属性,且对象具有某种预定义函数来更新这些数据或与其他对象交换数据。

但实际上,函数也是一种对象。为什么这样讲?往下看吧!

6rUne2M.jpg!web

数据类型作为对象

所有数据类型,如数字、字符串、列表和词典,都是Python中的对象。可以将其外观看作数据盒,一些盒子仅因持有int、 bool或str而变小,而一些盒子则因持有list或 dict而变大,不同之处在于,它们的大小反映出在计算机中存储这些数据的所需内存。

当然,盒子也可以有其他特征,比如颜色和材质,可以将这些特征定义为与盒子有关的不同类型的数据。

作为对象,可以应用以下常见含义或功能:

  • 可以作为函数的返回值。
  • 可以作为传递给函数的参数。
  • 可以赋值给一个变量。
  • 可以作为数据的一部分与其他对象相关联。
# Assign an int to a variable 
              a =5 
                                  # Use an int asan argument in a function 
              defadd_two(a): 
                 return a +2 
              add_two(6) 
                                  # Return astring in a function 
              defis_even(a): 
                 return'even'if a %2==0else'odd' 
              is_even(745) 
                                  # A booleanvalue in a tuple 
              (True, 7, 8) 

作为Python对象的含义

上述代码片段中你可以看到有关Python对象的这些含义的示例,比如int和string。即使不太了解Python编码或任何编程语言也不难理解。

那么为什么有人说函数也是Python中的对象呢?

函数作为对象

进入正题前,我们来回顾一下什么是函数:函数是命名代码块,接受零或多个输入,并在运行某些计算后返回输出。

uEj6fqn.jpg!web

下面是一个简单示例,阐释了上述定义中突出显示的关键组件:

# Assign an int to a variable 
              a =5 
                                  # Use an int asan argument in a function 
              defadd_two(a): 
                 return a +2 
              add_two(6) 
                                  # Return astring in a function 
              defis_even(a): 
                 return'even'if a %2==0else'odd' 
              is_even(745) 
                                  # A booleanvalue in a tuple 
              (True, 7, 8) 

在上一部分中,我们提到Python数据对象具有的一些常见功能。下面的示例将向你展示函数如何提供此类功能。

将函数用作另一个函数的参数

由于函数是对象,可以将函数传递为另一个函数的参数。如下所示,创建了三个函数:combine_two_numbers()、add_two_numbers()及multiply_two_numbers(),后者用于计算元组中两个数字的和及乘积。

与通常所见函数的不同,这里将函数add_two_numbers 和 multiply_two_numbers作为参数传递,这进一步分别计算了这些数字元组的和及乘积。

Uje22a3.jpg!web

函数作为函数的参数

变量赋值

在以下代码片段中,笔者创建了一个名为greeting()的函数,并将其分配给变量say_hello,它产生的输出与greeting()相同。

queURfe.jpg!web

将函数赋值给一个变量

需要注意的一点是,greeting()和 say_hello()函数都指向内存中的同一个对象。例如,如果检查它们的地址,都具有如下所示的相同值。如果删除greeting()函数,名称“greeting”将变成未定义状态,而删除不会影响由“sayhello”函数引用的潜在对象。

因此,在此有一个重要的概念,即引用函数的变量与存储在内存中的实际对象不同。

YBBNVrF.jpg!web

操作函数

函数作为返回值

作为对象,Python函数可以作为函数的有效返回值。来看看以下示例,笔者编写了一个名为add_number_creator()的函数,它返回一个可以向整数参数添加数字的函数。

通过调用add_number_creator()函数,创建了函数add_three()和 add_five()。这两个函数完成预期任务,向函数调用中指定的整数添加3和5。

UBnyQzu.jpg!web

函数作为返回值

函数作为另一对象的一部分

我们也可以创建一个函数列表,使这些函数成list对象的一部分。继上一个例子,我们使用add_number_creator()函数创建了三个函数,分别输入整数添加0、1和2。如你所见,可以枚举函数列表,就像通常对整数或字符串列表所做的那样。

36FvIvN.jpg!web

函数作为另一对象的一部分

明白了吧,函数与Python中的其他对象一样,可以将其分配给变量并在函数中使用。文中示例比较简单,遇到复杂的情况也是一样的道理。

利用好这一特征,助你灵活编码。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK