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

@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

  • function -- 函数,有两个参数
  • iterable -- 可迭代对象
  • initializer -- 可选,初始参数
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

  • function -- 函数,有两个参数
  • iterable -- 可迭代对象
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的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体, 共有三种推导。

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式

1、列表推导式

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

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

基本格式

variable = [out_exp_res for out_exp ininput_list if condition]

  • out_exp_res: 列表生成元素表达式,可以是有返回值的函数。
  • for out_exp ininput_list: 迭代 input_listout_exp 传入 out_exp_res 表达式中。
  • 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}

  • key_expr: value_expr: 字典生成表达式,可以是有返回值的函数。
  • for value in collection: 迭代 collectionvalue 传入 key_expr: value_expr 表达式中。
  • 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}

  • expr: 集合生成元素表达式,可以是有返回值的函数。
  • for value incollection: 迭代 collectionvalue 传入 expr 表达式中。
  • if condition: 根据条件过滤哪些值可以(可选参数)。
#用集合推导建字符串长度的集合
strings = ['a','is','with','if','file','exception']
print({len(s) for s in strings}) 
#有长度相同的会只留一个,结果{1, 2, 4, 9}

5、Python enumerate用法

  • enumerate()是python的内置函数
  • enumerate在字典上是枚举、列举的意思
  • 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
  • enumerate多用于在for循环中得到计数

enumerate(sequence, [start=0])

for i, season in enumerate([’Spring’, ’Summer’, ’Fall’, ’Winter’]):
...
 print i, season
0 Spring
1 Summer
2 Fall
3 Winter
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容