Bootstrap

2020-09-23

Python内置函数、高级函数用法map、reduce、filter、sorted、zip

map概述
map()函数是一个内置的高阶函数,一般用法是map(function, iterable),
map函数返回的是一个map对象,也是一个可迭代对象,可以利用for循环迭代查看元素,也可以尝试list()将其转为列表对象操作。
用法 说明 map(function, iterable),将迭代对象的每个元素传入函数,返回结果既为map对象
 
例题:计算列表中所有数的平方
L1 = [1, 2, 3, 4]
# 计算某数的平方
square_result = map(lambda x: x ** 2, L1)
print(list(square_result))

示例结果:
[1, 4, 9, 16]

多参数传递

map也接受多个可迭代对象作为参数传递,若可迭代对象元素数量不一致则传递至元素数量最小的为止
# 两组数两两相加
L1 = [1, 2, 3, 4, 5, 6, 7]
L2 = [5, 4, 3, 2, 1]
sum_result = map(lambda x, y: x + y, L1, L2)
print(list(sum_result))

示例结果:
[6, 6, 6, 6, 6]

reduce概述

reduce用于对可迭代对象中的元素进行累计操作,reduce接受两个参数,一个是函数f(x, y)参数(该函数必须有两个参数),另一个是可迭代对象。reduce行为是先将可迭代对象的前两个元素传入f(x, y)中,然后不断将f(x, y)的返回值再次和下一个迭代对象传入f(x, y),直到迭代完迭代对象中的元素,并返回最终的f(x, y)的返回值。reduce形式:
reduce(function, iterable[, initializer])
from functools import reduce
L = [1,2,3,4,5]
sum_results = reduce(lambda x,y: x + y, L)
print(sum_results)
15

filter概述

filter用于过滤筛选可迭代对象中的元素,如果符合条件则返回对应的元素序列(类型为filter),filter接受两个参数,一个是函数用于筛选元素,返回值为 True或Flase ,另一个是可迭代对象。
evens = filter(lambda x: x > 0 and not x % 2, range(-5, 10))
print(list(evens))
[2, 4, 6, 8]

sorted概述

sorted用于对可迭代对象进行排序操作, sorted函数:sorted(iterable,key,reverse) 其中iterable表示可以 迭代的对象 ,   key是一个函数 ,用来选取参与比较的元素,reverse则是用来指定排序是倒序还是顺序,reverse=true则是倒序,reverse=false时则是顺序,默认时reverse=false
以下返回值都是单一的key值排列或者value值排列:
d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>>sorted(d.keys())
['Bob', 'Michael', 'Tracy']
>>>sorted(d.values())
[75, 85, 95]
>>>sorted(d)
['Bob', 'Michael', 'Tracy']#默认就是根据key值排序
>>>sorted(d,key=lambda x: d[x])#根据value值的大小对key排序
['Bob', 'Tracy', 'Michael']

zip() 函数的定义

从参数中的多个迭代器取元素组合成一个新的迭代器
返回:一个zip对象,其内部元素为元组;可以转化成列表或元组
        传入参数:元组、列表、字典等迭代器
In [5]: m = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
In [6]: n = [[1, 1, 1], [2, 2, 3], [3, 3, 3]]
In [7]: p = [[1, 1, 1], [2, 2, 2]]
In [8]: list(zip(m,n))
Out[8]: [([1, 2, 3], [1, 1, 1]), ([4, 5, 6], [2, 2, 3]), ([7, 8, 9], [3, 3, 3])]

all() 函数的定义

         all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。
元素除了是 0、空、None、False 外都算 True。
>>> all(['a', 'b', 'c', 'd'])  # 列表list,元素都不为空或0
True
>>> all((0, 1, 2, 3))          # 元组tuple,存在一个为0的元素
False

any() 函数的定义

         any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。
        元素除了是 0、空、FALSE 外都算 TRUE。
>>> any(['a', 'b', '', 'd']) # 列表list,存在一个为空的元素 
True 
>>> any([0, '', False]) # 列表list,元素全为0,'',false 
False

eval() 函数的定义

          eval() 函数用来执行一个字符串表达式,并返回表达式的值。
>>>x = 7 
>>> eval( '3 * x' ) 
21

exec() 函数的定义

执行储存在字符串或文件中的 Python 语句,相对 eval() 函数可执行更复杂语句。
exec("""for i in range(10):
            print(i,end=",")
""")

 

 
问题: 有一个字典或者实例的序列,想根据某个特定的字段比如date 来分组迭代访问。
answer:  itertools.groupby函数对于这样的数据分组操作非常实用
rows = [
{'address': '5412 N CLARK', 'date': '07/01/2012'},
{'address': '5148 N CLARK', 'date': '07/04/2012'},
{'address': '5800 E 58TH', 'date': '07/02/2012'},
{'address': '2122 N CLARK', 'date': '07/03/2012'},
{'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},
{'address': '1060 W ADDISON', 'date': '07/02/2012'},
{'address': '4801 N BROADWAY', 'date': '07/01/2012'},
{'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]

from operator import itemgetter
from itertools import groupby

>>>rows.sort(key=itemgetter('date'))
  # Iterate in groups
>>>for date, items in groupby(rows, key=itemgetter('date')):
  .......  print(date)
  .......  for i in items:
  .......  print(' ', i)

groupby()函数扫描整个序列并且查找连续相同值的元素序列,
在每次迭代的时候它会返回一个值和一个迭代器对象,
这个迭代器对象可以生成元素值全部等于上面那个值的组中所有对象,
要根据指定的字段将数据排序,因为groupby() 仅仅检查连续的元素,如果事先并没有排序完成的话,分组函数将得不到想要的结果。

 
 
;