目录

  • Lambda表达式
  • map函数
  • filter函数
  • reduce函数
  • 三大推导式
    • 列表推导式
    • 集合推导式
    • 字典推导式
  • 闭包
  • 装饰器、语法糖、注解

Lambda表达式

Lambda表达式又被称之为匿名函数
格式
lambda 参数列表:函数体

def add(x,y): return x+y
print(add(3,4))
#上面的函数可以写成Lambda函数
add_lambda=lambda x,y:x+y
add_lambda(3,4)

map函数

函数就是有输入和输出,map的输入和输出对应关系如下图所示:

就是要把一个可迭代的对象按某个规则映射到新的对象上。
因此map函数要有两个参数,一个是映射规则,一个是可迭代对象。

list1=[1,2,3,4,5]
r=map(lambda x:x+x,list)
print(list1(r))

结果:[2,4,6,8,10]

m1=map(lambda x,y:x*x+y,[1,2,3,4,5],[1,2,3,4,5])
print(list(ml))

结果:[2,6,12,20,30]

filter函数

filter的输入和输出对应关系如下图所示(中间多了过滤条件):

def is_not_none(s): return s and len(s.strip())>0
list2=['','','hello','xxxx', None,'ai']
result=filter(is_not_none, list2)
print(list(result))

结果:[‘hello’,‘xxxx’,‘ai’]

reduce函数

from functools import reduce
f=lambda x,y:x+y x=reduce(f,[1,2,3,4,5])
print(r)

结果:15=1+2+3+4+5
相当于每一次计算都是基于前一次计算的结果:

还可以为reduce计算添加初始值:

from functools import reduce
f=lambda x,y:x+y x=reduce(f,[1,2,3,4,5],10)
print(r)

结果:25=10+1+2+3+4+5

三大推导式

列表推导式

list1=[1,2,3,4,5,6]
f=map(lambda x:x+x,list1)
print(list(f))
list2=[i+i for i in list1]
print(list2)
list3=[i**3 for i in list1]
print(list3)
#筛选列表的例子
list4=[i*4 for i in list1 if i>3]
print(list4)
#结果
[2,4,6,8,10,12]
[2,4,6,8,10,12]
[1,8,27,64,125,216]
[16,25,36]

集合推导式

直接把上面代码copy下来,然后把列表改成集合

list1={1,2,3,4,5,6}list2={i+i for i in list1}
print(list2)
list3={i**3 for i in list1}
print(list3)
#筛选列表的例子
list4={i*4 for i in list1 if i>3}
print(list4)
#结果{2, 4, 6, 8, 10, 12}
{64, 1, 8, 216, 27, 125}#这里是乱序的
{16, 24, 20}

字典推导式

s={"zhangsan":20,
"lisi":15,
"wangwu":31
}
#拿出所有的key,并变成列表
s_key=[ key for key, value in s.items()]
print(s_key)
#结果
['zhangsan','lisi','wangwu']# 交换key和value位置,注意冒号的位置
s1={ value: key for key, value in s.items()}
print(s1)
#结果
{20:'zhangsan',15:'1isi',31:'wangwu'}s2={ key: value for key, value in s.items() if key=="1isi"}
print(s2)
#结果
{"lisi":15}

闭包

闭包:一个返回值是函数的函数

import time
def runtime(): def now_time(): print(time.time())return now_time #返回值是函数名字
f=runtime()#f就被赋值为一个函数now_time()了
f()#运行f相当于运行now_time()

再来看一个带参数的例子:
假设有一个csv文件,内容有三行,具体如下:
a,b,c,d,e
1,2,3,4,5
6,7,8,9,10

def make_filter(keep):# keep=8def the_filter(file_name): file=open(file name)#打开文件lines=file.readlines()#按行读取文件file.close()#关闭文件filter_doc=[i for i in lines if keep in i]#过滤文件内容return filter_doc return the_filterfilter1=make_filter("8")#这一行调用了make_filter函数,且把8做为参数传给了keep,接受了the_filter函数作为返回值
#这里的filter1等于函数the_filter
filter_result=filter1("data.csv")#把文件名data.csv作为参数传给了函数the_filter
print(filter_result)
#结果
['6,7,8,9,10']

装饰器、语法糖、注解

# 这是获取函数开始运行时间的函数
import time
def runtime(func): def get_time(): print(time.time())func()# run被调用 return get_time
@runtime
def run()print('student run')#运行
run()#结果
当前时间
student run

由于有装饰器@runtime的存在,会把run这个函数作为参数丢到runtime(func)里面去,如果调整打印时间代码的位置会有不同结果:

# 这是获取函数结束运行时间的函数
import time
def runtime(func): def get_time(): func()# run被调用   print(time.time())      return get_time
@runtime
def run()print('student run')#运行
run()#结果
student run
当前时间

这里还要注意,这里还用到了闭包的概念,在运行run函数的时候,调用的实际上是get_time函数。

对于多个参数的函数如何调用,看下面例子

#有一个参数
import time
def runtime(func): def get_time(i): func(i)# run被调用 print(time.time())      return get_time
@runtime
def run(i)print('student run')
#运行
run(1)
#有两个参数
import time
def runtime(func): def get_time(i,j): func(i,j)# run被调用 print(time.time())      return get_time
@runtime
def run(i,j)print('student run')
#运行
run(1,2)

可以发现,这样写对于函数的多态不是很好,因此可以写为:

#自动适配参数
import time
def runtime(func): def get_time(*arg): func(*arg)# run被调用   print(time.time())      return get_time
@runtime
def run(i)print('student1 run')@runtime
def run(i,j)print('student2 run')
#运行
run(1)
run(1,2)

再次进行扩展,更为普适的写法,可以解决传入类似i=4的关键字参数写法:

#自动适配参数
import time
def runtime(func): def get_time(*arg,**kwarg): func(*arg,**kwarg)# run被调用   print(time.time())      return get_time
@runtime
def run(i)print('student1 run')@runtime
def run(*arg,**kwarg)print('student2 run')@runtime
def run()print('no param run')
#运行
run(1)
run(1,2,j=4)
run()

番外.1.Python高级用法相关推荐

  1. Python高级用法总结

    Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...

  2. python高级用法技巧-Python高级用法总结

    列表推导(list comprehensions) 场景1:将一个三维列表中所有一维数据为a的元素合并,组成新的二维列表. 最简单的方法:新建列表,遍历原三维列表,判断一维数据是否为a,若为a,则将该 ...

  3. 番外3. Python OpenCV 中如何绘制各种图形?

    本系列专栏写作方式 本系列专栏写作将采用首创的问答式写作形式,快速让你学习到 OpenCV 的初级.中级.高级知识. 3. Python OpenCV 中如何绘制各种图形? 本篇博客主要分享一下在 P ...

  4. 【Python100天学习笔记】番外篇 Python面试面经、笔试题目汇总

    Python面试题汇总 说明:下面的内容源于GitHub上名为interview_python的项目,对其内容进行了修订和补充. 文章目录 Python面试题汇总 Python语言特性 1 Pytho ...

  5. python应用实例论文_番外篇——Python多进程应用实例一则

    前言: 现在的电脑普遍进入多核时代,当我们需要做一些计算密集型任务时,运用并行计算能够发挥CPU的性能,也够大大的节省我们的时间.在现在的数据挖掘中,Python是一门非常强大的语言,语法直接明了,易 ...

  6. 用python内置函数算复杂度吗_番外篇: Python 面试感受

    醒来有人说我刁难面试者, 我来解释一下, 我的面试环节一般是最后一个环节才会进行 python 基础的面试. 之前都是项目交流, 进入到最后这个环节的, 都是我认为项目 OK 的, 我对他的能力也是认 ...

  7. python 按键精灵 离线_(番外篇)Python操纵网盘客户端批量离线下载电影

    上回(Python实现电影排行榜自动网盘下载(4)Cookies免登录+抓包下载)说到,一段时间内能进行多少次离线下载还是受限于验证码的输入. 在此有两个解决方案, 见招拆招 通过GUI优化验证码输入 ...

  8. python高级用法之命名元组namedtuple

    tuple类型数据的获取: 大家都知道,元组里面的数据获取只能通过下标的方式去获取, 比如 : a = ('username', 'age', 'phone') 要获取username的话 ,就需要用 ...

  9. 关于多线程的那点事之番外篇 -Python

    上一篇:关于多线程的那点事 -Python 哈喽各位小伙伴,很快啊,小泽马上就又更新了,速度简直不要太快! 上回咱们不是说了怎么开多线程嘛,那同样的,还有一个问题: 公司已经下班了,但是员工还在努力工 ...

最新文章

  1. 拥抱开源 加入分享 贡献小力量
  2. Daily Storm - 31/10/12
  3. 微课竞赛系统的设计与实现所需工作条件_工作室文化建设展示(3)
  4. C++:读写二进制文件到double数组,根据二进制数据量进行读取
  5. 面试前,我们要复习多少Redis知识点?
  6. springboot 返回字符串带引号_SpringBoot-基础
  7. 更换ubuntu的root的默认python版本
  8. 计算机信息导论论文,电子信息导论论文2000字
  9. Scratc3.0作品转化成exe文件
  10. 搭建wordpress开发环境
  11. LeetCode 995. K 连续位的最小翻转次数(差分思想)
  12. 蚂蚁金服入职考试_程序员入职蚂蚁金服被质疑,网友评论人生污点,不把外包当人?...
  13. 散列函数之双重散列算法解决冲突问题
  14. 如何从业务代码中抽离出可复用的微组件
  15. 过滤字符串 和 select选择后控件值变更
  16. Day-22 基础模块3 正则表达式_re模块
  17. postgresql树形结构查询
  18. 流程判断-三目运算-for循环
  19. 寂静之城zz from woft.net [小百合海外站]
  20. “No input file specified “问题的处理

热门文章

  1. 交换机原理和IP地址
  2. [转]为什么我们做分布式要用redis?
  3. 微软CRM锁定9大垂直产业
  4. 谷歌浏览器 input 默认填充问题
  5. 桌游狼人杀、警匪游戏、双身份杀人游戏(狼人杀2.0升级版)最全、最详细规则、攻略
  6. Petalinux踩坑记录-ZCU106开发板
  7. 2020年了,C++的就业方向该怎么走?
  8. 微信拉低我们的智商?
  9. 【量化交易】股票价格前复权与后复权的区别以及注意事项
  10. 一个数据分析师的自我修养