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. 对于final修饰的类型运算时的表现

    我们知道,对于byte,char,这些数据类型加减时都会转化成int在运算,然而,对于final修饰过的数据是不会发生转换的. 比如说 byte b1=1; byte b2=2; byte b3=b1 ...

  2. python-交互模式

    1.打开python交互式命令行: Windows+R→回车→输入python 如图 输入python进入交互模式,相当于启动了python解释器,输入一行代码就执行一行代码,可以用交互模式去验证每一 ...

  3. 企业安全03Django GIS SQL注入漏洞CVE-2020-9402

    Django GIS SQL注入漏洞CVE-2020-9402 一.漏洞描述 Django是Django基金会的一套基于Python语言的开源Web应用框架.该框架包括面向对象的映射器.视图系统.模板 ...

  4. linux查看内存及磁盘使用情况

    1.查看当前目录 命令:   df -h       (统一每个目录下磁盘的整体情况) 2.查看指定目录 在命令后直接放目录名,比如查看"usr"目录使用情况: 命令:   df ...

  5. django邮件发送

    需要一个邮箱,设置pop3 设置setting EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = ' ...

  6. 【手把手学习flutter】Flutter打Android包的基本配置和包体积优化策略

    [手把手学习flutter]Flutter打Android包的基本配置和包体积优化策略 关注「松宝写代码」,回复"加群" 加入我们一起学习,天天向上 前言 因为最近参加2020FE ...

  7. 第11.3节 Python正则表达式搜索支持函数search、match、fullmatch、findall、finditer

    一. 概述 re模块的函数search.match.fullmatch.findall.finditer都是用于搜索文本中是否包含指定模式的串,函数的参数都是一样的,第一个参数是模式串.第二个是搜索文 ...

  8. 第15.6节 PyQt5安装与配置

    一. 引言 关于PyQt5的安装网上有很多的文章,老猿也是学习了好多,最后结合其他模块安装的知识发现其实安装很简单,就是直接使用pip或pip3安装就可以了,这样既无需预先下载好软件,也无需担心版本的 ...

  9. Leetcode学习笔记(5)

    之前断了一段时间没做Leetcode,深感愧疚,重新续上 题目1 ID104 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点 ...

  10. C# Email 帮助类 EmailHelper

    1. 配置文件 App.config <?xml version="1.0" encoding="utf-8" ?> <configurati ...