函数式编程即函数可以作为参数传入函数,也可以返回函数。

1.高阶函数
    函数可以作为参数传入函数。
    def add(x,y,f):
        return f(x)+f(y)
    调用add函数add(3,-4,abs) ,结果为7
2.map/reduce
   def f(x):
       return x*x
    map(f,[1,2,3,4,5]) 返回的是一个Iterator,用list()可以把它全部显示出来。map()的作用即把f函数作用于第二个Iterable参数的每一个元素上。
    def add(x,y):
        return x+y
    reduce(add,[1,2,3,4,5])返回的同样也是一个Iterator。
    上一个语句就相当于add(add(add(add(1,2),3),4),5).所以reduce()接收的第一个函数参数就只能是接收两个参数的函数。
map/reduce都是高阶函数
3.filter/sorted
   (1) 以输出素数为filter()的例子
    ①初始数列直接考虑奇数列,除2之外偶数均非素数
        def _odd_iter():
          n=1
while True:#这是一个生成器,所以不用担心没有退出条件的问题
n=n+2
yield n
    ②排除条件
        def _delete(n):
         return lambda x: x % n >0
 ③输出素数
   def primes():
           yield 2  #因为2不在初始奇数列中,所以先输出2
it=_odd_iter()#初始数列
while True:
n=next(it)
yield n
              it = filter(_delete(n),it)  #filter()将it中_delete()作用后为False的                                                                                                     #元素都删除
    ④限定一个输出范围 否则将无限输出下去
        for n in primes():
       if n < 1000:
print(n)
else:
break
(2)sorted()
    L=[('Bob',75),('Adam',92),('Bart',66),('Lisa',88)]
       def by_name(t):
return t[0]
L2=sorted(L,key=by_name) #类似map,key参数接收的函数也是作用于L的每一个元素
                                 #所以这里返回的就是Bob,Adam,Bart,Lisa,然后再对L的元素排序
                                 #key只是排序依据,不改变L
print(L2)
def by_score(t):
return t[1]
L3=sorted(L,key=by_score)
print(L3)
Output:[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
[('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]

对于str,sorted()是按ASCII来排序的,所以大写会排在小写之前
L=['Credit','about','Zoey','Bart','effect']
print(sorted(L))
OUTPUT:['Bart', 'Credit', 'Zoey', 'about', 'effect']

print(sorted(L,reverse=True))  #reverse参数为反转
Output:['effect', 'about', 'Zoey', 'Credit', 'Bart']  
4.返回函数
    高阶函数不仅可以接收函数作为参数,还可以返回函数。
   当调用函数不需要立刻得到结果,而是想以后的需要的时候再计算结果,可以返回函数。
    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)
   当运行之后,lazy_sum返回一个sum函数,赋值给f,lazy_sum()由args的传入的相关参数和变量也都保存在f中,但还未计算,等到调用时f会使用这些参数并计算。这种现象称为“闭包”。
   因为f是当调用时才计算结果
   def count():
fs=[]
for i in range(1,4):
def f():
return i*i
fs.append(f)
return fs #因为fs.append(f)中f是一个函数,所以这里也有返回函数的意思
f1,f2,f3=count()
print(f1())#这里调用时,上面一句3个函数都已经返回了,此时的i已经变成3,所
#以接下来调用f2,f3,它们保存的参数i都为3,所以最后结果都是9 print(f2())
   print(f3())
Output:9
        9
        9
所以返回函数时,返回函数里不要有可能会变化的变量。
5.匿名函数
   其实就是一个简易的函数定义式
   如def f(x):
        return x*x
 写成匿名函数就lambda x : x*x  #冒号左边的x是参数,右边是返回式
6.装饰器(Decorator)
   在运行代码期间动态增加功能,但又不改变函数原来的定义。
  import functools
   def log(func):
@functools.wraps(func) #相当于wrapper.__name__=func.__name__,如果没有这一句,运行now.__name__就会得到wrapper,因为log返回的函数是wrapper
def wrapper(*args,**kw):
print('call %s():'%func.__name__) #打印日志
return func(*args,**kw) #调用函数
return wrapper #所以log(now)即返回wrapper函数,wrapper函数的功能就是先打印日志,再调用输入的函数
@log
def now(): #这两句相当于now=log(now)
print('2016.8.10')
print(now())
Output:
call now():
2016.8.10
7.偏函数
  import functools
int2 =functools.partial(int,base=2) #把某个函数的某个参数设一个默认值,生成一个新的函数
print(int2('100000'))
   print(int2('12345',base=8)) #这个新的函数任然是可以更改这个参数值的,只是它有一个默认的参数值
   Output:
        32 
        5349
其实就相当于
  def int2(x,base=2)
      return int(x,base)

Python函数式编程初级学习的更多相关文章

  1. python函数式编程之高阶函数学习

    基本概念 函数式编程,是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量.因此,任意一个函数,只要输入确定,输出就确定的这种函数我们称之为纯函数,我们称这种函数没有副作用.而允许使用 ...

  2. python 函数式编程学习笔记

    函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...

  3. python函数式编程之返回函数、匿名函数、装饰器、偏函数学习

    python函数式编程之返回函数 高阶函数处理可以接受函数作为参数外,还可以把函数作为结果值返回. 函数作为返回值 def laxy_sum(*args): def sum(): ax = 0; fo ...

  4. Python函数式编程:从入门到走火入魔

    一行代码显示"爱心" >>> print]+(y*-)**-(x**(y*<= ,)]),-,-)]) Python函数式编程:从入门到走火入魔 # @fi ...

  5. python函数式编程,列表生成式

    1.python 中常见的集中存储数据的结构: 列表 集合 字典 元组 字符串 双队列 堆 其中最常见的就是列表,字典. 2.下面讲一些运用循环获取字典列表的元素 >>> dic={ ...

  6. (转)Python函数式编程——map()、reduce()

    转自:http://www.jianshu.com/p/7fe3408e6048 1.map(func,seq1[,seq2...]) Python 函数式编程中的map()函数是将func作用于se ...

  7. python 函数式编程:高阶函数,map/reduce

    python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...

  8. Python函数式编程(进阶2)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6411915.html 本文出自:[Edwin博客园] Python函数式编程(进阶2) 1. python把 ...

  9. Python函数式编程——map()、reduce()

    文章来源:http://www.pythoner.com/46.html 提起map和reduce想必大家并不陌生,Google公司2003年提出了一个名为MapReduce的编程模型[1],用于处理 ...

随机推荐

  1. iOS 更好用的打Log方式-显示文件名、行数

    单纯的NSLog方式打出的Log没有显示打印语句所在的文件名和行数,下面这种做法会很实用: #ifdef DEBUG # define DLog(fmt, ...) NSLog((@"%s ...

  2. iOS开发 Xcode中的Info.plist字段含义

    Info.plist用于向iOS提供关于app,bundle或者framework的一些重要信息.它指定了比如一个应用应该怎样启动,它如何被本地化,应用的名称,要显示的图标,还有更多.Info.pli ...

  3. Java多线程小结

    简述 Java是支持多线程编程的语言,线程相比于进程更加轻量级,线程共享相同的内存空间,但是拥有独立的栈.减少了进程建立.销毁的资源消耗.jdk1.5后对java的多线程编程提供了更完善的支持,使得j ...

  4. SQL Server与Oracle对比学习:权限管理(一)

    http://blog.csdn.net/weiwenhp/article/details/8093661 我们发现我们现在的生活中到处是涉及到密码,你要记各种各样的密码.比如银行卡,邮件,QQ,微博 ...

  5. LabVIEW设计模式系列——普遍使用值改变事件

    标准: 1.当使用值改变事件时,使用单击时触发或者单击时释放开关动作.这样即保证仅仅触发一次,也保证按钮恢复默认值 标准:1.值改变事件的优点:不论是鼠标动作还是键盘动作都能触发值改变事件,增强了程序 ...

  6. Win32下 Qt与Lua交互使用:配置Qt下Lua运行环境

    Lua与C++之间可以实现非常强的交互性.Lua中可以使用C++中的函数,C++中也可以使用Lua中的函数.由此可以引发出很多奇思妙想了. 简单来说,Lua动态的特性补充了C++的功能.当然,也看你具 ...

  7. win7家庭版升级旗舰版

    点“开始”——在“所有程序”点"Windows Anytime Update"——点“输入升级密钥”,然后就出现一个密钥框,输入一个旗舰版的密钥,确定就行了,10分钟左右就升级好了 ...

  8. dhcp源码编译支持4G上网卡

    1. tar xvzf dhcp-4.2.5-P1.tar.gz 2. ./configure --host=arm-linux ac_cv_file__dev_random=yes 3. vi bi ...

  9. HTML之<!DOCTYPE> 标签介绍

    实例: <!DOCTYPE html> <html> <head> <title>文档的标题</title> </head> & ...

  10. Http,Https(SSL)的Url绝对路径,相对路径解决方案Security Switch 4.2的配置和使用 分类: ASP.NET 2014-11-05 12:51 97人阅读 评论(0) 收藏

    下载地址1:https://securityswitch.googlecode.com/files/SecuritySwitch%20v4.2.0.0%20-%20Binary.zip 下载地址2:h ...