ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python高阶函数总结及练习

2022-02-27 17:59:23  阅读:159  来源: 互联网

标签:map return 函数 Python 练习 print 高阶 def name


map()

内置函数map(),接收两个参数,参数一为函数,参数二为iterable, 将参数一的函数依次作用到参数二的每一个元素上,结果以新的Iterator返回。
解释:
1.Iterable (迭代对象):可直接用作for循环的对象,如:list tuple dict set str
2.Iterator(迭代器):可被next()调用,并不断返回下一个值的对象,如:generator(生成器)

#计算x^2
def fun(x):
    return x**2
for i in map(fun, [1, 2, 3, 4, 5]):
    print(i, end=' ')
#把所有的数字变成字符串并把iterator变成list
print(list(map(str, [1, 2, 3, 4, 5])))

reduce()

reduce()接收两个参数,参数一是函数,参数二是序列,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

from functools import reduce
#str2int方法
#输出 738912
DIGITS = {"0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9}
def str2int(s):
    def fn(x, y):
        return x*10+y
    def char2int(s):
        return DIGITS[s]
    return reduce(fn, map(char2int,s))
print(str2int("738912"))

#输出12345
def add2(x, y):
    return x*10+y
print(reduce(add2, [1, 2, 3, 4, 5]))

#使用lambda匿名函数
DIGITS = {"0":0, "1":1, "2":2, "3":3, "4":4, "5":5, "6":6, "7":7, "8":8, "9":9}
def char2int(s):
    return DIGITS[s]
print(reduce(lambda x, y: x*10+y , map(char2int, "987654")))
#将字符串的开头字母变大写,其他变小写
def normalize(name):
    if isinstance(name, str):
        return name[0].upper()+name[1:].lower()
print(list(map(normalize, ["Jemma", "TOnnY", "JSHon"])))

filter()

练习:找素数(埃氏筛法)

#找排除掉偶数的序列(除2外,其他偶数都不是素数)
def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n
# 找出不被整除的数
def _not_divisible(n):
    return lambda x: x % n > 0
#输出素数
def primes():
    yield 2
    it = _odd_iter()
    while True:
        n = next(it)
        yield n
        it = filter(_not_divisible(n), it)
#找30以内的素数
for i in primes():
    if i < 30:
        print(i)
    else:
        break

练习:找回数

def is_palindrome(n):
    s = str(n)
    return s[:] == s[-1::-1]
for i in filter(is_palindrome, range(100, 300)):
    print(i)

sorted()

练习:对列表中的元组排序

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
    return t[0]
def by_score(t):
    return t[1]
print(sorted(L, key=by_name))
print(sorted(L, key=by_score, reverse=True))

返回函数

函数作为返回值。内部函数可以引用外部函数的参数和局部变量,当外部函数返回内部函数时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

#计数器函数,返回递增整数
def createCounter():
    i = 0
    def counter():
        nonlocal i
        i = i + 1
        return i
    return counter

counter = createCounter()
print(counter(), counter())
print([counter(), counter()] == [3, 4])

匿名函数

print(list(map(lambda x: x**2, [1, 2, 3, 4, 5])))
print(list(map(lambda x: -x if x%2==1 else x, [1, 2, 3, 4, 5])))
print(list(filter(lambda x: x%2 == 0, [1, 2, 3, 4, 5])))

nums = [0, 7, 0, 1, 2, 1, 5, 1, 7, 8, 0, 67, 1, 3, 4]
#print(sorted(nums, reverse=True))
print(sorted(nums, key=lambda x: 1 if x == 0 else 0))

dict = {'k1':10,'k2':20,'k3':30}
print(dict[max(dict, key=lambda x: dict[x])])

装饰器Decorator

在代码运行期间动态增加功能的方式 放在运行函数的开头@

import time, functools
def log1(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print("call %s():" % func.__name__)
        return func(*args, **kw)
    return wrapper

def logtext(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print("%s %s():" % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator
def metric(fn):
    start = time.time()
    @functools.wraps(fn)
    def wrapper(*args, **kw):
        print('%s executed in %s ms' % (fn.__name__, 1000*(time.time()-start)))
        return fn(*args, **kw)
    return wrapper

@metric
def fast(x, y):
    time.sleep(0.0012)
    return x + y

@metric
def slow(x, y, z):
    time.sleep(0.1234)
    return x * y * z

f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
    print('测试失败!1')
elif s != 7986:
    print('测试失败!2')

偏函数functools.partial

#偏函数
int2 = functools.partial(int, base=2)
print(int2('101'))
print(int2('101', base=10))

标签:map,return,函数,Python,练习,print,高阶,def,name
来源: https://blog.csdn.net/weixin_43236533/article/details/123054596

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有