修饰器

  之前我一直有一个疑惑,就是修饰器里面对函数的操作为什么不能直接写进函数里面就好了吗?何必这么麻烦呢,当我进一步理解之后,原来修饰器的作用就是完成那些不能写进函数里面的功能的,好比必须要等到函数完成后的一些操作一样,(那么函数完成之前的工作怎么办呢?)

  之前的学习笔记:https://www.cnblogs.com/Gaoqiking/p/10470407.html

使用高阶函数不要忘记

from functools import map

  

map/reduce

  能够将函数的参数一下传进去,他能按顺序每次调用几个去自动执行完所有的,使用map记得在函数和iterable中加逗号

  map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

  reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算

  注意:

  reduce( )中的序列不能为空

from functools import reduce
def product(x, *y):
return x * reduce(lambda a,b:a*b,y) product(5)
#报错
Traceback (most recent call last):
File "C:\Users\ADMINI~1.SC-\AppData\Local\Temp\learn_python_w11zu113_py\test_7.py", line 8, in <module>
print('product(5) =', product(5))
File "C:\Users\ADMINI~1.SC-\AppData\Local\Temp\learn_python_w11zu113_py\test_7.py", line 5, in product
return x * reduce(lambda a,b:a*b,y)
TypeError: reduce() of empty sequence with no initial value
#正确的
from functools import reduce
def product(x, *y):
if len(y)==0:
return x
else:
return x * reduce(lambda a,b:a*b,y) #结果
5

  

 

  参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317852443934a86aa5bb5ea47fbbd5f35282b331335000

过滤器filter

  参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431821084171d2e0f22e7cc24305ae03aa0214d0ef29000

  用于过滤序列,接受一个函数和一个序列,通过判断函数的返回值是False或者True来判断是否保留元素,把所有保留的元素作为一个新序列返回

  作者举得例子当中,

def not_empty(s):
return s and s.strip()#我开始觉得可以直接返回s.strip(),后来发现这样不能处理None,然后我不知道这个s and s.strip()是什么意思 list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 结果: ['A', 'B', 'C'] #如果其中有None、或者空’‘ 就返回None或者’‘
>>> None and ''
>>> None and ' a'
>>> '' and 'a'
''
#其他就返回后面的那个
>>> 'a' and 'b'
'b'
>>> 'b' and 'a'
'a'
>>>

  用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。

  注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list。

  最后作者介绍了一个使用埃式算法实现构建素数列表的一个例子

def _odd_iter():
n=3
while True:
n+=2
yield n def _not_divisable(n):
return lambda x:x%n>0#关于这一行代码,返回的是一个函数对象,
def prime():
yield 2
it=_odd_iter()
while True:
n=next(it)
yield n
it=filter(_not_divisable(n),it)#这里的_not_divistable(n)实际是lambda x:x%n>0,虽然filter会把序列中的元素依次的传递给前面的函数,但是这个由lambda语句组成的函数对象只在filter执行的第一次时候被创建,然后后面的序列中的元素传给了x,即n并不会变
     #看到这里为什么不把_not_divisable(n) 直接换为lambda x:x%n>0呢,因为这样就固定不了n的值了
for i in prime():
if i<1000:
print(i)
else:
break
#输出
会输出1000内的素数

  

  

排序sorted()

  参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318230588782cac105d0d8a40c6b450a232748dc854000

  可以对字符串和数字排序

sorted(iterable, /, *, key=None, reverse=False)
Return a new list containing all items from the iterable in ascending order. A custom key function can be supplied to customize the sort order, and the
reverse flag can be set to request the result in descending order. key关键字指定一个函数,可以实现自定义的排序,详细过程是通过让每个元素都经过该函数的处理,形成一个新的副本,对这个副本进行排序,然后返回这个副本的排序结果中每个元素的原来值。
key=abs#按绝对值大小排序
key=str.lower#忽略大小写

  sorted()也是一个高阶函数。用sorted()排序的关键在于实现一个映射函数。

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
def by_name(t):
return t[0][0].lower()#注意是这样写的
def by_score(t):
return t[0][1] L2 = sorted(L, key=by_name)#按名字排序
print(L2)
#输出
[('Adam', 92), ('Bob', 75), ('Bart', 66), ('Lisa', 88)]

  

偏函数

  参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143184474383175eeea92a8b0439fab7b392a8a32f8fa000

  能不能让自定义的函数使用这个特性呢?想着是应该可以的吧

  偏函数的作用就是把函数的一些参数(这个函数的返回值是一个函数,可以理解为用它来选择函数)给固定起来,或者说是可以在以后使用的时候传递其他值,而且使用非常方便

#使用int做N进制转换
>>> int('12345', base=8)
5349
#用下面这个例子引入偏函数
#我们要是自定义一个可以让int()中的base变成可以接受我们传入的进制的话是要这样
def int2(x, base_mark=2):***********************************************这里可以是base,也可以是basee
return int(x, base_mark)
>>> int2('1000000')
64
#使用python中提供的偏函数的话就可以将代码简化为这样
>>> import functools
>>> int2 = functools.partial(int, base=2)#只需要一行代码***********************************************这里必须是base,不可以是basee
>>> int2('1000000') 64

  也可以在调用时传入其他值

  注意,构建偏函数时固定的参数如果是关键字参数,必须要使用原来的关键字,比如上面的base在定义的时候,即关键字要符合原来的函数

>>> int2('1000000', base=10)
1000000

  当函数的参数个数太多,需要简化时,使用 functools.partial 可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

 

python 高阶函数 与关键字参数的更多相关文章

  1. 用一个简单的例子来理解python高阶函数

    ============================ 用一个简单的例子来理解python高阶函数 ============================ 最近在用mailx发送邮件, 写法大致如 ...

  2. Python高阶函数_map/reduce/filter函数

    本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...

  3. Python高阶函数及函数柯里化

    1 Python高阶函数 接收函数为参数,或者把函数作为结果返回的函数为高阶函数. 1.1 自定义sort函数 要求:仿照内建函数sorted,自行实现一个sort函数.内建函数sorted函数是返回 ...

  4. python——高阶函数:高阶函数

    python高阶函数 00初识高阶函数 一等公民 函数在python中是一等公民(First-Class Object),同样和变量一样,函数也是对象,只不过是可调用的对象,所以函数也可以作为一个普通 ...

  5. python高阶函数的使用

    目录 python高阶函数的使用 1.map 2.reduce 3.filter 4.sorted 5.小结 python高阶函数的使用 1.map Python内建了map()函数,map()函数接 ...

  6. python 高阶函数之filter

    前文说到python高阶函数之map,相信大家对python中的高阶函数有所了解,此次继续分享python中的另一个高阶函数filter. 先看一下filter() 函数签名 >>> ...

  7. Python: 高阶函数与lambda表达式

    缘由: python语法简单一看就会,但用在实处,想因为少于实战,总感觉有些捉襟. 翻阅跟踪youtube_dl源码,看到filter()函数用法,及其中lambda表达式,感觉好有意思,就补下课,记 ...

  8. Python高阶函数:map、reduece、filter

    笔记中函数简介: map函数:遍历序列,对序列中每个元素进行操作,最终获取新的序列. reduce函数:对于序列内所有元素进行累计操作. filter函数:对于序列中的元素进行筛选,最终获取符合条件的 ...

  9. python 高阶函数和匿名函数

    #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/11/02 22:46 # @Author : lijunjiang # @Fi ...

随机推荐

  1. P1776 宝物筛选_NOI导刊2010提高(02)(背包的二进制优化)

    题目描述 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物……这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝物.看来小FF只能含泪 ...

  2. STL数组和com数组相互转换的做法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 STL的泛型数组是vetor,com的泛型数组类型是VARIANT.二者怎样能相互转化呢?就是说怎么把一个vector ...

  3. SpringBoot学习笔记(12)----SpringBoot实现多个 账号轮询发送邮件

    首先,引入发送邮件的依赖,由于freemarker自定义模板,所以也需要把freemarker的依赖引入 pom.xml文件 <dependency> <groupId>org ...

  4. 搭健MyBatis开发环境

    相关文献资料地址:http://www.mybatis.org/mybatis-3/zh/getting-started.html 关于如何创建一个项目,添加Tomcat运行环境和生成`web.xml ...

  5. 路飞学城Python-Day13

    [2.常用模块-模块的种类和导入方法] 1.什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长.越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分 ...

  6. 如何使用 Open Live Writer 插入原图

    博客园的指南里写了使用 Open Live Writer 插入原图.去掉阴影并设置为默认设置的步骤,但是我还是找了好久,最后通过别的文章加上摸索才知道了如何设置为原图.这里给出详细地图片: 首先,插入 ...

  7. ueditor 编辑器,自定义图片上传

    <div> <h1>完整demo</h1> <form method="post" name="form"> & ...

  8. Vue中路由的使用

    在Vue中动态挂载组件 首先需要安装  cnpm install vue-router --save 在main.js中引入VueRouter 并使用 定义一个路由 创建router实例 通过rout ...

  9. HDU-4370 '0 or 1' 最短路 要考虑连通性

    题目链接:https://cn.vjudge.net/problem/HDU-4370 题意 给一个矩阵C(nn),要我们找到一个矩阵X(nn),满足以下条件: X_{12}+X_{13}+...X_ ...

  10. BZOJ 2565 最长双回文串(回文自动机)

    题意 给一个长度为N的字符串S.对于一个字符串AB,如果A和B都是回文串,那么称AB是一个双回文串.求问S最长双回文子串的长度?N <= 100000 题解 正反双向构造回文自动机,得到某一个点 ...