社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python之函数式编程

Goyakod • 7 年前 • 366 次点击  

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。函数式编程的一个特点就是,允许函数接收函数作为参数,也允许把函数作为返回值返回。Python对于函数式编程提供部分支持。由于Python允许使用变量,因此Python不是纯函数式编程语言。

#高阶函数 所谓高阶函数,就是允许函数的参数接收其他函数 下面介绍几个python内置的高阶函数:

##map() map()函数接收两个参数,一个序列,一个函数。 map()的作用就是把传入的函数依次作用于序列的元素,然后把结果作为一个Iterator返回。

def function(x):
	return x * x

r = map(function,[1,2,3,4,5])

print('map result:',list(r))
//运行结果:
//map result: [1, 4, 9, 16, 25]

#reduce() reduce()也接收两个参数,一个函数,一个序列; reduce()也把函数作用在序列上,但是这个函数必须接收两个参数,reduce把结果继续和系列的下一个元素做累计计算。

from functools import reduce

def function1(x,y):
	return x + y

reduce(function1,[1,2,3,4,5])

print('reduce result:',reduce(function1,[1,2,3,4,5]))
//运行结果:
//reduce result: 15

#filter() filter()的功能是过滤序列 跟map()类似,filter也接收一个函数一个序列 filter把函数作用于序列的每一个元素,根据函数返回的True或者False决定元素的保留还是去掉

def  isOdd(x):
	return x % 2 == 1

p = list(filter(isOdd,[1,2,3,4,5]))

print('filter result:',p)
//运行结果:
//filter result: [1, 3, 5]

#sorted() 顾名思义,sorted()的功能就是对序列进行排序 sorted也是一个高阶函数,可以接受一个key函数。key指定的函数将作用于list的每个元素上,并根据key函数返回的结果进行排序。

arr = [23,0,45,-13,46,85,-70];

print('sorted(arr):',sorted(arr))
#sorted(arr): [-70, -13, 0, 23, 45, 46, 85]

print('sorted(arr,key=abs):',sorted(arr,key=abs))
print('sorted(arr,key=abs,reverse=True)',sorted(arr,key=abs,reverse=True))

//运行结果:
//sorted(arr,key=abs): [0, -13, 23, 45, 46, -70, 85]
//sorted(arr,key=abs,reverse=True) [85, -70, 46, 45, 23, -13, 0]

#返回函数 高阶函数不仅能接受函数作为参数,还能把函数作为返回值返回。

def lazy_sum(*args):
	def sum():
		ax = 0
		for n in args:
			ax = ax + n
		return ax
	return sum

f = lazy_sum(1,2,3,4,5)

print(f)
print('f()=',f())
//运行结果:
//<function lazy_sum.<locals>.sum at 0x109c85950>
//f()= 15
#运行结果表明,当我们调用lazy_sum的时候并不直接返回计算结果,而是返回sum函数,当我们执行f()的时候才会计算结果*

#匿名函数 有些时候我们传入一个函数作为参数的时候,不必要每次都对他进行显性的定义,python提供lambda创建匿名函数 匿名函数有一个现在就是只能有一个表达式,不用写return,表达式的结果就是返回值 匿名函数没有名字所以不存在函数名冲突的问题,使用匿名函数利于减少代码,这与python倡导理念也是一致的。

s = reduce(lambda x,y: x+y,[1,2,3,4,5])

print('s=',s)
//运行结果:
//s= 15

#偏函数 我理解的偏函数的功能是这样的:

假如你有一个这样的函数:它的功能就是对人打招呼

def sayHello(name,greet):
	print(greet,name)

假设接下来你要对名字是'xiaoMing'这个人,用一百种方式跟他打招呼。 如果你知道默认参数,那么你肯定会想到用它,当然没错,但是考虑到每次传入实在是太麻烦了,所以:

def  sayHelloToXiaoMing(greet,name='xiaoMing'):
	return sayHello(name,greet)

sayHelloToXiaoMing('I love U');

其实sayHelloToXiaoMing就是sayHello的一个偏函数。 那么偏函数的功能到底是??没错,偏函数就是帮助我们直接创建一个偏函数的,而不需要我们自己去创建:

from functools import partial

sayHelloToTom = partial(sayHello,'Tom')

sayHelloToTom('Sawadika')

OK,关于函数式编程就简单写到这,代码都很简单就不给出源码了~


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/kRD3WamkOY
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/4687
 
366 次点击