函数与函数式编程(生成器 && 列表解析 && 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 ...
随机推荐
- 依赖注入DI(IOC)容器快速入门
1.什么是IOC IOC是一种设计模式,全程控制翻转或叫依赖注入.更详细介绍见http://martinfowler.com/articles/injection.html 2.为什么用IOC 我们通 ...
- SPA 路由三部曲之核心原理
为了配合单页面 Web 应用快速发展的节奏,近几年,各类前端组件化技术栈层出不穷.通过不断的版本迭代 React.Vue 脱颖而出,成为当下最受欢迎的两大技术栈. 仅 7 个月的时间,两个技术栈的下载 ...
- linux 进程间通信 共享内存 shmat
系统调用mmap()通过映射一个普通文件实现共享内存.系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件(这是通过shm ...
- shell编程之awk
awk是一种用于处理数据和生成报告的编程语言 awk可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题 awk与grep.sed结合使用,将使shell编程更加容易 awk工作模式 ...
- binary hacks读数笔记(readelf基本命令)
一.首先对readelf常用的参数进行简单说明: readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用,下面以ELF格式可执行文件test为例详细介绍: 1. ...
- AHB SRAM控制器设计
- Ceph的参数mon_osd_down_out_subtree_limit细解
前言 之前跟一个朋友沟通一个其他的问题的时候,发现了有一个参数 mon osd down out subtree limit 一直没有接触到,看了一下这个参数还是很有作用的,本篇将讲述这个参数的作用和 ...
- http://www.etymon.cn/yingyucigen/3093.html
import requests import lxml.etree as etree import xml.etree.ElementTree as ET # 详情页 # 3093-148 # htt ...
- 背包问题(动态规划 C/C++)
Description 卖方:这件商品14元 买方:给你20元 卖方:不好意思,我的零钱不够 买方:好吧,这是15元,剩的当小费 当到一个地方旅游时,如果你买东西的地方不支持信用,带零钱还是非常有用的 ...
- Linux Shell操作 执行C代码显示当前路径
在unix系统下一切皆文件,文件夹是文件的一种.设备也会对应到相应的文件类型. 基础知识: . 代表当前路径 ..代表上级目录(父目录) / 在路径的最前边的时候代表树根.在路径中间的时候只不过是路径 ...