[Python核心技术与实战学习] 06 函数

 

函数定义

def name(param1, param2, ..., paramN):
    statements
    return/yield value # optional

其中:
def 是函数的声明;

my_func 是函数的名称;

括号里面的 message 则是函数的参数;

在函数最后, 你可以返回调用结果(return 或 yield) , 也可以不返回。

闭包

闭包其实和嵌套函数类似,不同的是, 这里外部函数返回的是一个函数, 而不是一个具体的值。 返回的函数通常赋于一个变量, 这个变量可以在后面被继续执行调用。
比如, 我们想计算一个数的 n 次幂, 用闭包可以写成下面的代码:

def nth_power(exponent):
    def exponent_of(base):
        return base ** exponent
    return exponent_of # 返回值是 exponent_of 函数

square = nth_power(2) # 计算一个数的平方
cube = nth_power(3) # 计算一个数的立方 
square
# 输出
<function __main__.nth_power.<locals>.exponent(base)>

cube
# 输出
<function __main__.nth_power.<locals>.exponent(base)>

print(square(2))  # 计算 2 的平方
print(cube(2)) # 计算 2 的立方
# 输出
4 # 2^2
8 # 2^3

匿名函数

什么是匿名函数?

lambda argument1, argument2,... argumentN : expression

例子:
匿名函数计算一个数的平方

square = lambda x: x**2
square(3)
9

常规函数计算一个数的平方

def square(x):
    return x**2
square(3)
 9

匿名函数 lambda 和常规函数一样, 返回的都是一个函数对象(function object) ,它们的用法也极其相似, 不过还是有下几点区别。

  • 第一, lambda 是一个表达式(expression) , 并不是一个语句(statement) 。

所谓的表达式, 就是用一系列“公式”去表达一个东西, 比如 x + 2、 x**2 等等;
所谓的语句, 则一定是完成了某些功能, 比如赋值语句 x = 1完成了赋值

lambda 可以用在用些常规函数 def 不能用的地方:
lambda 可以在list内部使用
[(lambda x: x
x)(x) for x in range(10)]
输出
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

lambda 可以作为函数的参数
l = [(1, 20), (3, 0), (9, 10), (2, -1)]
l.sort(key=lambda x: x[1]) # 按列表中元祖的第二个元素排序
print(l)
输出
[(2, -1), (3, 0), (9, 10), (1, 20)]*

  • 第二, lambda 的主体是只有一行的简单表达式, 并不能扩展成一个多行的代码块。

Python 函数式编程

所谓函数式编程, 是指代码中每一块都是不可变的(immutable) , 都由纯函数(pure function) 的形式组成。 这里的纯函数, 是指函数本身相互独立、 互不影响, 对于相同的输入, 总会有相同的输出, 没有任何副作用。

例子:
对于一个列表, 我想让列表中的元素值都变为原来的两倍

def multiply_2(l):
    for index in range(0, len(l)):
        l[index] *= 2
    return l

这不是一个纯函数的形式, 因为列表中元素的值被改变了,我多次调用multiply_2()这个函数, 那么每次得到的结果都不一样。

纯函数的形式写法如下,重新创建一个新的列表并返回。

def multiply_2_pure(l):
    new_list = []
    for item in l:
        new_list.append(item * 2)
    return new_list

Python 主要提供了这么几个函数:map()、 filter() 和 reduce(), 通常结合匿名函数 lambda 一起使用。

函数参考链接
map() 函数https://www.runoob.com/python/python-func-map.html
filter() 函数https://www.runoob.com/python3/python3-func-filter.html
reduce() 函数https://www.runoob.com/python/python-func-reduce.html

关于Python 函数式编程可参看
https://blog.csdn.net/u013398034/article/details/78701714

参考资料:

极客时间 Python核心技术与实战学习

Python核心技术与实战(极客时间)链接:
http://gk.link/a/103Sv

一篇文章搞懂Python中的函数式编程:
https://blog.csdn.net/u013398034/article/details/78701714


GitHub链接:
https://github.com/lichangke/LeetCode

知乎个人首页:
https://www.zhihu.com/people/lichangke/

简书个人首页:
https://www.jianshu.com/u/3e95c7555dc7

个人Blog:
https://lichangke.github.io/

欢迎大家来一起交流学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值