@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
forout_exp
ininput_list
ifcondition
]
-
out_exp_res
: 列表生成元素表达式,可以是有返回值的函数。 - for
out_exp
ininput_list
: 迭代input_list
将out_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
forvalue
incollection
ifcondition
}
-
key_expr: value_expr
: 字典生成表达式,可以是有返回值的函数。 - for
value
incollection
: 迭代collection
将value
传入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
forvalue
incollection
ifcondition
}
-
expr
: 集合生成元素表达式,可以是有返回值的函数。 - for
value
incollection
: 迭代collection
将value
传入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