函数与函数式编程(生成器 && 列表解析 && map函数 && filter函数)-(四)
在学习python的过程中,无意中看到了函数式编程。在了解的过程中,明白了函数与函数式的区别,函数式编程的几种方式。
函数定义:函数是逻辑结构化和过程化的一种编程方法。
过程定义:过程就是简单特殊没有返回值的函数。
函数式编程定义:先定义一个数学函数,然后按照这个数学模型用编程语言去实现它。
1. 函数式编程实现的目的:可以使程序员写出更为精确和高效的代码。
2. 函数式编程的优势:在以函数式风格写代码时,函数应该设计成没有其他副作用。函数接收参数并生成输出而不保留任何状态或修改任何不反映在返回值中的值。这种理想方式的函数可以被当成纯函数式函数。
#非纯函数:
def test1(mylist):
mylist.pop(-1)
#纯函数:
def test2(mylist):
return mylist[:-1]
Python中函数定义方法:
def test(x): #def 定义函数的关键字,test是函数名,()内可定义形参
“the function definitions”#文档描述
x+=1 #泛指代码块或程序处理逻辑
Return x #定义返回值
函数优势:
1、代码可重用
2、保持一致性
3、可扩展性
了解函数式编程,需要了解几种方式:生成器、列表解析、函数式等内容。
1.生成器
生成器:生成器(generator)是对象,在每次调用它的next()方法时返回一个值,直到它抛出StopIteration。
操作:创建一个生成器,只需要写一个普通的包含yield语句的python函数。
原理:python检测对yield的使用并将这个函数标识为一个生成器,当函数执行到yield语句时,它会像return语句那样返回一个值。
与return的区别:生成器会保存对栈的引用,它将被用来在下一次调用next函数时恢复函数的执行。
PS:当一个函数或过程没有返回值的时候,python解释器会默认返回为None.
2.列表解析
列表解析(list comprehension,简称listcomp):可以通过声明在单行内构造列表的内容。
没有列表解析的情况:
>>>x=[]
>>>for i in (1,2,3)
... x.append(i)
...
>>>x
[1,2,3]
使用列表解析的实现
>>>x=[i for i in (1,2,3)]
>>>x
[1,2,3]
可以同时使用多条for语句并使用if语句过滤元素:
x=[word.capitalize()
for line in ("hello world?","world","or not")
for word in line.split()
If not word.startswith("or")
]
>>>x
["hello","world?","world!","Not"]
列表解析的目的:快速定义列表的简洁方式。
#构建字典和集合:
>>>{x:x.upper() for x in ["hello","world"]}
{"world":"WORLD","hello":"HELLO"}
>>>{x.upper() for x in ["hello","world"]}
set(["WORLD","HELLO"])
3 函数式编程函数-内置函数
python包括很多针对函数式编程的工具,比如map()、filter()、sort()函数等内置函数。
3.1 map()函数
python3 返回可迭代的map对象.map(function,iterable)对iterable中的每一个元素应用function,并在python3中返回可迭代的map对象。
#map(function,iterable)返回可迭代的map对象
>>>map(lambda x:x+"bzz!",["I think","I'm good"])
<map object at 0x7fe7101abdd0>
>>>list(map(lambda x:x+"bzz!",["I think","I'm good"]))
[I thinkbzz,I’m goodbzz]
3.2 filter()函数
filter(function or None,iterable)对iterable中的元素应用function对返回结果进行过滤,并在python3中返回可迭代的filter对象。
#Filter(function or None,iterable)对iterable中的元素应用function对返回结果进行过滤,并再python3中返回可迭代的filter对象。
>>>filter(lambda x:x.startswith("I"),["I think","I'm good"])
<filter object at 0x000001884247BB88>
>>>list(filter(lambda x:x.startswith("I "),["I think","I'm good"]))
['I think']
#PS:生成器和列表解析实现与filter或者map等价的函数
使用列表解析实现map
#使用列表解析实现map
>>>(x +"bzz!" for x in ["I think","I’m good"])
<generator object <genexpr> at 0x7f9a0d697dc0>
>>>[x +"bzz!" for x in ["I think","I’m good"]]
["I thinkbzz","I’m goodbzz"]
使用列表解析实现filter
#使用列表解析实现filter
>>>(x for x in ["I think","I’m good"] if x.startswith("I"))
<generator object <genexpr> at 0x7f9a0d697dc0>
>>>[x for x in ["I think","I’m good"] if x.startswith("I")]
["I think"]
3.3 enumerate()函数
enumerate(iterable[,start])返回一个可迭代的enumerate对象,它生产一个元组序列,每个元组包括一个整型索引和iterable中对应的元素。
#enumerate(iterable[,start])返回一个可迭代对象,生成一个元组序列,对应索引(从start开始)和iterable中对应的函数
for i,item in enumerate(mylist):
print("Item %d: %s" %(i, item))
3.4 sorted()函数
sorted(iterable,cmp=None,key=None,reverse=False)函数对所有可迭代的对象进行排序操作
#sorted(iterable,cmp=None,key=None,reverse=False)返回iterable的一个已排序版本,通过key可以提供一个返回要排序的值的函数
>>>a = [5,7,6,3,4,1,2]
>>> b = sorted(a) # 保留原列表
>>> a
[5, 7, 6, 3, 4, 1, 2]
>>> b
[1, 2, 3, 4, 5, 6, 7] >>> L=[('b',2),('a',1),('c',3),('d',4)]
>>> sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函数
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> sorted(L, key=lambda x:x[1]) # 利用key
[('a', 1), ('b', 2), ('c', 3), ('d', 4)] >>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(students, key=lambda s: s[2]) # 按年龄排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] >>> sorted(students, key=lambda s: s[2], reverse=True) # 按降序
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>>
3.5 zip()函数
zip(iter1[,iter2[...]])函数接收多个序列并将他们组合成元组。它在将一组键和一组值组合成字典。
>>>keys=["foobar","barzz","ba!"]
>>>map(len,keys)
<map object at 0x00000188422B3408>
>>>zip(keys,map(len,keys)) #接收keys与keys的长度合成元组
<zip object at 0x0000018842225448>
>>>list(zip(keys,map(len,keys))) #生成列表
[('foobar', 6), ('barzz', 5), ('ba!', 3)]
>>>dict(zip(keys,map(len,keys))) #生成字典
{'foobar': 6, 'barzz': 5, 'ba!': 3}
函数与函数式编程(生成器 && 列表解析 && map函数 && filter函数)-(四)的更多相关文章
- day16_函数作用域_匿名函数_函数式编程_map_reduce_filter_(部分)内置函数
20180729 补充部分代码 20180727 上传代码 #!/usr/bin/env python # -*- coding:utf-8 -*- # ***************** ...
- python学习-day16:函数作用域、匿名函数、函数式编程、map、filter、reduce函数、内置函数r
一.作用域 作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变 二.匿名函数 lambda:正常和其他函数进行配合使用.正常无需把匿名函数赋值给一个变量. f=lambda x:x*x p ...
- Python之路Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数
Python之路Python作用域.匿名函数.函数式编程.map函数.filter函数.reduce函数 一.作用域 return 可以返回任意值例子 def test1(): print(" ...
- Python核心编程读笔 10:函数和函数式编程
第11章 函数和函数式编程 一 调用函数 1 关键字参数 def foo(x): foo_suite # presumably does some processing with 'x' 标准调用 ...
- 跟着ALEX 学python day3集合 文件操作 函数和函数式编程 内置函数
声明 : 文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 一. 集合 集合是一个无序的,不重复的数据组合,主要作用如下 1.去重 把一个列表变成集合 ,就自动去重 ...
- day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数
本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...
- Scala函数与函数式编程
函数是scala的重要组成部分, 本文将探讨scala中函数的应用. scala作为支持函数式编程的语言, scala可以将函数作为对象即所谓"函数是一等公民". 函数定义 sca ...
- python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程
python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...
- Python之路(第七篇)Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数
一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") ret ...
随机推荐
- Redis学习(一)——初识Redis
1.Redis是什么 1)REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. 2)Redis的特点 Red ...
- 纯CSS实现3D正方体动画效果
前言 纯CSS实现3D正方体动画效果,此方法是通过transform的旋转(rotate)和位移(translate)实现的,具体效果是鼠标滑过时正方体的一个面会产生位移 效果图
- Spider--补充--selenium的使用
# Selenium (firefox) # 1,介绍: # selenium 是一个 web 的自动化测试工具,是一个包,可以支持 C. java.ruby.python.或都是 C# 语言. # ...
- wait()系统调用分别演示在父子进程
废话不多说开代码 在父进程调用wait() #include<stdio.h> #include<unistd.h> #include<sys/wait.h> in ...
- tcp syn-synack-ack 服务端发送syn-ack
tcp_v4_send_synack()用于发送SYNACK段,在tcp_v4_conn_request()中被调用. 首先调用tcp_make_synack()构造SYNACK段,主要是构造TCP报 ...
- open系统调用
/* int open(const char *pathname, int flags, mode_t mode);flag:打开方式,可以man 2 open查看 O_RDONLY O_WRO ...
- centos7下做内存盘的方法
在找这个资料的时候,基本没几个能用的或者过时了的,或者是换了概念,做的不是需要的那种盘,只有少数文章有提到关键部分应该怎么去操作,现在还是自己总结一下 内存盘tmpfs和ramdisk的区别 这个在网 ...
- Dubbo 初识SPI-Version2.7.5
1简介 SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在 ...
- deepin V20 简易入门指南
deepin V20 入坑指南 系统安装 入坑第一步自然是先安装系统了,deepin的安装方式很简单只需要一个U盘即可,在官网下载好安装镜像文件,使用官方的启动盘制作工具,开机时选择从U盘启动即可,安 ...
- NLP之统计句法分析(PCFG+CYK算法)
一.认识句法分析 首先,了解一下句法分析到底是什么意思?是做什么事情呢?顾名思义,感觉是学习英语时候讲的各种句法语法.没错!这里就是把句法分析过程交给计算机处理,让它分析一个句子的句法组成,然后更好理 ...