Python3学习(六)

11. 匿名函数

(1)lambda

格式:lambda parameter_list: expression
parameter_list就是我们普通函数的参数列表,而expression则是一些简单的表达式(甚至不能是赋值语句),lambda将expression执行得到的结果返回,可以用一个变量接收:ret = lambda a,b: a + b

ret = lambda a,b: a + b
print(ret(1, 2))
=====================
3

(2)三元表达式

在C语言,Java,C++等语言中,三元表达式是这样的:
条件 ? 条件为真的结果 : 条件为假的结果
而在Python中,却是这样的:
条件为真的结果 if 条件 else 条件为假的结果

x = 1
y = 2
ret = x if x < y else y
print(ret)
=======================
1

12. 高阶函数

(1)map类

这个类有些类似于数学中的“函数”,或者说是映射。
第一个参数是函数,第二个参数是一系列变量列表,可以为多个列表。

l = [1, 2, 3, 4, 5, 6, 7, 8]
def square(x):
	return x ** 2

ret = map(square, l)
print(list(ret))
=======================
[1, 4, 9, 16, 25, 36, 49, 64]

使用map相当于数学中f(x) = x^2,将x代入求出对应的y。
上述代码也可以改写为:
map(lambda x: x ** 2, l)
再看两种map用法:

# 第一种
l = [1, 2, 3, 4, 5, 6]
l1 = [2, 3, 4, 5, 6, 7]
ret = map(lambda x, y: x ** 2 + y, l, l1)
print(list(ret))
==========================
[3, 7, 13, 21, 31, 43]

# 第二种
l = [1, 2, 3, 4, 5, 6]
l1 = [2, 3, 4, 5]
ret1 = map(lambda x, y: x ** 2 + y, l, l1)
print(list(ret1))
=============================
[3, 7, 13, 21]

当两个参数列表元素不一样多时,按照较少的那个个数执行,最终得到的结果与短的参数列表长度相同。

(2)reduce

reduce属于functools模块,它有三个参数,前两个和map一样,最后一个参数是初始值,默认为None。它和map的区别是,连续对一个序列进行计算。

from functools import reduce

l = [1, 2, 3, 4, 5, 6]
ret = reduce(lambda x, y: x + y, l)
print(ret)
=======================
21

如上述代码所示,reduce进行计算的过程为:
先对1和2进行“+”,再将所得结果赋给x,y = 3,再执行lambda,以此类推,则reduce执行到最后,将得到 l 中所有元素的和。
reduce第三个参数是设定初始值:

from functools import reduce

l = ['1', '2', '3', '4', '5']
r = reduce(lambda x, y: x + y, l, 'A')
print(r)
=========================
A12345

(3)filter类

filter类用于过滤,传入两个参数,第一个是函数,第二个是参数列表。

l = [1, 0, 1, 1, 0, 1]
ret = filter(lambda x: True if x==1 else False, l)
print(list(ret))
=========================
[1, 1, 1, 1]

Python并不是一个真正的函数式编程的语言,如果对函数式编程感兴趣,可以去学一学Lisp语言,它是真正的利用函数式编程的思想来编程。

13. 装饰器

之前在知乎上看到一个定义,感觉很有趣:
装饰器就是把一个猴子,塞入炼丹炉,然后就出来一个还是会吃桃子,但有火眼金睛的猴子;还是原来的猴子,但多了特效技能。
装饰器可以实现多个函数共同所需的功能。比如打印函数调用时的时间

import time
def decorator(func):
	def wrapper():
		print(time.time())
		func()
	return wrapper

def f1():
	print("It's a function.")

f = decorator(f1)
f()
=============================
1581582542.4673233
It's a function.

一种更简洁的方式:使用@符号。

@decorator
def f1():
	print("It's a function.")

f1()
==========================
1581582586.7955282
It's a function.

如果你的函数是含有参数的话,在wrapper中也要传入参数,而且若多个函数的参数个数不同,则wrapper应传入可变参数列表:

def decorator(func):
	def wrapper(*args):
		print(time.time())
		func(*args)
	return wrapper

如果你的函数还含有关键字参数"**kwargs"的话,则wrapper中还要添加“**kwargs”参数。

def decorator(func):
	def wrapper(*args, **kwargs):
		print(time.time())
		func(*args, **kw)
	return wrapper

@decorator
def f2(name1, name2, **kwargs):
	print(name1, name2)
	print(kw)

f2('name1', 'name2', a=1, b=2)
============================
1581584784.625067
name1 name2
{'a': 1, 'b': 2}

上述的decorator就是最终装饰器定义的格式。
另外,一个函数可以使用不止一个装饰器。

====================================================
Python3的笔记就写到这里了,如果对各位有帮助的话,请动动小手给个赞吧。

发布了13 篇原创文章 · 获赞 13 · 访问量 3157

猜你喜欢

转载自blog.csdn.net/weixin_41076275/article/details/104251622