python_pychamPython基础Python

08--Python 函数式编程与推导式

2019-05-28  本文已影响11人  Roger田翔
@Author : Roger TX (425144880@qq.com)
@Link : https://github.com/paotong999

一、函数式编程

1、匿名函数lambda

python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

lambda parameter_list: expression

parameter_list:表示参数列表
expression:表示函数表达式(不是语句)
不是所有的函数表达式都可以使用lambda

2、三元表达式

三元运算符是软件编程中的一个固定格式,语法是 条件表达式?表达式1:表达式2。使用这个算法可以使调用数据时逐级筛选。三元表达式是将编程的过程用一个表达式展现的例子。
例如:x,y判断,如果x大于y返回x,否则返回y

x > y ? x : y

Python 的三元表达式,语法格式为:表达式1 if 条件表达式 else 表达式2

x if x>y else y

3、map类

map是 Python 内置的高阶函数,参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

map(func, *iterables) --> map object

map和lambda结合可以简化代码

list_x = [1,2,3,4,5]
def square(x):
    return x * x
r = map(square, list_x)
r = map(lambda x : x * x, list_x)
print (list(r))

map可以传入一个或多个序列

list_x = [1,2,3,4,5]
list_y = [1,2,3,4,5]
r = map(lambda x, y: x * x + y, list_x, list_y)

需要注意的是:map返回的是一个map对象,需要 list(map(funitor)) 来将映射之后的map对象转换成列表

4、reduce函数

reduce 函数会对参数序列中元素进行累积。函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

reduce(func, sequence, initial=None) --> value

from functools import reduce

list_x = [1,2,3,4,5]
r = reduce(lambda x, y: x * x + y, list_x)

需要注意的是:reduce返回的是一个值,并且reduce需要引用 functools

5、filter 类

filter用于过滤序列,接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

filter(function or None, iterable) --> filter object

list_x = [1,0,1,0,1]
r = filter(lambda x: True if x ==1 else False, list_x)
print (list(r))

list_x = ['A','b','f','D']
r = filter(lambda x : True if x == x.upper() else False, list_x)
print (list(r)) 

需要注意的是:filter返回的是一个filter对象,需要 list(filter(funitor)) 来将映射之后的filter对象转换成列表

二、Python的推导式

推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体, 共有三种推导。

1、列表推导式

列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形。

[表达式 for 变量 in 列表 if 条件]

基本格式

variable = [out_exp_res for out_exp ininput_list if condition]

#找出质数
#一般方法
compositeNumber = []
num = []
#合数一般都是2-7的倍数
for i in range(2,8):
#4是最小的合数,找出50以内的所有合数
    for j in range(2*i, 50, i):
        compositeNumber.append(j)
for x  in range(3,50):
    if x not in compositeNumber:
        num.append(x)
print('2-50内的质数:',num)
#用推导
compositeNumber = [j for i in range(2,8) for j in range(i*2,50,i)]
num = [x for x in range(3,50) if x not in compositeNumber]
print('2-50内的质数(推导):',num)
#列表推导之间的嵌套
num = [x for x in range(3,50) if x not in [j for i in range(2,8) for j in range(i*2,50,i)]]
print('2-50内的质数(嵌套列表推导):',num)

2、元组就没有推导式,但是可以得到生成器

tuple = (i for i in range(30) if i % 3 is 0)
print(type(tuple))
#  Output: <type 'generator'>

3、字典推导式

字典和集合推导式是上面思想的延续,语法差不多,只不过产生的是集合和字典而已。

{表达式 for 变量 in 列表 if 条件}

基本格式

variable = {key_expr: value_expr for value in collection if condition}

#字符串生成字典:
str = 'sderfsdffsdfdsa'
#用普通方式
index = 0
for x in str:
    print(index,':',x,end=',')
    index+=1
print()
#用字典推导式
dictionary = {key : val for key,val in enumerate(str)}
print(dictionary)
#用enumrate遍历
for index,value  in enumerate(str):
    print(index,':',value,end=',')
#快速更换key和value
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print mcase_frequency
#  Output: {10: 'a', 34: 'b'}

4、集合推导式

集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。

{表达式 for 变量 in 列表 if 条件}

基本格式

variable = { expr for value in collection if condition}

#用集合推导建字符串长度的集合
strings = ['a','is','with','if','file','exception']
print({len(s) for s in strings}) 
#有长度相同的会只留一个,结果{1, 2, 4, 9}

5、Python enumerate用法

enumerate(sequence, [start=0])

for i, season in enumerate([’Spring’, ’Summer’, ’Fall’, ’Winter’]):
...
 print i, season
0 Spring
1 Summer
2 Fall
3 Winter
上一篇下一篇

猜你喜欢

热点阅读