python高级函数
1 函数
1.1 函数即变量
函数定义:把一个函数体作为变量赋值给一个函数名,同时函数体存放到内存中。
函数调用:根据函数名去内存中寻找对用的函数体,找到了就执行。
>>> def bar(): ... pass ... >>> bar <function bar at 0x006BE930> #只写函数名,打印了对应函数体的内存地址。bar()加括号,表示调用。
1.2 高阶函数
把函数名作为变量实参传给另一个函数
def bar(func): print(func) func() def foo(): print('in foo') bar(foo) >>> <function foo at 0x004BB6F0> in foo #调用bar函数,将foo函数名传参,打印foo的内存地址,然后执行foo函数。
函数返回值为函数
def bar(func): start = time.time() func() stop = time.time() print('cost time %f s' %(stop-start)) return func def foo(): print('in foo') time.sleep(3) foo = bar(foo) foo() #首先运行bar(foo),在bar函数体内调用foo,然后返回foo的内存地址,赋值给foo,再运行foo。
1.3 嵌套函数
在一个函数内再次声明一个def func()
def timer(func): def bar(): start = time.time() func() stop = time.time() print('cost time %f s' %(stop-start)) return bar def foo1(): print('in foo1') time.sleep(3) def foo2(): print('in foo2') time.sleep(3) foo1=timer(foo1) foo2=timer(foo2) foo1() foo2() #bar函数里会调用传入原函数,然后bar的内存地址会赋值给原函数名。 #foo1=timer(foo1)这一步就相当于在函数前写@timer
2 装饰器
装饰器本质是函数,用于装饰其他函数,为其他函数添加功能。
特点是不需要修改原函数代码和调用方式。就是说,对原函数,无法感知装饰器的存在,依旧按照自己的逻辑运行。
def timer(func): def bar(): start = time.time() func() stop = time.time() print('cost time %f s' %(stop-start)) return bar @timer def foo1(): print('in foo1') time.sleep(3) @timer def foo2(): print('in foo2') time.sleep(3) foo1() foo2()
以上为原函数没有参数时可用,而原函数有多少参数是未知的,所以在装饰函数的嵌套函数bar里需要填非固定参数*args,**kwargs。
def timer(func): def bar(*args,**kwargs): start = time.time() func(*args,**kwargs) stop = time.time() print('cost time %f s' %(stop-start)) return bar @timer def foo1(arg): print('in %s' %(arg)) time.sleep(3) @timer def foo2(arg): print('in %s' %(arg)) time.sleep(3) foo1('foo1') foo2('foo2')
python高级函数的更多相关文章
- Python—高级函数
Python-高级函数 一.闭包 Python函数是支持嵌套的.如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包.闭包需要满足如下3个条件: 存在于两个嵌 ...
- python 高级函数
高级函数 map 格式:map(func, lt) 说明:接受两个参数,一个函数和一个可迭代对象,返回一个生成器,将func依次作用于lt 示例: l = [1,2,3,4,5]def double ...
- Python高级函数--map/reduce
名字开头大写 后面小写:练习: def normalize(name): return name[0].upper() + name[1:].lower() L1 = ['adam', 'LISA', ...
- Python高级函数--filter
def is_palindrome(n): return str(n) == str(n)[::-1] #前两个‘:’表示整个范围,‘-’表示从后面,‘1’表示数据间隔 output = filter ...
- python高级之函数
python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没有函数的话,那么将会出现很多 ...
- 第一篇:python高级之函数
python高级之函数 python高级之函数 本节内容 函数的介绍 函数的创建 函数参数及返回值 LEGB作用域 特殊函数 函数式编程 1.函数的介绍 为什么要有函数?因为在平时写代码时,如果没 ...
- Python函数式编程(一):高级函数
首先有一个高级函数的知识. 一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数. def add(x, y, f): return f(x) + f(y) 当我们调用add(-, , abs ...
- Day11 Python基础之装饰器(高级函数)(九)
在python中,装饰器.生成器和迭代器是特别重要的高级函数 https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...
- python高级特性和高阶函数
python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...
随机推荐
- quilt - 制作patch的工具
quilt - 制作patch的工具 在尝试为openwrt做一个patch时,查到这个工具.openwrt官方已经有很详细的文档对步骤进行说明了. quilt并不是专为openwrt的开发工具.qu ...
- Arcgis Engine(ae)接口详解(2):featureClass查询
//属性查询~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //IQueryFilter代表查询条件,QueryFilterClass代表只限于属性查询(就是没有空间查询) ...
- Seesion和Cookie详解2
转载来自: https://www.toutiao.com/a6693986851193094664/?tt_from=weixin&utm_campaign=client_share& ...
- (转)OutOfMemory时抓取heap 快照
转自:https://testerhome.com/topics/579 首先说一下,在程序没有崩溃的时候如何抓取heap快照.这个大家应该都知道,在ddms中自带此功能. 见上图首先我们选中一个 ...
- LeetCode(38)题解: Count and Say
https://leetcode.com/problems/count-and-say/ 题目: The count-and-say sequence is the sequence of integ ...
- jvm 命令
jps jps主要用来输出JVM中运行的进程状态信息.语法格式如下: jps [options] [hostid] 如果不指定hostid就默认为当前主机或服务器. -q 不输出类名.Jar名和传入 ...
- 使用Apache Ant合并多个jar
Apache Ant下载地址 下载解压后进入bin目录,并在此目录打开cmd 在cmd中运行ant,运行结果为: Buildfile: build.xml does not exist! Build ...
- 使用std::mutex取代QMutex
为了保证对某个资源的操作是原子性的(对资源读写时,只有当前的操作结束,才允许另外线程对其操作,这里有个理解误区,资源操作原子性不是说,当前某个线程获得了某个资源使用权,然后线程执行时间完毕,要切换线程 ...
- hihoCoder 1584 Bounce 【数学规律】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)
#1584 : Bounce 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 For Argo, it is very interesting watching a cir ...
- vue-router-h5-history
vue-router的HTML5 History 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面. const router = new V ...