函数调用

Python调用C++之PYBIND11简介

夙愿已清 提交于 2020-02-25 21:52:50
简介 PyBind11是能够让C++和Python代码之间相互调用的轻量级头文件库。在这之前已经有了一个类似功能的库:Boost.Python。既然已经有了一个类似库,而且PyBind11的目的和语法都与Boost.Python相似,为什么还要重复造轮子?原因主要有以下亮点: Boost.Python为了兼容大多数C++标准和编译器,它使用了很多可以说是魔法的操作去解决问题而变得非常的臃肿; 目前很多编译器对C++11已经有很好的支持,而且C++11应用也比较广泛。 因此,PyBind11应运而生,他能在抛弃Boost.Python的负担同时又具备Boost.Python的简单操作。 使用 PyBind11的主要目的是将已有的C++代码接口暴露给Python去调用。例如, ONNX Runtime --一个用于ONNX格式的神经网络模型推理的引擎,其推理的核心模块是用C++写的,但是从易用性、Python AI 方面的主导地位等方面考虑,它需要将模型推理的接口暴露给Python。在之前的文章 ONNX Runtime 源码阅读:模型推理过程概览 中也有提到过。其接口暴露代码在$ONNX_RUNTIME/onnxruntime/python/onnxruntime_pybind_state.cc中。 将C++暴露给Python主要有两个大方向: 将函数暴露给Python;

Python的生成器和迭代器之间的区别

十年热恋 提交于 2020-02-25 21:03:43
迭代器和生成器有什么区别? 有关何时使用每种情况的一些示例会有所帮助。 #1楼 迭代器: 迭代器是使用 next() 方法获取序列的下一个值的对象。 发电机: 生成器是使用 yield 方法生成或生成值序列的函数。 生成器函数(如以下示例中的ex: foo() 函数)返回的生成器对象(如以下示例中的ex: f next() 上的每个 next() 方法调用,都会按顺序生成下一个值。 调用生成器函数时,它甚至不开始执行该函数就返回生成器对象。 首次调用 next() 方法时,该函数开始执行直到到达yield语句,该语句返回产生的值。 收益跟踪(即记住上一次执行)。 第二个 next() 调用从上一个值继续。 下面的示例演示了yield和生成器对象上的next方法的调用之间的相互作用。 >>> def foo(): ... print "begin" ... for i in range(3): ... print "before yield", i ... yield i ... print "after yield", i ... print "end" ... >>> f = foo() >>> f.next() begin before yield 0 # Control is in for loop 0 >>> f.next() after yield 0 before

C++细节注意点

痴心易碎 提交于 2020-02-25 15:44:44
文章目录 实现和声明的分离 不使用 using namespace std; C++对C语言的增强 重点1 引用 引用的注意事项 引用的本质 指针引用 常量型引用 成员函数调用const修饰对象实例 构造和析构函数实例 拷贝构造函数 拷贝构造函数的调用时机 深拷贝浅拷贝 深拷贝 初始化列表 类对象作为类成员的案例 explicit 关键字 new动态对象创建 完美代替malloc 静态成员变量 静态成员函数 单例模式 成员变量和成员属性分开处理 this指针 this指针的使用 空指针访问成员的函数 常函数和常对象 全局函数做友元函数 整个类做友元类 让成员函数做友元函数 自定义数组实例 运算符重载 二元重载 左移右移的重载的注意点 属性私有后 要使用友元来进行重载 前置后置递增运算符 指针运算符重载(自定义一个智能指针) 赋值运算符重载 [] 运算符的重载 关系运算符重载 函数调用运算符重载 不要重载||和&& 自定义string类 继承 继承方式 继承中的对象模型 继承中的构造和析构顺序 继承中同名成员的处理 继承中静态成员的处理 多继承 菱形继承 解决二义性的方法 虚继承工作原理 多态 静态编联和动态编联 多态原理解析 多态案例1 计算器 抽象类和纯虚基类 虚析构和纯虚析构函数 向上类型转换向下类型转换 游戏多态实例 模板 排序实例 普通函数和函数模板的区别 模板机制内部原理

Delphi过程函数传递参数的几种方式

心不动则不痛 提交于 2020-02-25 12:22:39
在Delphi过程、函数中传递参数几个修饰符为Const、Var、Out。另一种不加修饰符的为默认按值传递参数。 一、默认方式以值方式传递参数 procedure TForm1.ProcNormal(Value: string); begin OrigNum:=Value+' Me'; lblReturn.Caption:=OrigNum;//OrigNum为'Hello Me' lblOrig.Caption:=Value;//Value为'Hello' end; 调用: OrigNum:='Hello'; ProcNormal(OrigNum); 二、以Const方式传递参数,这个参数在调用过程中不能改变,并且这种方式会被编译器优化,一般建议尽可能地使用这种方式。 procedure TForm1.ProcConst(const Value: string); begin OrigNum:=Value+' Me'; lblReturn.Caption:=OrigNum;//为'Hello Me‘ lblOrig.Caption:=Value;//为'Hello Me' end; 三、按引用方式传递参数 procedure TForm1.ProcRef(var value: string); begin OrigNum:=Value+' Me'; lblReturn

ES6躬行记(14)——函数

梦想的初衷 提交于 2020-02-25 07:46:01
  在前面的章节中,已陆陆续续介绍了ES6为改良函数而引入的几个新特性,本章将会继续讲解ES6对函数的其余改进,包括默认参数、元属性、块级函数和箭头函数等。 一、默认参数   在ES5时代,只能在函数体中定义参数的默认值,而自从ES6引入了默认参数(Default Parameter)后,就能让参数在声明时带上它的默认值,如下代码所示,func2()函数中的参数默认值在可读性和简洁性方面更为优秀。 function func1(name) { name = name || "strick"; //ES5的参数默认值 } function func2(name = "strick") { //ES6的参数默认值 } 1)undefined   只有当不给参数传值或传入undefined时,才会使用它的默认值。即使传入和undefined一样的假值(例如false、null等),也得不到它的默认值,如下所示。 function func(name = "strick") { return name; } func(undefined); //"strick" func(false); //false func(null); //null 2)位置   默认参数既可以位于普通参数之前,也可以位于其之后。例如下面的两个函数,都包含两个参数,其中一个带有默认值,依次执行,都能得到预期的结果。

深入理解和设计递归技术的关键点的思考

馋奶兔 提交于 2020-02-25 01:11:42
如何理解递归,写出正确的递归程序,我觉得有几个关键点: 1.要从整体把握问题 递归的难点在于人脑并不适合去跟踪递归中自己调用自己的这个过程,这是因为人脑中不像计算机一样有一个可以记忆的堆栈, 但是不同的是人是会归纳的,而计算机只知道调用-返回。 因此,理解和设计递归,一定要从整体把握,数学归纳法和递归是一个对称的关系,数学归纳法不断的扩展自己,递归则是不断的分解 自己。递归中的递就是把主问题分解成子问题,归就是利用子问题的解逐步向上求解的过程了。 关键点是要善用数学归纳法里面的假设 ,就是假设子问题已经求解了,它得到的结果是什么,一旦这么想就是在从整体上把握问题,不必再去纠结细节。设计一个递归函数的时候,首先像普通函数一样设计一个算法框架,控制好程序逻辑,处理递归调用的时候假设是在调用一个其他的函数,这个函数已经设计好,你只需要知道他做什么事,然后返回什么就可以了,具体怎么做的,不需要去想,这似乎有些矛盾,因为这个函数本来就是自己,怎么不需要去想怎么做的呢?其实这就是递归难以理解的原因。所以必须先把细节放在一边,先确定好框架,然后再去处理细节。 2.关注函数的返回值是什么,如何利用子函数调用的返回值得到调用的返回值。 第一条里面设计好框架以后,然后我们就需要关注函数处理的细节了,这个细节包括流程分支,函数的返回值。 函数的返回值直接关系到函数是否正确执行

python函数默认参数为可变对象的理解

坚强是说给别人听的谎言 提交于 2020-02-25 01:10:02
python函数默认参数为可变对象的理解 1.代码在执行的过程中,遇到函数定义,初始化函数生成存储函数名,默认参数初识值,函数地址的函数对象。 2.代码执行不在初始化函数,而是直接执行函数体。 代码实例 这要从函数的特性说起,在 Python 中,函数是第一类对象(function is the first class object),换而言之,函数也是对象,跟整数、字符串一样可以赋值给变量、当做参数传递、还可以作为返回值。函数也有自己的属性,比如函数的名字、函数的默认参数列表。 # 函数的名字 >>> func.__name__   'func'   # 函数的默认参数列表 >>> func.__defaults__   ([ 1, 1, 1, 1, 1], 1) def是一条可执行语句,Python 解释器执行 def 语句时,就会在内存中就创建了一个函数对象(此时,函数里面的代码逻辑并不会执行,因为还没调用嘛),在全局命名空间,有一个函数名(变量叫 func)会指向该函数对象,记住,至始至终,不管该函数调用多少次,函数对象只有一个,就是function object,不会因为调用多次而出现多个函数对象。 函数对象生成之后,它的属性:名字和默认参数列表都将初始化完成。 初始化完成时,属性 __default__ 中的第一个默认参数 numbers 指向一个空列表。

MATLAB中调用Python及其相关库(以igraph和numpy为例)

℡╲_俬逩灬. 提交于 2020-02-24 20:26:58
MATLAB是一款数值和矩阵计算软件,兼有强大的时域系统以及电力仿真Simulink模块,这使得MATLAB在工程领域有着难以取代的地位。不过受限于面向过程的开发逻辑,较大的体积和繁琐的安装、破解流程,以及正版昂贵的特性,加之并不太活跃的官方以及社区支持,对于普通用户和数据分析用户,以及开发项目的纯程序员一直不友好,MATLAB在编程语言界的地位也一直不太高,且有逐年下降的趋势。相比之下,Python具有体积小巧,第三方库包多,社区数量多且用户活跃度高的优点,许多大学和机构都有Python的支持和开发项目。Python也由于其igraph包丰富的绘图能力而被许多视觉处理以及图论方向的学者青睐。不过Python对于矩阵和向量运算的格式要求较高,即便是数值矩阵计算模块numpy也不如Matlab灵活,运算速度也不如MATLAB快。不过这两种语言同为脚本语言,语法上也有诸多的相似,精通一种语言的人上手另一种起来还是相对较快的。 出于各种考虑,Python和MATLAB中都已经添加了对方的函数接口,可以在MATLAB脚本中直接调用Python函数,Python代码中也可以直接调用MATLAB函数和变量,其便捷程度几乎与直接在Python IDLE或是MATLAB工作区中调用一样。为了结合两种编程语言在工程领域和非工程项目领域各自的优点,学习调用对方函数的方法是很有必要的。

scala编程(八)——函数和闭包

江枫思渺然 提交于 2020-02-24 15:25:28
当程序变得庞大时,你需要一些方法把它们分割成更小的,更易管理的片段。为了分割控制流, Scala 提供了所有有经验的程序员都熟悉的方式:把代码分割成函数。实际上, Scala 提供了许多 Java 中没有的定义函数的方式。除了作为对象成员函数的方法之外,还有内嵌在函数中的函数, 函数文本和函数值。本章带你体会所有 Scala 中的这些函数的风味。 方法 定义函数最通用的方法是作为某个对象的成员。这种函数被称为方法:method。 作为例子,示例代码 展示了两个可以合作根据一个给定的文件名读文件并打印输出所有长度超过给定宽度的行的 方法。每个打印输出的行前缀它出现的文件名: object LongLines { def processFile(filename: String, width: Int) { val source = Source.fromFile(filename) for (line <- source.getLines) processLine(filename, width, line) } private def processLine(filename:String, width:Int, line:String) { if (line.length > width) println(filename+": "+line.trim) } def main

Vue生命周期钩子函数

无人久伴 提交于 2020-02-24 14:54:12
Vue生命周期钩子函数 vue 生命周期钩子函数 可以理解为 vue 实例从创建到销毁的一个个阶段,每个阶段的内部构造都是不一样的,可以在不同的阶段做相应的处理 Vue生命周期钩子函数包括: beforeCreate created beforeMount mounted beforeUpdate updated activated (keep-alive组件专属) deactivated (keep-alive组件专属) beforeDestroy destroyed errorCaptured (2.5.0+ 新增) 生命周期钩子 详情 beforeCreate 在实例初始化之后,数据观测(data observer) 之前调用该钩子,此时无法获取 data,不能使用 watch 监听,可以加入 loading 事件 created 实例已经创建完成之后调用该钩子,此时实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调 data 被初始化,可以获取 data和调用 watch 监听,但是页面还是空白,结束 loading 事件,可以进行一些数据,资源的请求 beforeMount 在挂载开始之前调用该钩子,相关的 render 函数首次被调用,完成 el 初始化,页面依然是空白 mounted el 被新创建的