3.Python函数

本文介绍了Python中的匿名函数(lambda)、闭包、装饰器和迭代器的概念及应用。通过实例展示了如何使用lambda表达式实现简单的函数,利用闭包实现函数的封装,以及装饰器如何增强函数功能。同时,阐述了迭代器和生成器的工作原理,演示了它们在数据处理中的作用。这些高级特性提升了Python代码的灵活性和效率。
摘要由CSDN通过智能技术生成

Python函数

匿名函数

匿名函数格式

lambda argument1, argument2,... argumentN : expression
def square(x):
    return x**2
square(3)

# 等价于
square = lambda x: x**2
square(3)

map

# 将数组里的值都X2
l = [1, 2, 3, 4, 5]
new_list = map(lambda x: x * 2, l)
print(list(new_list))

filter

# 过滤数组,剩余偶数
l = [1, 2, 3, 4, 5]
new_list = filter(lambda x: x % 2 == 0, l)
print(list(new_list))

闭包

概念

引用Vamei 解释

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

闭包(closure)是函数式编程的重要的语法结构。函数式编程是一种编程范式 (而面向过程编程和面向对象编程也都是编程范式)。在面向过程编程中,我们见到过函数(function);在面向对象编程中,我们见过对象(object)。函数和对象的根本目的是以某种逻辑方式组织代码,并提高代码的可重复使用性(reusability)。闭包也是一种组织代码的结构,它同样提高了代码的可重复使用性。

不同的语言实现闭包的方式不同。Python以函数对象为基础,为闭包这一语法结构提供支持的 (我们在特殊方法与多范式中,已经多次看到Python使用对象来实现一些特殊的语法)。Python一切皆对象,函数这一语法结构也是一个对象。在函数对象中,我们像使用一个普通对象一样使用函数对象,比如更改函数对象的名字,或者将函数对象作为参数进行传递。

例子

函数是一个对象,所以可以作为某个函数的返回结果。

def line_conf():
    def line(x):
        return 2*x+1
    return line       # return a function object

my_line = line_conf()
print(my_line(5))

装饰器

装饰器内容引用自 python装饰器单例模式

例如有一个函数hello

def hello():
    print 'hello'

现在想要在这个函数中添加一些调试信息, 可以直接在函数内部改动

def hello():
    print 'hello'
    print '[DEBUG] hello'

一个两个这样写可以, 但如果函数多了, 难免会有点麻烦, 还有可能遗漏, 这时候就可以用到装饰器了

def debug(func):
    def wrapper():
    	print '[DEBUG]: the function in ', func.__name__
        return func()
    return wrapper

@debug
def hello():
    print 'hello' 

@debug
def hi():
	print 'hi'
	

hello()
# [DEBUG]: the function in  hello
# hello
hi()
# [DEBUG]: the function in  hi
# hi

在debug函数中定义了一个wrapper函数, 它用于扩展传入函数func的功能,

return wrapper就是把扩展后的函数返回, 如果func有参数, 需要在wrapper的参数列表中声明

def debug(func):
    def wrapper(*args, **kargs):
    	print '[DEBUG]: the function in ', func.__name__
        return func(*args, **kargs)
    return wrappe

@debug就是装饰器, 它相当于

hello = debug(hello)

了解完装饰器, 就可以用装饰器来写一个单例模式了

from functools import wraps

def Singleton(cls):
    _instance = {}

    @wraps(cls)
    def _singlenton(*args, **kargs):
        if cls not in _instance:
            _instance[cls] = cls(*args, **kargs)
        return _instance[cls]

    return _singlenton

@Singleton
class A():
	pass

函数的迭代器与生成器(面试)

迭代器

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

迭代器有两个基本的方法:iter()next()

l = [1, 2, 3, 4]
itr = iter(l)	# 创建迭代器
print(next(itr))	# 使用next方法访问元素
print(next(itr))

输出>>
1
2

生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。

调用一个生成器函数,返回的是一个迭代器对象。

def generator(n):
    print("第一次进入生成器打印")
    while True:
        if 0 <= n < 10:
            yield n
            n += 1
        else:
            break
    print("到10结束")


for i in generator(0):
    print(i)

输出>>
第一次进入生成器打印
0
1
2
3
4
5
6
7
8
9
到10结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值