四大高阶函数 & 上下文管

四大高阶函数

  • 匿名函数
f = lambda x,y,z:x+y+z
def F(x,y,z):
    return x+y+z

f = lambda x:x if x % 2 != 0 else x + 100
print(f(10))                    # 110
  • 三元运算
name = 'Tom' if 1 == 1 else 'fly'
print(name)
# 运行结果: Tom
  • Map函数

    • 功能:将第一个参数 function 依次作用的每在参数可迭代对象中一个元素上,返回包含每次 function 函数返回值的新迭代器
    • 第一个参数接收一个函数名,第二个参数接收一个可迭代对象
    • 利用map,lambda表达式将所有偶数元素加100
代码:
def f(x):
    return x*x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(r))

 运行结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]
# -*- coding:utf8 -*-
l1= [11,22,33,44,55]
ret = map(lambda x:x-100 if x % 2 != 0 else x + 100,l1)
print(list(ret))
# 运行结果: [-89, 122, -67, 144, -45]

# lambda x:x-100 if x % 2 != 0 else x + 100
# 如果 "if x % 2 != 0" 条件成立返回 x-100
# 不成立:返回 x+100
def F(x):
    if x%2 != 0:
        return x-100
    else:
        return x+100
ret = map(F,l1)
print(list(ret))
  • reduce(function, iterable[, initializer])函数

    • 功能:函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果
    • 字符串反转
代码:
from functools import reduce
def add(x, y):
    return x + y
 
r = reduce(add, [1, 3, 5, 7, 9])
print(r)
 
运行结果:
25
# -*- coding:utf8 -*-
'''使用reduce将字符串反转'''
s = 'Hello World'
from functools import reduce

result = reduce(lambda x,y:y+x,s)
# # 1、第一次:x=H,y=e  => y+x = eH
# # 2、第二次:x=l,y=eH  => y+x = leH
# # 3、第三次:x=l,y=leH  => y+x = lleH
print( result )      # dlroW olleH
  • filter(function, iterable)函数

    • filter()函数可以对序列做过滤处理,就是说可以使用一个自定的函数过滤一个序列,把序列的每一项传到自定义的过滤函数里处理,并返回结果做过滤。
    • 最终一次性返回过滤后的结果。
    • filter()函数有两个参数:
      • 第一个,自定函数名,必须的
      • 第二个,需要过滤的列,也是必须的
    • 利用 filter、lambda表达式 获取l1中元素小于33的所有元素 l1 = [11, 22, 33, 44, 55]
代码:
l1= [11,22,33,44,55]
a = filter(lambda x: x<33, l1)
print(list(a))
# -*- coding:utf8 -*-
def F(x):
    if x<33:
        return x
b = filter(F,l1)
print(list(b))
  • sorted(iterable, key=abs, reverse=False) 函数

    • 功能:对所有可迭代的对象进行排序操作
    • 经典面试题只 列表排序
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
print( sorted(students, key=lambda s: s[2], reverse=False) )    # 按年龄排序
# 结果:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

def f(x):
    # ('john', 'A', 15)
    return x[2]
print( sorted(students, key=f, reverse=False) )    # 按年龄排序
  • 对字典的value排序
d = {'k1':1, 'k3': 3, 'k2':2}
# d.items() = [('k1', 1), ('k3', 3), ('k2', 2)]
a = sorted(d.items(), key=lambda x: x[1])
print(a)            # [('k1', 1), ('k2', 2), ('k3', 3)]
  • 两个列表编一个字典
L1 = ['k1','k2','k3']
L2 = ['v1','v2','v3']
print( list(zip(L1,L2)))
# zip(L1,L2) : [('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')]
# dict( [('k1', 'v1'), ('k2', 'v2'), ('k3', 'v3')] )  = {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
代码:print(sorted([36, 5, -12, 9, -21]))
运行结果:[-21, -12, 5, 9, 36]

上下文管理

  • 什么是with语句

    • with是一种上下文管理协议,目的在于从流程图中把 try,except 和finally 关键字和资源分配释放相关代码统统去掉,简化try….except….finlally的处理流程。

    • 所以使用with处理的对象必须有enter()和exit()这两个方法

      1)with通过enter方法初始化(enter方法在语句体执行之前进入运行)

      2)然后在exit中做善后以及处理异常(exit()方法在语句体执行完毕退出后运行)

  • with语句使用场景

    1. with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源

    2. 比如文件使用后自动关闭、线程中锁的自动获取和释放等

  • with处理文件操作的实例

with open('/etc/passwd') as f:
    for line in f:
        print(line)
  # 这段代码的作用:打开一个文件,如果一切正常,把文件对象赋值给f,然后用迭代器遍历文件中每一行,当完成时,关闭文件;

  # 而无论在这段代码的任何地方,如果发生异常,此时文件仍会被关闭。
发布了37 篇原创文章 · 获赞 7 · 访问量 1121

猜你喜欢

转载自blog.csdn.net/Hanmin_hm/article/details/104757332