Python 函数相关概念
高阶函数
- 数学概念 y=g(f(x))
- 在数学和计算机科学中,高阶函数应当至少满足下面一个条件的函数
条件1. 接受一个或多个函数作为参数
条件2. 输出一个函数
举例:
def counter(base):
def inc(step=1):
nonlocal base #修改外部变量base,赋值需要nonlocal
base += step
return base
return inc foo = counter(5)
foo1 = counter(5) print(foo == foo1) #False print(id(foo),foo)
print(id(foo1),foo1)
柯里化
- 指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数
- z = f(x,y) 转换成 z = f(x)(y)的形式
举例:
有这样一个add函数
def add(x,y): #柯里化成 add(x)(y) 的格式
return x + y
将此函数柯里化
def add(x):
def _add(y):
return x + y
return _add foo = add(7) #等同于 add(7)(8)
print(foo(8))
闭包
- 函数中用到了外层变量就形成了闭包,如果想对外层变量修改,可以使用 global 或者 nonlocal 声明。
自由变量
- 对闭包来说外层变量就是自由变量,不在本地作用域的变量。
生成器
- 惰性求值,使用yield关键字可以构造一个生成器函数,调用这个函数就得到一个生成器对象。
- 使用next函数多次执行。
- 简单理解就是需要的时候才求值。
- 下面的例子是模拟一个无限增长的user_id号:
def increasing():
id = 0
while True:
id += 1
yield id user_id = increasing() for _ in range(10):
print(next(user_id))
装饰器(无参)
- 装饰器本身是一个函数
- 需要一个函数作为它的形参
- 返回值也是一个函数
- 可以使用@functionname 方式,简化调用,语法糖
- 也是高阶函数,两个条件都满足,但装饰器是对传入函数的功能的装饰(功能增强)
举例:
def logger(fn):
def _logger(*args,**kwargs):
print('before')
ret = fn(*args,**kwargs)
print('after')
return ret
return _logger @logger # add = logger(add)
def add(x,y):
return x + y print(add(5,600))
带参装饰器:
- 装饰器返回的是内层函数的引用
举例:
import functools
import datetime
import time def copy_property(src):
def _copy_property(dst):
dst.__name__ = src.__name__
dst.__doc__ = src.__doc__
#dst.__qualname__ = src.__qualname__ #限定名
return dst
return _copy_property def timeoutTip(t):
def logger(func):
#@functools.wraps(func)
@copy_property(func)
def wrapper(*args, **kwargs):
'''test2'''
# before 功能增强
start = datetime.datetime.now()
# print('Call:{}() StartTime:{} nowDescription:{}'.format(func.__name__,start,func.__doc__),end='\t\t')
print('Call:{}()'.format(func.__name__), end='\t\t')
ret = func(*args,**kwargs)
# after 功能增强
stopTime = (datetime.datetime.now() - start).total_seconds() if stopTime > t:
print('Timeout time:{} '.format(stopTime))
return ret # copy_property(func, wrapper)
return wrapper
return logger @timeoutTip(2) #带参装饰器与不带参装饰器的区别
def add(x,y):
'''test1'''
#time.sleep(3)
print('returnValue = x+y')
return x+y print(add(100,y=200))
print(add.__doc__,add.__qualname__)
Python 函数相关概念的更多相关文章
- 悉数 Python 函数传参的语法糖
TIOBE排行榜是程序开发语言的流行使用程度的有效指标,对世界范围内开发语言的走势具有重要参考意义.随着数据挖掘.机器学习和人工智能相关概念的风行,Python一举收获2018年年度语言,这也是Pyt ...
- python 函数之day3
一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...
- Python函数作用域的查找顺序
函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...
- Python函数讲解
Python函数
- Python函数信息
Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...
- Python函数参数默认值的陷阱和原理深究"
本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- Python开发【第四章】:Python函数剖析
一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...
- Python函数解析
对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...
- Python入门笔记(18):Python函数(1):基础部分
一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...
随机推荐
- springboot自定义配置源
概述 我们知道,在Spring boot中可以通过xml或者@ImportResource 来引入自己的配置文件,但是这里有个限制,必须是本地,而且格式只能是 properties(或者 yaml). ...
- 【JDK1.8】Java 8源码阅读汇总
一.前言 万丈高楼平地起,相信要想学好java,仅仅掌握基础的语法是远远不够的,从今天起,笔者将和园友们一起阅读jdk1.8的源码,并将阅读重点放在常见的诸如collection集合以及concu ...
- Mongodb的mongostat命令
Mongodb的mongostat命令可实时(1秒钟刷新一次)显示Mongodb数据库的运行情况,可视为性能监视器. 1.启动命令:authenticationDatabase表示用户认证证书所在的数 ...
- 【UML 建模】类图介绍
1.类图是面向对象系统建模中最常用和最重要的图,是定义其它图的基础.类图主要是用来显示系统中的类.接口以及它们之间的静态结构和关系的一种静态模型. 2.类的关系有泛化(Generalization). ...
- 符合语言习惯的Python优雅编程技巧
Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净.整洁.一目了然.要写出 Pythonic(优雅的.地道的.整洁的)代码,需要多看多学大牛们写的代码,github 上有很多非常优秀 ...
- base64减少图片请求
1. 使用base64减少 a) 2. 页面解析 CSS 生成的 CSSOM 时间增加 Base64 跟 CSS 混在一起,大大增加了浏览器需要解析CSS树的耗时.其实解析CSS ...
- MySQL复制之实践篇
本文主要以"一个主库,两个备库"代表"一个主库,多个备库"的拓扑结构来展示MySQL复制的实践过程. 拓扑结构: 主库创建复制账号: grant replica ...
- JavaScript判断变量数据类型
一.JS中的数据类型 1.数值型(Number):包括整数.浮点数. 2.布尔型(Boolean) 3.字符串型(String) 4.对象(Object) 5.数组(Array) 6.空值(Null) ...
- Linux中包管理与定时任务
第1章 软件查询 1.1 查询软件是否安装 rpm -qa |grep cron 查询是否安装了这个软件. [root@znix ~]# rpm -qa |grep cron crontabs-1.1 ...
- c++学习笔记---06--- 函数的重载
函数的重载 函数的重载 C++ 里的函数重载(overloading)机制比我们此前见到的东西都高深,这种语言的灵活性和强大功能在它身上体现得淋漓尽致. 所谓函数重载的实质就是用同样的名字再定义一个有 ...