前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python 几个重要函数

python 几个重要函数

作者头像
py3study
发布2020-01-08 16:47:20
发布2020-01-08 16:47:20
64200
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

一、匿名函数lambda

原型:lambda<参数>:函数体,隐函数,定义一些简单的操作,

lambda argument1, argument2,...,argumentN: expression using arguments

1、lambda是一个表达式,而不是一个语句。

因为这一点,lambda可以出现在python语法不允许def出现的地方---例如,在一个列表常量中或者函数调用的参数中,此外,作为一个表达式,lambda返回一个值(一个新函数),可以选择性地赋值给一个变量名。相反,def语句总是得在头部将一个新的函数赋值给一个变量名,而不是将这个函数作为结果返回。

2、lambda的主体是一个单个的表达式,而不是一个代码块。

lambda是一个为编写简单的函数设计的,而def用来处理更大的任务。

3、lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。

例1:定义一个lambda表达式,求三个数的和

代码语言:javascript
代码运行次数:0
运行
复制
# -*- coding: UTF-8 -*-
f = lambda x,y,z:x+y+z
print f(1,2,3)
print f(4,5,6)
代码语言:javascript
代码运行次数:0
运行
复制
6
代码语言:javascript
代码运行次数:0
运行
复制
15

例2:

代码语言:javascript
代码运行次数:0
运行
复制
>>> x=(lambda a="fee", b="fie", c ="foe": a+b+c)
>>> x("wee")
代码语言:javascript
代码运行次数:0
运行
复制
'weefiefoe'

例3:用lambda表达式求n的阶乘

代码语言:javascript
代码运行次数:0
运行
复制
# -*- coding: UTF-8 -*-
n = 5 
print reduce(lambda x,y:x*y,range(1,n+1))
代码语言:javascript
代码运行次数:0
运行
复制
120

例4:lambda表达式也可以用在def函数中

代码语言:javascript
代码运行次数:0
运行
复制
# -*- coding: UTF-8 -*-
def action(x):
      return lambda y:x+y
a = action(2)
print a(22)
代码语言:javascript
代码运行次数:0
运行
复制
24

这里定义了一个action函数,返回了一个lambda表达式。其中lambda表达式获取了到了上层def作用域的变量名x的值。

a是action函数的返回值,a(22),即是调用了action返回的lambda表达式。

这里也可以把def直接写成lambda形式。如下:

代码语言:javascript
代码运行次数:0
运行
复制
# -*- coding:UTF-8 -*-

b = lambda x:lambda y:x+y
a = b(3)
print a(2)
print (b(2))(2)
代码语言:javascript
代码运行次数:0
运行
复制
5
代码语言:javascript
代码运行次数:0
运行
复制
4

例5 :通常用lambda来编写跳转表,如下:

代码语言:javascript
代码运行次数:0
运行
复制
>>> L = [lambda x:x**2, lambda x:x**3, lambda x:x**4]
>>> for f in L:
        print(f(2))
代码语言:javascript
代码运行次数:0
运行
复制
4
代码语言:javascript
代码运行次数:0
运行
复制
8
代码语言:javascript
代码运行次数:0
运行
复制
16
代码语言:javascript
代码运行次数:0
运行
复制
>>> print(L[0](3))
代码语言:javascript
代码运行次数:0
运行
复制
9

二、Map函数

原型:map(function,sequence),作用是将一个列表映射到另一个列表 map(function,sequence,[sequence,...])->iterator

通过定义可以看到,这个函数的第一个参数是一个函数,剩下的参数是一个或多个序列,返回值是一个迭代器。 function可以理解为是一个一对一或多对一函数,map的作用是以参数序列中的每一个元素调用function函数,返回包含每次function函数返回值的迭代器。

返回可迭代对象,需要list调用来显示所有结果。

代码语言:javascript
代码运行次数:0
运行
复制
>>> list(map(lambda x:x+2,[1,2,3]))
代码语言:javascript
代码运行次数:0
运行
复制
[3,4,5]
代码语言:javascript
代码运行次数:0
运行
复制
>>> list(map(pow,[1,2,3],[2,3,4]))
代码语言:javascript
代码运行次数:0
运行
复制
[1,8,81]

注:pow()函数: 返回x的y次方的值。

代码语言:javascript
代码运行次数:0
运行
复制
>>> def add(x,y): return x+y
>>> map(add, range(8),range(8))
代码语言:javascript
代码运行次数:0
运行
复制
[0,2,4,6,8,10,12,14]

三、filter函数

filter函数会对指定序列执行过滤操作

filter函数的定义:

filter(functon or None, sequence) ->iterator

filter函数会对序列参数sequence中的每个元素调用function函数,最后返回的结果包含调用结果为True的元素。

返回课迭代对象,需要用list调用来显示所有结果。

代码语言:javascript
代码运行次数:0
运行
复制
>>> list(filter((lambda x: x>0), range(-5,5)))
代码语言:javascript
代码运行次数:0
运行
复制
[1,2,3,4]
代码语言:javascript
代码运行次数:0
运行
复制
>>> list(fliter(None,range(-5,5)))
代码语言:javascript
代码运行次数:0
运行
复制
[-5,-4,-3,-2,-1,1,2,3,4]

注:若function为None,则会返回包含非空元素的迭代器。

代码语言:javascript
代码运行次数:0
运行
复制
>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>>  filter(f, range(2,25))
代码语言:javascript
代码运行次数:0
运行
复制
[5,7,11,13,17,19,23]

四、reduce函数

reduce函数,reduce函数会对参数序列中元素进行累积。

reduce函数的定义:

functools.reduce(function, iterable, [initializer])  #python3中reduce是在functools模块中

function参数是一个有两个参数的函数,reduce依次从iterable中取一个元素,和上一次调用function的结果做参数再次调用function。

第一次调用function时,如果提供initial参数,会以iterable中的第一个元素和initial作为参数调用function,否则会以iterable中的前两个元素做参数调用function。

等价于:

代码语言:javascript
代码运行次数:0
运行
复制
def reduce(function,iterable,initializer=None):
it = iter(iterable)
   if initializer is None:
        value = next(it)
   else:
        value = initializer
    for element in it:
        value = function(value,element)
return value
代码语言:javascript
代码运行次数:0
运行
复制
>>> import functools
代码语言:javascript
代码运行次数:0
运行
复制
>>> functools.reduce(lambda x,y:x+y,[1,2,3,4])
代码语言:javascript
代码运行次数:0
运行
复制
10
代码语言:javascript
代码运行次数:0
运行
复制
>>> functools.reduce(lambda x,y:x+y,[1,2,3,4],10)
代码语言:javascript
代码运行次数:0
运行
复制
20
代码语言:javascript
代码运行次数:0
运行
复制
>>> functools.reduce(lambda x,y,x*y,[1,2,3,4])
代码语言:javascript
代码运行次数:0
运行
复制
24

如果没有initial参数,这么算:(((1+2)+3)+4)

如果有initial参数,这么算:((((10 +1)+2)+3)+4)

注意:function函数不能为None,function必须是有2个参数的函数。

五、zip函数

其中sorted()和zip()返回一个序列(列表)对象,reversed()、enumerate()返回一个迭代器(类似序列)

定义:zip([seql,...])接受一系列可迭代对象作为参数,将对象中对应的元素打包成一个个tuple,然后返回由这些tuples组成的list。若传入参数的长度不相等,则返回list的长度和参数中长度最短的对象相同。

代码语言:javascript
代码运行次数:0
运行
复制
>>> list(zip([1,23,3],[213,45,2])) #两个列表长度一致
代码语言:javascript
代码运行次数:0
运行
复制
[(1,213),(23,45),(3,2)]
代码语言:javascript
代码运行次数:0
运行
复制
>>> list(zip([1,23,3],[213,45,2,34,54])) #两个列表长度不一致,以短的为准
代码语言:javascript
代码运行次数:0
运行
复制
[(1,213),(23,45),(3,2)]

zip一些应用:

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
复制
>>> [[i for i in range(3*n+1,3*n+4)] for n in range(3)]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档