「大数据」(一百一十四)Python基础知识之函数

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[114]篇文章,欢迎阅读收藏】

1 基本概念

函数是 python 为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结果。函数也是一种设计工具,使用它我们可以将复杂的系统分解为可管理的部件。

2 术语解释

Def :可执行的代码, Python 的函数是由一个新的语句编写的,即 def 。不像 C 那样的编译语言, def 是一个可执行的语句。当 Python 运行到 def 语句时,它将会生成一个新的函数对象并将其赋值给这个函数名。

Return :将一个结果对象发送给调用者。当函数被调用时,其调用者停止运行直到这个函数完成了它的工作,之后函数才将控制权返回调用者。

Lambda :创建一个对象发送给调用者,当函数被调用时,调用者停止运行直到这个函数完成了它的工作,之后函数才将控制权返回调用者。

Yield :向调用者发回一个结果对象,但是记住它离开的地方,像生成器这样的函数也可以通过 yield 语句来返回值,并挂起它们的状态以便稍等能够恢复状态。

Global :声明一个模块级的变量并被赋值。

Nonlocal :声明将要赋值的一个封闭的函数变量。

「大数据」(一百一十四)Python基础知识之函数

3 详细说明

3.1 Def

Def 语句将创建一个函数对象并将其赋值给一个变量名, def 语句一般格式如下所示。

<code>Def<name>(arg1,arg2,…argN):
<statements>/<name>/<code>

Def 包含了首行并有一个代码块跟随在后边,这个代码块通常都会缩进(或者就是在冒号后边简单的一句)。而这个代码块就成为了函数的主体 - 也就是每当调用函数时 Python 所执行的语句。 Def 的首行定义了函数名,赋值给函数对象,并在括号中包含了 0 个或以上的参数(也称为形参)。在函数调用的时候,在首行的参数名赋值给力括号中的传递来的对象。

函数主体往往包含一条 return 语句。

<code>Def<name>(arg1,arg2,…argN):

Return<value>/<name>/<code>

Python 的 return 语句可以在函数主体中的任何地方出现。它表示函数调用的结束,并将结果返回至函数调用处。 Returnyuju 包含一个对象表达式,这个对象给出的函数的结果。 Return 语句是可选的,如果它没有出现,那么函数将会在控制流执行完函数主体时结束。

Python 的 def 语句是一个可执行的语句:当它运行的时候,它创建一个新的函数对象并将其赋值给一个变量名。它在运行时简单的给一个变量名进行赋值。更确切地讲, def 在运行时才进行评估,而在 def 之中的代码在函数调用后才会评估。函数描绘了两个方面:定义( def 创建了一个函数)以及调用(表达式告诉 Python 去运行函数主体)。定义是一个在交互模式下输入的定义语句,它定义了一个名为 times 的函数,这个函数将返回两个参数的乘积。

<code>>>>def times(x,y):
… return x*y/<code>

当 Python 运行到这里并执行了 def 语句时,它将会创建一个新的函数对象,封装这个函数的代码并将这个对象赋值给变量名 times 。当 def 运行之后,可以再程序中通过在函数名后增加括号调用(运行)这个函数。括号中可以包含一个或多个对象参数,这些参数将会传递给函数头部的参数名。

<code>>>>times ( 2,4 )/<code>

这个表达式传递了两个参数给 times 函数。在这个例子中,在函数头部的变量 x 赋值为 2 , y 赋值为 4 ,之后函数的主体开始运行,对于这个函数,其主体仅仅是一条 return 语句,这条语句将会返回结果作为函数调用表达式的值。但是如果稍后需要使用这个值,我们可以将其赋值给另一个变量。例如:

<code>>>>x = times(3.14,4)
>>>x/<code>

Times 函数中表达式 x*y 的意义完全取决于 x 和 y 的对象类型,同样的函数,在一个实例下执行的是乘法,在另一个实例下执行的是赋值。 Python 将对某一对象的在某种语法的合理性交由对象自身来判断。这种依赖类型的行为称为多态。因为 Python 是动态类型语言,所以多态在 Python 中随处可见。实际上,在 Python 中每个操作都是多态的操作: print 、 index 、 * 操作符,还有很多。即使是简单的 times 函数,任意两个支持 * 的对象都可以执行,无论它是哪种类型,也不管它是何时编写的。这个函数对于数字来说是有效的,两个字符串或者一个字符串和一个数字,或者任意其他支持扩展接口的兼容对象。除此之外,如果传递的对象不支持这种预期的接口, Python 将会在 * 表达式运行时检测到错误,并自动抛出一个异常。

3.2 return

return 语句是 Python 语言中函数返回的一个值,每个函数都应该有一个返回值;其中, return 返回值可以是一个数值,一个字符串,一个布尔值或者一个列表。


Python 函数返回值 return ,函数中一定要有 return 返回值才是完整的函数,如果你没有定义 Python 函数返回值,那么得到一个结果是 None 对象,而 None 表示没有任何值。

写法 1 :

<code>>>> def someFunction():
...       return
...
>>> sf=someFunction()
>>> sf
>>> sf is None
True7/<code>

没有返回值的 return 语句等价于 return None 。 None 是 Python 中表示没有任何东西的特殊类型。例如,如果一个变量的值为 None ,可以表示它没有值。


写法 2 :

<code>>>> def someFunction():
...    pass
...
>>> sf=someFunction()
>>> sf is None
True/<code>

3.3 lambda

lambda 函数也叫匿名函数,即,函数没有具体的名称。先来看一个最简单例子:

<code>def f(x):
return x**2

print f(4)/<code>

Python 中使用 lambda 的话,写成这样

<code>g = lambda x : x**2

print g(4)/<code>

lambda 和普通的函数相比,就是省去了函数名称而已,同时这样的匿名函数,又不能共享在别的地方调用。

其实说的没错, lambda 在 Python 这种动态的语言中确实没有起到什么惊天动地的作用,因为有很多别的方法能够代替 lambda 。

1. 使用 Python 写一些执行脚本时,使用 lambda 可以省去定义函数的过程,让代码更加精简。

2. 对于一些抽象的,不会别的地方再复用的函数,有时候给函数起个名字也是个难题,使用 lambda 不需要考虑命名的问题。

3. 使用 lambda 在某些时候让代码更容易理解。

lambda 语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。 lambda 语句构建的其实是一个函数对象, 实例说明:

<code>>>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
>>> print filter (lambda x: x % 3 == 0, foo)

[18, 9, 24, 12, 27]/<code>

3.4 Yield

带有 yield 的函数在 Python 中被称之为 generator (生成器),你让生成器产生一个数时,生成器会执行,直至出现 yeild 语句,生成器把 yeild 的参数给你,之后生成器就不会往下运行。当你向它要下一个数时,他会从上次状态开始继续运行,直至出现 yeild 语句,把参数给你,之后停下,如此反复直至退出函数 。

实例说明:

<code>Def perm(items,n=none):
If n is None:
\t \tn= len(items)
for i in range(len(items)):
v = items[i:i+1]
if n==1
\tyield v
else:
\t\trest= items[:i]+items[i+1:]
for p in perm(resr,n-1):
\t\tyield v+p
a=perm(‘abc’)
for b in a:
\t\tprint b/<code>

3.5 Gloabal

global 语句是适用于当前整个代码块的声明。它是全局变量的标识符。如果某名字在局部名字空间中没有定义 , 就自动使用相应的全局名字 . 没有 global 是不可能手动指定一个名字是全局的 . 在 global 中出现的名字不能在 global 之前的代码中使用 . 在 global 中出现的名字不能作为形参 , 不能作为循环的控制对象 , 不能在类定义 , 函数定义 , import 语句中出现 .

与 nonlocal 关键字的区别:

global 语句用以知名某个特定的变量为全局作用域,并重新绑定它。 nonlocal 语句用以指明某个特定的变量为封闭作用域,并重新绑定它。

3.6 Nonlocal

nonlocal 关键字用来在函数或其他作用域中使用外层 ( 非全局 ) 变量。

实例说明:

<code>def a():
\t\t\tx = 0
def b():
\t\t\tnonlocal x
\t\t\tx += 1
\t\t\tprint x
\t\t\treturn b/<code>


分享到:


相關文章: