函数式编程

拥抱函数式编程吧,用得非常爽! 几十年来我都在用面向对象的语言编程。我用过的第一个面向对象的语言是 C++,后来是 Smalltalk,最后是 .NET 和 Java。 我曾经对使用继承、封装和多态充

喜夏-厌秋 提交于 2020-03-05 15:31:37
拥抱函数式编程吧,用得非常爽! 几十年来我都在用面向对象的语言编程。我用过的第一个面向对象的语言是 C++,后来是 Smalltalk,最后是 .NET 和 Java。 我曾经对使用继承、封装和多态充满热情。它们是范式的三大支柱。 我渴望实现重用之美,并在这个令人兴奋的新天地中享受前辈们积累的智慧。 想到将现实世界的一切映射到类中,使得整个世界都可以得到整齐的规划,我无法抑制自己的兴奋。 然而我大错特错了。01 继承,倒塌的第一根支柱 乍一看,继承似乎是面向对象范式的最大优势。 所有新手教程讲解继承时都会拿出最简单的继承的例子,而这个例子似乎很符合逻辑。 然后就是满篇的重用了。甚至以后的一切都是重用了。 我囫囵吞下这一切,然后带着新发现兴冲冲地奔向世界了。 1. 香蕉猴子丛林问题 带着满腔的信仰和解决问题的热情,我开始构建类的层次结构然后写代码。似乎一切皆在掌控中。 我永远不会忘记我准备从已有的类继承并实现重用的那一天。那是我期待已久的时刻。 后来有了新的项目,我想起了另一个项目里我很喜欢的那个类。 没问题,重用拯救一切。我只需要把那个类拿过来用就好了。 嗯……其实……不仅是那一个类。还得把父类也拿过来。但……应该就可以了吧。 额……不对,似乎还需要父类的父类……还有……嗯,我们需要所有的祖先类。好吧好吧……搞定了。没问题。 不错。但编译不过,怎么回事?哦我知道了…

Kotlin 函数式编程

别来无恙 提交于 2020-03-05 01:31:54
文章目录 Kotlin函数式编程 Lambda 闭包 let also with run apply forEach maxBy filter map any count find groupBy Kotlin函数式编程 函数式编程是一种编程典范,面向函数的编程,只用纯函数来构建程序,在函数式编程中一切都是函数。 Lambda Java //普通方法 btn . setOnClickListener ( new View . OnClickListener ( ) { @Override public void onClick ( View v ) { Toast . makeText ( mContext , "hello" , Toast . LENGTH_SHORT ) . show ( ) ; } } ) ; //Lambda btn . setOnClickListener ( v - > Toast . makeText ( mContext , "hello" , Toast . LENGTH_SHORT ) . show ( ) ) ; Kotlin //普通方法 btn.setOnClickListener(object : View.OnClickListener { override fun onClick(v: View?) { Toast.makeText

python 文件操作与函数式编程

一笑奈何 提交于 2020-03-01 03:45:33
内置函数 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一、打开文件 文件句柄 = file ( '文件路径' , '模式' ) 注:python中打开文件有两种方式,即:open(...) 和 file(...) ,本质上前者在内部会调用后者来进行文件操作, 推荐使用 open 。 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。 打开文件的模式有: r,只读模式(默认)。 w,只写模式。【不可读;不存在则创建;存在则删除内容;】 a,追加模式。【可读; 不存在则创建;存在则只追加内容;】 "+" 表示可以同时读写某个文件 r+,可读写文件。【可读;可写;可追加】 w+,无意义 a+,同a "U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用) rU r+U "b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注) rb wb ab class file(object): def close(self): # real signature unknown; restored from __doc__ 关闭文件 """ close() -> None or (perhaps) an integer.

Python 函数式编程

时间秒杀一切 提交于 2020-02-29 03:49:47
函数式编程--functional programming 可以归结到面向过程的程序设计,但其思想更接近数学计算。 对应到编程语言,就是越低级的语言,越贴近计算机,抽象程度低,执行效率高,比如C语言;越高级的语言,越贴近计算,抽象程度高,执行效率低,比如Lisp语言。 函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。 而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。 函数名其实就是指向函数的变量! abs = 10 是可以赋值的 但是赋值以后不可执行abs(-10) 抛出 TypeError: 'int' object is not callable def get(number): return number; abs = get; print abs(-10) 说明内置的函数名也是可以指向新的函数的。 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数

趣味编程:函数式链表的快速排序

这一生的挚爱 提交于 2020-02-28 07:04:07
前一段时间有朋友问我,以下这段Haskell快速排序的代码,是否可以转化成C#中等价的Lambda表达式实现: qsort [] = [] qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs) 我当时回答,C#中缺少一些基础的数据结构,因此不行。经过补充之后,就没有任何问题了。后来,我觉得这个问题挺有意思,难度适中,也挺考察“基础编程”能力的,于是就自己写了一个。如果您感兴趣的话,也不妨一试。 这段代码是经典的,常用的体现“函数式编程”省时省力的例子,用短短两行代码实现了一个快速排序的确了不起。您可能不了解Haskell,那么我在这里先解释一下。 首先,这里用到了函数式编程语言中最常用的一种数据结构:不可变的链表。这个数据结构事实上是一个单向链表,并且是“不可变”的。这种数据结构在F#中也有存在,它的结构用大致是这样的: 可见,这是一种递归的数据结构。如果我们把这种数据结构叫做是ImmutableList的话,那么每个ImmutableList对象就会包含一个元素的“值”,以及另一个ImmutableList对象(在上图中,每个框就是一个ImmutableList对象)。对于每个ImmutableList对象来说,这个“值”便是它的“头(Head)”

python函数基础

与世无争的帅哥 提交于 2020-02-26 14:15:12
一,函数是什么?   函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。   函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。   函数定义:函数是指一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需要调用其函数名即可 函数特性: 代码重用 保持一致性 可扩展性 二,函数的创建 2.1格式:   python定义函数使用def关键字,一般格式如下: def 函数名(参数列表): 函数体   举个例子: def hello(): print("hello") hello() #调用 # 结果:hello 2.2函数名的命名规则: 函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号; 函数名是区分大小写的。 函数名不能是保留字。 2.3形参和实参   形参 :形式参数,不是实际存在,是虚拟变量,在定义函数和函数体的时候使用形参

【Python学习】函数式编程

梦想的初衷 提交于 2020-02-24 20:34:43
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。 (一)高阶函数 把函数作为参数传入,这样的函数称为高阶函数。 变量可指向函数 函数本身可以赋值给变量,即:变量可指向函数 f = abs print ( f ( - 10 ) ) 函数名也是变量 函数名其实是指向函数的变量 -传入函数 函数的参数可以接收变量,一个函数可以接收另一个函数作为参数,这种函数称为高阶函数。 def sum ( a , b , f ) : return f ( a ) + f ( b ) 1、map/reduce map()和reduce()函数。map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。 map # map def f ( x ) : return x * x r = map ( f , [ 1 , 2 , 3 , 4 , 5 ] ) print ( list ( r ) ) map()传入的第一个参数是f,即函数对象本身。由于结果r是一个Iterator

Python的函数式编程与内置函数5-filter函数

社会主义新天地 提交于 2020-02-13 13:24:41
一。去除所有sb人员 movie_people=[‘sb_alex’,‘sb_lzp’,‘sb_yxm’,‘zxl’,‘wjs’] 1.循环方法 movie_people = [ 'sb_alex' , 'sb_lzp' , 'sb_yxm' , 'zxl' , 'wjs' ] ret = [ ] for p in movie_people : if not p . startswith ( 'sb' ) : ret . append ( p ) print ( ret ) 2.函数方法 movie_people = [ 'sb_alex' , 'sb_lzp' , 'sb_yxm' , 'zxl' , 'wjs' ] def filter_test ( x ) : ret = [ ] for p in x : if not p . startswith ( 'sb' ) : ret . append ( p ) return ret print ( filter_test ( movie_people ) ) 3.高阶函数方法 movie_people = [ 'alex-sb' , 'lzp_sb' , 'yxm_sb' , 'zxl' , 'wjs' ] def sb_show ( n ) : #末尾为sb return n . endswith ( 'sb' ) def

Scala学习笔记-01-编程范式和scala特点

♀尐吖头ヾ 提交于 2020-02-10 09:27:03
常见的编程范式有如下两种: 命令式编程 一个命令就是一个指令序列,让机器原封不动地执行 如 java、c++ 函数式编程 将计算机的计算当做数学中的函数 Haskel、Erlang、Lisp 函数式编程的优点: 命令式编程涉及到多线程之间的状态共享,需要锁机制实现并发控制 函数式编程不会在多线程之间共享状态,不需要锁机制,可以更好地进行并行处理,充分利用服务器多核CPU的并行计算能力 Scala特点: scala运行与jvm上,兼容现有的java程序 scala是一门纯粹的面向对象语言 scala是一门函数式语言 总之,scala整合了面向对象和函数式编程的最佳特性。 来源: https://www.cnblogs.com/wooluwalker/p/12289792.html

函数式编程语言

佐手、 提交于 2020-02-09 05:26:30
函数式思想 什么是函数式编程? 百科定义: 函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。 个人理解就是我们的编程是以函数作为单元来处理各个业务逻辑,函数既可以当做参数传来传去,也可以作为返回值,可以把函数理解一个值到另一个值得映射关系。 优势特点 代码简洁、开发快速 函数式代码同命令式相比代码量要少很多,一行顶十行,所以实现一些功能也比较简洁。 功能描述:统计文本或网页中单词的频率TF(term frequency),词频在计算网页质量、信息检索中是一个重要概念。 函数式编程思维是对集合统一处理、统一操作,而命令式编程需要取出来每个单词单独处理,单独计数,而函数式只需要传入待处理对象集合、处理规则,我们不需要关注于具体细节,这样编程不仅仅减少了出现bug的概率而且提高了IT人员开发效率,何乐而不为呢。 易于理解,抽象度高 让我们再来看一个在开发中,我们经常遇到场景,例如我们有一个List列表,我们要把user的某个属性提取出来生成一个新的List。 假设你已经了解了函数式语言的语法,你可能会觉得函数式写法很简洁,函数式编程并不需要你关注细节实现,我们在获取用户名作为一个新List时并没有对单独user对象操作,而是是告诉集合对象,我们要做什么