lambda表达式(匿名函数表达式)

作用:创建一个匿名函数对象。同def类似,但不提供函数名。

语法:lambda [形参1,形参2,...] : 表达式

语法说明

  • lambda 只是一个表达式,它用来创建一个函数对象。
  • 当lambda表达式调用时,先执行冒号后的表达式,并返回表达式的结果的引用。
  • lambda 表达式创建的函数只能包含一条表达式。
  • lambda 表达式比函数简单,且可以随时创建和销毁,有利于减少程序的偶合度。

把lambda函数赋值给一个变量

# 定义一个加法函数,并把值赋给变量myadd,就可以执行myadd(5, 6);
myadd = lambda x, y: x+y
print myadd(5, 6) # 结果:11

把lambda函数赋值给其他函数

import time, datetime
time.sleep = lambda x: None # time 库的 sleep 函数不会执行原功能;

starttime = datetime.datetime.now()
time.sleep(3)
endtime = datetime.datetime.now()
print endtime-starttime # 结果:0:00:00

把lambda函数作为其他函数的返回值

def add(n):
return lambda x: x+n
myadd = add(5)
print myadd(15) # 结果:20 def add(x):
def inner(y):
return x+y
return inner
myadd = add(5)
print myadd(15) # 结果:20

把lambda函数做参数传给其它函数(map, filter, reduce)

# 利用map映射函数输出序列加工后的新序列。
print map(lambda x: x ** 2, range(1, 3)) # 结果:[1, 4] map返回类型:<type 'list'>
def arr(x):
return x ** 2
print map(arr, range(1, 3)) # 结果:[1, 4] map返回类型:<type 'list'> # 利用filter过滤函数输出0-9的奇数;返回False时将此数据丢弃,返回True,则保留此数据
print filter(lambda x: x % 2, range(10)) # 结果:[1, 3, 5, 7, 9] filter返回类型:<type 'list'>
def odd(x):
return x % 2
print filter(odd, range(10)) # 结果:[1, 3, 5, 7, 9] filter返回类型:<type 'list'>

eval函数和exec函数

高阶函数

一个函数可以作为参数传给另外一个函数,或者一个函数的返回值为另外一个函数(若返回值为该函数本身,则为递归),满足其一则为高阶函数。

# 参数为函数,函数bar作为foo的参数传入,函数foo()为高阶函数。
def bar():
print("in the bar..")
def foo(func):
func()
print("in the foo..")
foo(bar) # 返回值为函数,函数bar作为foo的返回值,函数foo()为高阶函数。
def bar():
print("in the bar..")
def foo(func):
print("in the foo..")
return func
res=foo(bar)
res()

注:函数名(例如bar 、foo)-->其为该函数的内存地址;函数名+括号(例如 bar()、foo() )-->调用该函数。

python内置的高阶函数:map、filter、sorted、reduce等

map函数

map函数接收的是两个参数,一个函数,一个序列,其功能是将序列中的值处理再依次返回至列表内。其返回值为一个迭代器对象。

def power(x):
return x ** 2
# map函数模拟,功能与map函数一样
def map_test(func,iter):
arr=[]
for i in iter:
ret=func(i)
arr.append(ret)
return arr.__iter__() # 将列表转为迭代器对象

# map_test函数
print list(map_test(power,range(1,6))) # 结果:[1, 4, 9, 16, 25]
# map函数
print list(map(power,range(1,6))) # 结果:[1, 4, 9, 16, 25]
print list(map(lambda x: x ** 2, range(1,6))) # 结果:[1, 4, 9, 16, 25] # map函数的参数1也可以是匿名函数、参数2也可以是字符串
print list(map_test(lambda x:x.upper(),"hello")) # 结果:['H', 'E', 'L', 'L', 'O']
print list(map(lambda x:x.upper(),"hello")) # 结果:['H', 'E', 'L', 'L', 'O'] # map函数的参数2也可以是多个可迭代对象
def power2(x, y):
return x ** y
print list(map(power2,range(1,7),range(6,0,-1))) # 结果:[1, 32, 81, 64, 25, 6]

filter函数

filter函数也是接收一个函数和一个序列的高阶函数,其主要功能是筛选过滤序列中的数据。其返回值也是迭代器对象。函数func将对iterable中的每个元素进行求值,返回False时将此数据丢弃,返回True,则保留此数据。

names=["Hello","hello","python"]
# filter函数机制,功能与filter函数一样
def filter_test(func,iter):
arr = []
for i in iter:
if func(i): # 传入的func函数其结果必须为bool值,才有意义
arr.append(i)
return arr #filter_test函数
print filter_test(lambda x:x.islower(),names) # 结果:['hello', 'python']
#filter函数
print filter(lambda x:x.islower(),names) # 结果:['hello', 'python'] def mynum(x):
return x % 2 == 0
list = filter(mynum,range(10))
print list # 结果:[0, 2, 4, 6, 8]

sorted函数

作用:将原可迭代对象的数据进行排序,生成排序后的列表
格式:sorted(iterable, key = None, reverse = False)
说明:iterable:可迭代对象。key:绑定的函数,用来提供一个排序的依据。reverse 用来设置是否降序排序。默认False,从小到大。

# 按照名字进行排序,
names = [{"score":90, 'age': 99, 'name': 'lisi'},
{"score":80, 'age': 45, 'name': 'wangwu'},
{"score":60, 'age': 42, 'name': 'ali'},
{"score":30, 'age': 67, 'name': 'zhaofang'}] def paixu(dict):
return dict["name"]
result = sorted(names,key=paixu) # 方法一
result = sorted(names,key=lambda d:d["name"]) # 方法二
# sorted函数会把names里的值一一取出来,作为key后面的排序函数的参数。

reduce函数

reduce函数也是一个参数为函数,一个为可迭代对象的高阶函数,其返回值为一个值而不是迭代器对象,故其常用与叠加、叠乘等。
reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把参数计算结果继续和序列的下一个元素做累积计算,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)。比方说对一个序列求和,就可以用reduce实现。

#reduce函数不是内置函数,而是在模块functools中的函数,故需要导入
from functools import reduce nums=[1,2,3,4,5,6]
# reduce函数的机制
def reduce_test(func,array,ini=None): #ini作为基数
if ini == None:
ret =array.pop(0)
else:
ret=ini
for i in array:
ret=func(ret,i)
return ret
# reduce_test函数,叠乘
print reduce_test(lambda x,y:x*y,nums,100) # 结果:72000
# reduce函数,叠乘
print reduce(lambda x,y:x*y,nums,100) # 结果:72000 def add(x, y):
return x + y
print reduce(add, [1, 3, 5, 7, 9]) # 结果:25
print reduce(add, [1, 3, 5, 7, 9], 10) # 结果:35 def func(x, y):
return x * y
print reduce(func, [1, 3, 5]) # 结果:15
print reduce(func, [1, 3], 5) # 结果:15
print reduce(lambda x,y:x*y,range(1,3),5) # 结果:10

https://www.cnblogs.com/littlefivebolg/category/1223800.html

Python—函数进阶篇的更多相关文章

  1. 第六篇:Python函数进阶篇

    在了解完了 Python函数基础篇之后,本篇的存在其实是为了整合知识,由于该篇的知识是否杂乱,故大家可以通过点开点连接直接进入其详细介绍,该篇主要大致的介绍一下几个知识点:  一.Python的迭代器 ...

  2. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  3. python函数进阶(函数参数、返回值、递归函数)

    函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...

  4. [python 函数学习篇]默认参数

    python函数: 默认参数: retries= 这种形式 def ask_ok(prompt, retries=, complaint='Yes or no, please!'): while Tr ...

  5. Python之函数——进阶篇

    嵌套函数 ---函数内部可以再次定义函数 ---函数若想执行,必须被调用 注意,下例中,执行结果为什么? age = 19 def func1(): print(age) def func2(): p ...

  6. Golang简单入门教程——函数进阶篇

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第八篇,我们来聊聊golang当中的函数. 我们在之前的时候已经介绍过了函数的基本用法,知道了怎么样设计或者是定义一 ...

  7. Python 面向对象 (进阶篇)

    <Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可 ...

  8. 第五篇:Python函数基础篇

    本篇介绍什么是函数.函数的特性.函数的定义.函数的调用.以及函数的参数.以及关于全局变量和局部变量的使用等等. 一.什么是函数: 函数是最基本的一种代码抽象方式,为了实现某种特定的功能而组织的带名字的 ...

  9. Python函数进阶:闭包、装饰器、生成器、协程

    返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包 ...

随机推荐

  1. HTML 有序、无序和定义列表

    无序列表 <ul> <li>咖啡</li> <li>茶</li> <li>牛奶</li> </ul> 咖 ...

  2. vue $emit $on 从子组件传递数据给父组件

    原理是: 子组件使用$emit发送数据,父组件使用$on,或者v-on绑定, 来监听子组件发送的数据. 子组件: <button @click="sendChildData" ...

  3. 2019 DevOps 必备面试题——持续集成篇

    原文地址:https://medium.com/edureka/devops-interview-questions-e91a4e6ecbf3 原文作者:Saurabh Kulshrestha 翻译君 ...

  4. USB HOST与 USB OTG的区别及工作原理

    在SmartQ 7上面,同时存在USB HOST与 USB OTG两个接口,我想问一下,这两个接口有什么区别么?我怎么认为HOST属于是多余呢? 麻烦高手解答,感激不尽!!! 转自USB HOST与 ...

  5. 渗透测试学习 二十九、kali安装,信息搜集,服务器扫描

    kali安装,信息搜集,服务器扫描 kali介绍 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证操作系统.由Offensive Security Ltd维护和资助.最先由 ...

  6. 2019 CVPR 基于GAN的ImageCaptioning论文

    1.MSCap: Multi-Style Image Captioning with Unpaired Stylized Text 生成多种风格的caption 当前的image captioning ...

  7. WPF 精修篇 窗体唯一(Single) 显示在最前

    原文:WPF 精修篇 窗体唯一(Single) 显示在最前 只运行一个窗体 并在一次点击时 显示到最前 发现用 SetForegroundWindow 并不是稳定的有效 最后使用 SetWindowP ...

  8. 【HDU4947】GCD Array(莫比乌斯反演+树状数组)

    点此看题面 大致题意: 一个长度为\(n\)的数组,实现两种操作:将满足\(gcd(i,k)=d\)的\(a_i\)加上\(v\),询问\(\sum_{i=1}^xa_i\). 对于修改操作的推式子 ...

  9. mac--“-bash: brew: command not found”,怎么解决?

    报错 “-bash: brew: command not found” 执行下面命令,安装HomeBrew ruby -e "$(curl -fsSL https://raw.githubu ...

  10. 使用OC实现单链表:创建、删除、插入、查询、遍历、反转、合并、判断相交、求成环入口

    一.概念 链表和数组都是一种线性结构,数组有序存储的,链表是无序存储的. 数组中的每一个元素地址是递增或者递减的关系,链表的每一个节点的地址没有此规律,它们是通过指针的指向连接起来. 链表种类:单链表 ...