python高级函数六剑客

第一位:lambda

1.lambda语句被用来创建新的函数对象,并且在运行时返回它们。

2.Python使用lambda关键字来创建匿名函数。这种函数得名于省略了用 def声明函数的标准步骤。

3.lambda只是一个表达式,函数体比def简单很多

4.lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表 达式中封装有限的逻辑进去。

5,lambda函数拥有自己的名字空间,且不能访问自由参数列表之外全局名 字空间里的参数。

6.虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数, 后者的目的是调用小函数时不占用栈内存从而增加运行效率。

7.lambda会返回一个函数对象,但这个对象不会赋给一个标识符,而def 则会把函数对象赋值给一个变量(函数名)。

8.像if或for或print等语句不能用于lambda中。

9.lambda函数不能共享给别的程序调用,def定义的函数可以

 

举个栗子:

1.单个参数

g = lambda x:x+1

print g(1)

print g(2)

2.多个参数

g = lambda x, y, z : (x + y) ** z

print g(1,2,3)

3.

lambda表达式会返回一个函数对象, 如果没有变量接受这个返回值,它很快 就会被丢弃,也正是由于lambda只是 一个表达式,所以它可以直接作为list、 dict等的成员。如:

list_a = [lambda a: a**3, lambda b: b**3]

print (list_a[0])

g = list_a[0]

print g(2)

 

第二位:map

将每个列表元素或字符串都执行某个函数

map的函数操作方法:它将每个字符串或者列表元素,应用某个函数方法, 结果返回列表。 当seq只有一个时,将函数func作用于这个seq的每个元素上,并得到一个新 的seq。

让我们来看一下只有一个seq的时候,map()函数是如何工作的

 

举个栗子:

#求两个数的和

res = map(lambda x , y : x + y, [2,4,6],[3,2,1])

for i in res:print(i)

 

map无法处理对应位置操作数类型不一致的情况,这种情况都会报类 型错误,但是对于对应位置长度不一致的情况,可以处理,对应到多少 就处理多少。

#当对应位置的数据类型不一致时

res = map(lambda x , y : (x ** y, x + y), [2,4,6],[3,2,'a'])

for i in res:print(i)

 

第三位:filter

filter()函数可以对序列做过滤处理,就是说可以使用一个自定的函数过滤一个 序列,把序列的每一项传到自定义的过滤函数里处理,并返回结果做过滤。最 终一次性返回过滤后的结果。

filter()函数有两个参数:

第一个,自定函数名,必须的 第二个,需要过滤的列,也是必须的

 

#coding=utf-8

#定义大于5小于10的函数

def guolvhanshu(num):

if num>5 and num<10:

return num

 

0

#定义一个序列

seq=(12,50,8,17,65,14,9,6,14,5)

#使用filter函数

result=filter(guolvhanshu,seq)

#(8,9,6)

print result

 

第四位:reduce

reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组 等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一 个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第 三个数据用func()函数运算,最后得到一个结果。

1.

from functools import reduce

lst = [1,2,3,4,5]

print reduce(lambda x,y:x+y,lst)

#这种方式用lambda表示当做参数,因为没有提供reduce的第三个参 数,所以第一次执行时x=1,y=2,第二次x=1+2,y=3,即列表的第三个 元素

2.

from functools import reduce lst=[1,2,3,4] print(reduce(lambda x,y: x+y, lst,5)) # 5是初始值,也可以理解为第三个参数 # 计算呢过程 -->5+1=6 -->6+2=8 -->8+3=11 -->11+4=15

 

第五位:推导列表

列表推导式提供了从序列创建列表的简单途径。

通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表的元素,或者根据确定的判定条件创建子序列。

每个列表推导式都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从其后的 for 和 if 上下文环境中生成出来的列表。如果希望表达式推导出一个元组,就必须使用括号。

 

代码示例1:

listone = [2, 3, 4]

listtwo = [2*i for i in listone if i > 2]

print listtwo

 

代码示例2:

print [m + n for m in 'ABC' for n in 'XYZ']

 

代码示例3:

d = {'x': 'A', 'y': 'B', 'z': 'C' }

print ([k + '=' + v for k, v in d.items()] )

 

代码示例4:

L = ['Hello', 'World', 'IBM', 'Apple']

print [s.lower() for s in L]

 

第六位:切片

切片--对序列有效(列表,元组,字符串)

序列:它们的成员是有序排列的,可以通过下标偏移量访问到它的一个或几个成员

>>> s="abcdefg"[0]

>>> "abcdefg"[0]

'a'

>>> "abcdefg"[1]

'b'

>>> "abcdefg"[2]

'c'

>>> "abcdefg"[-1]

'g'

>>> "abcdefg"[-2]

'f'

>>> "abcdefg"[-3]

'e'

>>> "abcdefg"[-len("abcdefg")]

'a'

>>> a="12345"

>>> a[::2]

'135'

全量复制:

>>> "abcdefg"[:]

'abcdefg'
————————————————
原文链接:https://blog.csdn.net/qq_30758629/article/details/95924134

posted @ 2019-11-27 16:38  巍然~chelsea  阅读(259)  评论(0编辑  收藏  举报