Python返回函数

1.关于Python的可变参数

首先我们先来定义两个函数build1()build2().然后分别调用这两个函数。

def build1(agr):
    for x in agr:
        print x*x

结果:

>>> build1([1,2,3])
1
4
9
>>> 
image.png
def build2(*agr):
    for x in agr:
        print x*x

结果:

>>> build2([1,2,3])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in build2
TypeError: can't multiply sequence by non-int of type 'list'

为什么当传入一个list会报错尼?首先我们要明白可变参数的定义。参考廖雪峰的python教程。
可变参数
在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。要定义出这个函数,我们必须确定输入的参数。由于参数个数不确定,我们首先想到可以把a,b,c……作为一个list或tuple传进来。

廖雪峰的python教程-函数的参数

def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

在函数内部,参数numbers接收到的是一个tuple.所以当像前边提到过的build2([1,2,3])例子,函数内部接受到的参数应该是([1,2,3],)
所以会有TypeError: can't multiply sequence by non-int of type 'list'错误。

image.png
>>> def f(*agr):
...     print agr
... 
>>> f([1,2,3])
([1, 2, 3],)
>>> 

要想使build2()函数能够实现接收一个list并打印出每个元素的平方。可以采用下面的方法:

>>> def build3(*agr):
...     for i in agr:
...         for x in i:
...             print x*x
...         
... 
>>> build3([1,2,3])
1
4
9

又或者使用下面的方法:

>>> k = [1,2,3]
>>> build2(*k)
1
4
9
>>> 

2.Python的匿名函数

>>> def build(agr):
...     (lambda x: x*x) for x in agr
  File "<stdin>", line 2
    (lambda x: x*x) for x in agr
                      ^
SyntaxError: invalid syntax

匿名函数的定义为lambda parameter_list: expression
上面的错误例子将列表推导式的定义混淆了。

>>> def build(agr):
...     [(lambda x:x*x) for x in agr]
... 
>>> build([1,2,3])
>>> 

上面的例子的返回值为None
函数体内部可以用return随时返回函数结果;
函数执行完毕也没有return语句时,自动return None
所以要加入return

>>> def build(agr):
...     return [(lambda x:x*x) for x in agr]
... 
>>> build([1,2,3])
[<function <lambda> at 0xb6ed94c4>, <function <lambda> at 0xb6ed948c>, <function <lambda> at 0xb6ed9534>]

当就算就算加入了return语句,函数还是没有返回预想中的值。返回的是匿名函数的内存地址。原因是匿名函数没有调用。
于是继续将函数改为如下:

>>> def build(agr):
...     for x in agr:
...         k = lambda m: m*m
...         return [k(x)]
... 
>>> build([1,2,3])
[1]

结果就打印了一个元素,跟我们设想的[1,4,9]不同。原因是

函数体内部的语句在执行时,一旦执行到return时,函数就执行完毕,并将结果返回.

函数不会因为循环而不断执行return
最后,将函数改为如下:

>>> def build(agr):
...     fs = []
...     for x in agr:
...         k = lambda m: m*m
...         fs.append(k(x))
...     return fs
... 
>>> build([1,2,3])
[1, 4, 9]

终于得到了我们想要的结果了。函数的内部定义了匿名函数,而后又在里面调用了匿名函数。

如果让build()返回函数并调用,又可以将函数改为如何:

>>> def build(agr):
...     fs = []
...     for x in agr:
...         k = lambda m: m*m
...         fs.append(k)
...     return fs
... 
>>> build([1,2,3])
[<function <lambda> at 0xb6f27294>, <function <lambda> at 0xb6f272cc>, <function <lambda> at 0xb6f2725c>]
>>> build([1,2,3])[1](10)
100
>>> 

上面的函数调用build([1,2,3])会返回一个包含有三个匿名函数的list.要调用他们,就必选那一个函数并存入参数。所以才会有build([1,2,3])[1](10).

为了进一步理解使用可变参数,并使用匿名函数,可以修改代码如下:

>>> def build(*agr):
...     fs=[]
...     for i in agr:
...         for x in i:
...             k = lambda m: m*m
...             fs.append(k(x))
...     return fs
... 
>>> build([1,2,3])
[1, 4, 9]
>>> 
def build(*agr):
    fs=[]
    for i in agr:
        for x in i:
            k = lambda m: m*m
            print k(x)

匿名函数lambda有很多限制,为了加深对python的理解,所以才在上面的例子里面一直使用lambda.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容