我所理解的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中很奇怪,以上内容仅个人观点和理解,如果出错欢迎指正。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容