Python—函数进阶篇
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—函数进阶篇的更多相关文章
- 第六篇:Python函数进阶篇
在了解完了 Python函数基础篇之后,本篇的存在其实是为了整合知识,由于该篇的知识是否杂乱,故大家可以通过点开点连接直接进入其详细介绍,该篇主要大致的介绍一下几个知识点: 一.Python的迭代器 ...
- Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)
Python开发[第七篇]:面向对象 详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)> ...
- python函数进阶(函数参数、返回值、递归函数)
函数进阶 目标 函数参数和返回值的作用 函数的返回值 进阶 函数的参数 进阶 递归函数 01. 函数参数和返回值的作用 函数根据 有没有参数 以及 有没有返回值,可以 相互组合,一共有 4 种 组合形 ...
- [python 函数学习篇]默认参数
python函数: 默认参数: retries= 这种形式 def ask_ok(prompt, retries=, complaint='Yes or no, please!'): while Tr ...
- Python之函数——进阶篇
嵌套函数 ---函数内部可以再次定义函数 ---函数若想执行,必须被调用 注意,下例中,执行结果为什么? age = 19 def func1(): print(age) def func2(): p ...
- Golang简单入门教程——函数进阶篇
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第八篇,我们来聊聊golang当中的函数. 我们在之前的时候已经介绍过了函数的基本用法,知道了怎么样设计或者是定义一 ...
- Python 面向对象 (进阶篇)
<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可 ...
- 第五篇:Python函数基础篇
本篇介绍什么是函数.函数的特性.函数的定义.函数的调用.以及函数的参数.以及关于全局变量和局部变量的使用等等. 一.什么是函数: 函数是最基本的一种代码抽象方式,为了实现某种特定的功能而组织的带名字的 ...
- Python函数进阶:闭包、装饰器、生成器、协程
返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包 ...
随机推荐
- 使用VSCode创建一个Vue项目
vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的. 安装vue-cli之前,需要先安装了vue和webpack · node -v //(版本低引起:bas ...
- python Djanjo csrf说明与配置
Django csrf CSRF 全称(Cross Site Request Forgery)跨站请求伪造.也被称为One Click Attack和Session Riding,通常缩写为CSR ...
- RDMA 相关 简要摘录
RDMA (Remote Direct Memory Access) 全称为 远程直接内存访问 其出现的目的:为了解决网络传输中服务端数据处理的延迟而产生的.其将数据直接从一台计算机的内存传输到另一台 ...
- acwing 76. 和为S的连续正数序列
地址 https://www.acwing.com/problem/content/description/72/ 输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数). 例如输入15,由 ...
- golang+vscode开发环境的搭建
一.windows下安装golang开发环境 (1)配置GOROOT变量,在系统变量中点击新建,变量值是golang安装文件夹目录 (2)配置Path变量,选中Path点编辑即可,在变量值后面追加;% ...
- plsql查询数据显示为乱码解决方案
1.首先安装plsql之后连接数据库,发现使用sql查询出来的中文数据是??,即乱码.原因,因为数据库的编码与本地的编码不一致,plsql默认加载的是本机win10的编码. 2.解决办法: 参数如下: ...
- Educational Codeforces Round 76 (Rated for Div. 2) E. The Contest dp
E. The Contest A team of three programmers is going to play a contest. The contest consists of
- Python程序中的线程操作-线程队列
目录 一.线程队列 二.先进先出 三.后进先出 四.存储数据时可设置优先级的队列 4.1 优先级队列 4.2 更多方法说明 一.线程队列 queue队列:使用import queue,用法与进程Que ...
- Sql Server 判断表是否存在方法总结
#使用场景: 1.在创建表之前,需要先判断该表是否已经存在: 2.在删除表之前,需要先判断该表是否已经存在: #方法总结: 1.判断实体表是否存在的方法: 1).方法一: * from sysObje ...
- 08-蓝图&单元测试
学习目标 能够使用代码实现蓝图对项目进行模块化 能够说出断言的作用 能够说出实现单元测试步骤 能够说出单元测试所执行方法的定义规则 Blueprint(蓝图) 随着flask程序越来越复杂,我们需要对 ...