Python有几个相对特殊的函数,他们并不会提高工作效率,但是会使代码优雅简洁,其中包括lambda, map, reduce, filter, yeild。

第一:lambda,贴些代码体会。

 1 #lambda 函数
2 def add(x):
3 x += 3
4 return x
5
6 lam = lambda x:x+3
7 numbers = list(range(10))
8 newNumbers1 = []
9 newNumbers2 = []
10 newNumbers3 = []
11 newNumbers4 = []
12 newNumbers5 = []
13
14 for i in numbers:
15 newNumbers1.append(add(i))
16 print("New Numbers 1: \n\t", newNumbers1);
17
18 newNumbers2 = [i+3 for i in numbers]
19 print("New Numbers 2: \n\t", newNumbers2)
20
21 newNumbers3 = [add(i) for i in numbers]
22 print("New Numbers 3: \n\t", newNumbers3)
23
24 newNumbers4 = [lam(i) for i in numbers]
25 print("New Numbers 4: \n\t", newNumbers4)
26
27 for i in numbers:
28 newNumbers5.append(lam(i))
29 print("New Numbers 5: \n\t", newNumbers5)

lambda总结:

  • 在lambda后面直接跟变量
  • 变量后面是冒号
  • 冒号后面是表达式

第二是map()函数,map函数是python的内置函数。官方说明: 

map(func, *iterables) --> map object
|
| Make an iterator that computes the function using arguments from
| each of the iterables. Stops when the shortest iterable is exhausted.

个人理解:基本样式:map(function, sequence),function是函数,sequence是序列对象,在执行的过程中,序列对象中的每个元素,按照从左到右的顺序,依次被提取出来,并作为实参传递给function函数,然后将function的返回值依次存到一个列表中.

 1 #延续上面的例子
2 #定义函数add
3 def add(x):
4 x += 3
5 return x
6 lam = lambda x:x+3 #定义lambda函数并赋值给lam
7 numbers = range(10) #定义numbers
8
9 newNumber1 = map(add, numbers) #调用map函数将序列numbers中的每一个元素从左到右提取出来,并作为实参传递给函数add,然后将函数add的返回值存储在一个列表中。
10 print("New number is: \n\t", list(newNumber1)) #打印看是否符合预期
11
12 newNumber2 = map(lam, numbers); #调用map函数将序列numbers中的每一个元素从左到右提取出来,并作为实参传递给函数lambda,然后将函数lambda的返回值存储在一个列表中。
13 print("New Number 2 is: \n\t", list(newNumber2)); #打印看是否符合预期

再来一个计算平方根的例子,一般是如下用循环:

1 items = [1,2,3,4,5] #定义列表
2 square1 = [] #定义空列表,以存储计算后的平方数
3 #循环读取i在列表items中的值
4 for i in items:
5 square1.append(i ** 2) #将每次循环所得的平方数追加到列表
6 print("Results is: \n\t", square1) #打印看是否符合预期:[1, 4, 9, 16, 25]

下面用map来实现:

 1 def sqr(x):
2 return x ** 2
3 #用map实现
4 square2 = map(sqr, items)
5 print("Results is: \n\t", list(square2))
6
7 #也可以用map配合lambda实现
8 square3 = map((lambda x:x**2), items)
9 print("Results is: \n\t", list(square3))
10 #也可以用列表解析
11 square4 = [x**2 for x in items]
12 print("Square 4 is: \n\t", square4)

再来一个计算列表元素之和的例子,比如有两个列表,要计算他们的和然后再返回一个列表,就可以用map优雅简洁的实现:

 1 list1 = [1,2,3,4,5]
2 list2 = [6,7,8,9,10]
3
4 sumList = map((lambda x,y:x+y), list1,list2) #调用map函数将序列list1和list2中的每一个值从左到右提取出来,并作为实参传递给lambda函数,然后将返回的值存储在一个列表中
5 print("The result is: \n\t", list(sumList))
6
7 lst1 = [1,2,3,4,5]
8 lst2 = [6,7,8,9,10]
9 lst3 = [11,12,13,14,15]
10 sumList = map((lambda x,y,z:x+y+z), lst1,lst2,lst3)
11 print("The result is: \n\t", list(sumList))

第三个函数是reduce(),reduce也给一个官方的说明:

reduce(function, sequence[, initial]) -> value

Apply a function of two arguments cumulatively to the items of a sequence,
from left to right, so as to reduce the sequence to a single value.
For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
((((1+2)+3)+4)+5). If initial is present, it is placed before the items
of the sequence in the calculation, and serves as a default when the
sequence is empty.
(END)

reduce在我这里的应用可能就一个计算列表的总和了。毕竟能力有限。还是从数字列表理解一下,有一个列表:【1,2,3,4,5】,要计算元素的总和。简单的就sum(list)。用reduce也可以,他的方法是,先提取最左边的两个元素相加,然后把结果和第三个元素再相加,然后把结果再和第四个元素相加,以此类推。求列表的和,有一篇文章专门讲述了 - Python求列表元素之和。这里是说reduce:

 1 lst = [1,2,3,4,5]
2 def sumList(lst):
3 return sum(lst)
4 print("Sum is: \n\t", sumList(lst))
5
6 #使用for循环
7 sumList = 0 #定义和变量,初始为0
8 for i in lst:
9 sumList += i
10 print("Sum is: \n\t", sumList)
11
12 #for循环2
13 sumList = 0
14 for i in range(len(lst)):
15 sumList += lst[i]
16 print("Sum is: \n\t", sumList)
17
18 #使用reduce函数
19 sumList = reduce((lambda x,y:x+y), lst); #调用reduce函数对序列lst中的每个元素进行相加
20 print(sumList)

使用reduce计算两个列表对应元素的乘积和。假设有两个列表a = [3,9,8,5,2],b=[1,4,9,2,6]。现在要计算a[0]*b[0]+a[1]*b[1]+...+a[n]*b[n]。先用zip将列表a和列表b打包成一个个元组,然后再用列表解析成一个新列表,然后计算新列表的和。

1 a = [3,9,8,5,2] #定义列表a
2 b = [1,4,9,2,6] #定义列表b
3
4 #调用zip将a和b中的对应的元素打包成一个个元组,然后返回由这些元组组成的列表
5 newListc = [x * y for x,y in zip(a,b)]; #通过列表解析将对应的值赋值给xy
6 print(newListc) #打印输出:[3, 36, 72, 10, 12]
7 print(sum(newListc)) #得到要求的数据:133

也可以用reduce:

1 a = [3,9,8,5,2] #定义列表a
2 b = [1,4,9,2,6] #定义列表b
3 #使用reduce函数
4 newListreduce = reduce(lambda x,y:x+y, map(lambda x,y: x*y, a,b))
5 print(newListreduce) #133

第四个函数是filter函数,中文理解就是过滤器。贴官方说明:

filter(function or None, iterable) --> filter object
|
| Return an iterator yielding those items of iterable for which function(item)
| is true. If function is None, return the items that are true.

1 numbers = list(range(-5,5)) #定义数字列表
2 print(numbers); #打印[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
3 newNumbers1 = filter(lambda x: x>0, numbers) #调用filter函数进行过滤
4 print(list(newNumbers1)) #打印输出:[1, 2, 3, 4]
5
6 newNumbers2 = [x for x in numbers if x>0] #列表解析
7 print(newNumbers2) #打印输出:[1, 2, 3, 4]
8
9 baidu = filter(lambda x : x!='a', 'baidu.com') #bidu.com

还有个一yield,戳这里。

Phthon几个特殊的函数的更多相关文章

  1. phthon中的open函数模式

    原文地址:http://www.runoob.com/python/python-func-open.html r 以只读方式打开文件.文件的指针将会放在文件的开头.这是默认模式. rb 以二进制格式 ...

  2. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  3. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  4. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  5. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  6. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  7. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  8. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  9. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

随机推荐

  1. vulnhub: DC 4

    信息收集: yurang@kali:~$ nmap -sn 192.168.76.1/24 Starting Nmap 7.80 ( https://nmap.org ) at 2020-08-04 ...

  2. iOS 默认Cell选中

    NSInteger selectIndex = [NSIndexPath indexPathForItem:0 inSection:0]; [self.ui_tableView selectRowAt ...

  3. JavaSE 学习笔记08丨网络编程

    Chapter 14. 网络编程 14.1 计算机网络入门 当前节的知识点只是一个概述,更具体.详细的内容放在 计算机网络 中. 14.1.1 软件结构 C/S结构(Client/Server结构): ...

  4. HTML+JavaScript画函数图像

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. python -- 对list去重并找出列表list中的重复元素

    一.一个列表中可能含有重复元素,使用set()可以实现列表的去重处理,但是无法知道哪些元素是重复的,下面的函数用于找出哪些元素重复了,以及重复的次数. 代码: from collections imp ...

  6. LaTeX文档的基本结构

    正文提纲的构建代码及注释: 显示效果: 目录结构与换行的代码及注释: 显示效果: 具体的有关的信息可以具体查看ctex文档,可以在导言区进行全局的设置,比如标题居中设置等.

  7. SpringIOC循环依赖

    目录 1. 什么是循环依赖 注意: 这⾥不是函数的循环调⽤,是对象的相互依赖关系. 循环调⽤其实就是⼀个死循环,除⾮有终结 条件. 2. 循环依赖处理机制 2.1 演示场景: 2.2 处理机制简图 总 ...

  8. iOS UIImageView contentMode使用详解

    UIImageView 的contentMode这个属性是用来设置图片的显示方式,如居中.居右,是否缩放等,有以下几个常量可供设定:UIViewContentModeScaleToFill //填满i ...

  9. JZOJ2020年9月19日提高B组反思

    CSP第一轮倒计时:22天 JZOJ2020年9月19日提高B组反思 今天比的不好,只有签到题过了 130,rank 20 T1 签到题 用二分直接切 AC 100 T2 觉得是依赖背包问题 但是我没 ...

  10. k8s 部署 Java 项目

    前几天安装了 k8s 并测试了自动伸缩功能(HPA),今天来部署一个简单的 Java 应用到 k8s. 开始之前需要先安装一下 ingress 插件.ingress 作为 k8s 的流量入口,有多种实 ...