我所理解的python中奇怪的函数类型

python语法随意,对于习惯了java和c这样语法规范的语言来说,python用起来多多少少还有一些不习惯,最近在学习过程中见到了一些python中奇怪的函数类型,而仅仅通过这些函数类型的名字也看不透这些函数到底是什么样子的,自己了解过后写了下来。

我见到的奇怪的函数类型有四种,分别是:匿名函数、装饰器函数、生成器函数以及高阶函数。

匿名函数

匿名函数在java中我们可能会想到匿名内部类,或者是java中的lambda表达式,而实际上python中的匿名函数也是通过lambda来实现的,不过注意的是,python中真的是通过lambda这个关键字来实现。

例如:

add = lambda x, y: x + y

result = add(3, 5) # 结果为8

与普通函数不同,它们是一种更加简洁的方式来编写小型临时函数。有了这个例子相信大家一下就能明白python中的匿名函数了。

装饰器函数

装饰器函数更多的是直接叫装饰器,装饰器仅看名字可能会想到是起一个装饰的功能,但是怎么样去装饰呢?还是直接看例子

import time

def func():

    for x in range(1,1000000):

        print(x)

def decoration(function):

    startTime = time.time()

    function()

    print(time.time()-startTime)

if __name__ == '__main__':          decoration(func)    #3.1974148750305176

假如我们想要测试一个函数的运行时间,我们一般的做法就是在函数的上下文上添加计时器,但是在python中,函数是可以作为一个参数传入函数中的,所以我们只需要将模板写好,将所需要测试的函数传进装饰器中即可,装饰器不仅可以装饰函数,也可以装饰类,所以这就是装饰器的思想,所谓装饰,其实就是将其他的函数或类作为参数传入,在原有基础上添加一些新逻辑或者属性后,将这个新的函数或类返回的过程。

生成器函数

生成器函数就比较特殊了,生成器函数主要依赖yield关键字实现,先上例子

def my_generator():

    yield 1

    yield 2

    yield 3

if __name__ == '__main__':

    g = my_generator()  # 创建生成器对象

    print(next(g))  # 1

    print(next(g))  # 2

    print(next(g))  # 3


#在 Python3.x 中,可以使用 __next__() 方法来替代 next() 方法。

def my_generator():

    yield 1

    yield 2

    yield 3

    g = my_generator()

    print(g.__next__()) #1

    print(g.__next__()) #2

    print(g.__next__()) #3

#我们还可以使用 for 循环来进行遍历:

def my_generator():

    yield 1

    yield 2

    yield 3

for i in my_generator():

    print(i)

我们在java中使用函数返回值的时候使用的都是return,而且一个函数只能返回一个值或对象,这已经成为了我们的共识,但是在python中可以通过yield关键字实现生成器函数,一个yield关键字就是一个返回值,而且最重要的是,生成器被使用之后会创建一个生成器对象,我们可以使用next()函数遍历生成器函数中的每一个返回值,yield关键字就相当于生成器函数中的断点,我们执行一次next,就向下走一步,这个操作和java中的迭代器是一样的,但是不一样的是这个生成器对象可以直接用循环遍历。但是最后为什么要叫生成器呢?这是因为假如将所有的数据都创建出来然后放入生成器中可能会非常占用空间,在创建生成器的时候也会花很多时间,而生成器并没有将所需要返回的数据一下生成出来,而只是利用算法,在该返回的时候通过算法得到要返回的数据,然后将这个数据声明出来返回,这样做既节省了时间又节省了空间。

import time

if __name__ == '__main__':

    start_time = time.time()

    b = [x for x in range(100000000)]  # 创建列表

    print(time.time() - start_time)    # 4.012589454650879s

    start_time = time.time()

    a = (x for x in range(1000000))  # 创建生成器

    print(time.time() - start_time)    # 0.0s


创建一亿个简单的数字数据,list要花费3-4s的时间,但是生成器却仅仅花费了不到0.01s的时间,这是生成器最与众不同的地方。

高阶函数

高阶函数其实很简单,只不过起了一个很高大上的名字,其实前面的装饰器就是一个高阶函数,因为在python中函数可以作为一个函数去传入函数,所以自然,你可以先将一个函数传进来,然后再对传进来的函数做一些操作。例如下面的例子

def func(x,y):

    return x+y

def highOrder_function(function,x,y):

    return function(x,y)

if __name__ == '__main__':

    x = highOrder_function(func,10,5)

    print(x) #15

这就是一个高阶函数,这个函数显然没有什么用处,但是通过这种思想可以做很多事情,高阶函数的存在主要原因还是依赖的函数可以作为变量去传递。

以上就是一些奇怪的函数类型,至少在java和c中很奇怪,以上内容仅个人观点和理解,如果出错欢迎指正。

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

推荐阅读更多精彩内容