点击进入项目 这一次我们尝试一下略微复杂的c程序. 一.C程序 头文件: #ifndef __SAMPLE_H__ #define __SAMPLE_H__ #include <math.h> #ifdef __cplusplus extern "C" { #endif int gcd(int x, int y); int in_mandel(double x0, double y0, int n); int divide(int a, int b, int *remain…
一.动态库文件生成 源文件hello.c #include "hello.h" #include <stdio.h> void hello(const char *name) { printf("Hello %s!\n", name); } int factorial(int n) { if (n < 2) return 1; return factorial(n - 1) * n; } /* Compute the greatest common…
github地址 使用Cython导入库的话,需要一下几个文件: .c:C函数源码 .h:C函数头 .pxd:Cython函数头 .pyx:包装函数 setup.py:python 本节示例.c和.h文件同『Python CoolBook』使用ctypes访问C代码_下_demo进阶即存在sample.c和sample.h两个源文件. cdef:Cython函数,只能在Cython中调用,python识别不了这个定义后面的主体,而且它后面也不仅仅接函数,class等均可,def定义的函数可以被P…
数组运算加速是至关科学计算重要的领域,本节我们以一个简单函数为例,使用C语言为python数组加速. 一.Cython 本函数为一维数组修剪最大最小值 version1 @cython.boundscheck(False) @cython.wraparound(False) cpdef clip(double[:] a, double min, double max, double[:] out): ''' Clip the values in a to be between min and m…
不依靠其他工具,直接使用Python的扩展API来编写一些简单的C扩展模块. 本篇参考PythonCookbook第15节和Python核心编程完成,值得注意的是,Python2.X和Python3.X在扩展库写法上略有不同,我们研究的是3.X写法. 一.源文件 Extest2.c C函数本体 c文件头必须包含"Python.h"头,以调用接口函数 这里面写了两个c函数,模块名称定为Extest #include "Python.h" #include <st…
点击进入项目 C函数源文件 /* sample.c */ #include "sample.h" /* Compute the greatest common divisor */ int gcd(int x, int y) { int g = y; while (x > 0) { g = x; x = y % x; y = g; } return g; } /* Test if (x0,y0) is in the Mandelbrot set or not */ int in_…
点击进入项目 这里的数组要点在于: 数组结构,array.array或者numpy.array 本篇的数组仅限一维,不过基础的C数组也是一维 一.分块讲解 源函数 /* Average values in an array */ double avg(double *a, int n) { int i; double total = 0.0; for (i = 0; i < n; i++) { total += a[i]; } return total / n; } 封装函数 /* Call d…
点击进入项目 一.Python生成C语言结构体 C语言中的结构体传给Python时会被封装为胶囊(Capsule), 我们想要一个如下结构体进行运算,则需要Python传入x.y两个浮点数, typedef struct Point { double x,y; } Point; 然后对这两个浮点数解析后生成C中Point的结构体,如下, /* Create a new Point object */ static PyObject *py_Point(PyObject *self, PyObje…
点击进入项目 一.C层面模块添加API 我们仍然操作如下结构体, #include <math.h> typedef struct Point { double x,y; } Point; 本节目标是封装两个Point结构体的操作函数为sample库的C级API,可以被sample以外的C库调用,首先写出以下函数指针结构体实例, /* pysample.c */ static PyObject *PyPoint_FromPoint(Point *p, int must_free) { /* 胶…
点击进入项目 一.C语言运行pyfun的PyObject对象 思路是在C语言中提供实参,传给python函数: 获取py函数对象(PyObject),函数参数(C类型) 获取GIL(PyGILState_Ensure) 确保fun对象可调用 参数转换为python对应类型(Py_BuildValue) 调用python函数(PyObject_Call) 确定调用无异常 检查返回值 释放GIL(PyGILState_Release) 异常处理 #include "Python.h" /*…
GIL操作 想让C扩展代码和Python解释器中的其他进程一起正确的执行, 那么你就需要去释放并重新获取全局解释器锁(GIL). 在Python接口封装中去释放并重新获取全局解释器锁(GIL),此时本段程序失去GIL运行,其他线程可以无视本函数的运行而运行,直到Py_END_ALLOW_THREADS: #include "Python.h" ... PyObject *pyfunc(PyObject *self, PyObject *args) { ... Py_BEGIN_ALLO…
多变量赋值 a = [1,2,(3,4)] b,c,d = a print(b,c,d) b,c,(d,e) = a print(b,c,d,e) 1 2 (3, 4) 1 2 3 4 a = "zxc" b,c,d = a print(b,c,d) z x c *:集成不定长元素 & 集合型实参展开为多个虚参 record = ('Dave', 'dave@example.com', '773-555-1212', '847-555-1212') name, email, *…
一.字典元素排序 dict.keys(),dict.values(),dict.items() 结合max.min.sorted.zip进行排序是个很好的办法,另外注意不使用zip时,字典的lambda操作方法: price = { 'a':1, 'b':2, 'c':3 } # 多个键的值相同时会采取元组比较的形式,实际应用时注意 min_p = min(zip(price.values(), price.keys())) max_p = max(zip(price.values(), pri…
本篇文章用于对Kivy框架官方所给出的一个「乒乓球」小游戏的源码进行简单地解析.我会尽可能的将方方面面的内容都说清楚.在文章的最下方为官方所给出的这个小游戏的教程以及游戏源码. 由于篇幅所限,本文只简单介绍Kivy框架,对于Python语言的简介,请大家通过别的文章进行学习. Kivy简介 Kivy 是基于Python编程语言的一种用于开发跨平台GUI客户端程序的框架.可以打包成iOS.Android.Windows.OSX等多种平台.目前已经实现一次编码,到处运行的目的. Kivy框架主要包含…
一. 赋值运算 l1 = [1, 2, 'conan', [11, 22]] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 'conan', [11, 22]] print(l2) # [111, 2, 'conan', [11, 22]] print(id(l1[0])) # 1872924208 print(id(l2[0])) # 1872924208 l1.append(333) print(l1) # [111, 2, 'conan', [11, 2…
if 语句的使用 单分支 if 条件: 满足条件后要执行的代码 例如: if 2 < 3: print(222) print(333) 每个条件后面都要使用冒号 :, 表示接下来是满足条件后要执行的语句块 在Python中没有 switch - case 语句 双分支 if 条件: 满足条件要执行的代码 else: 不满足条件就执行这里的代码 例如: age = 18 if age >= 18: print('恭喜你, 成年了') else: print('小屁孩儿') 缩进 你会发现, 在上…
一.collections.deque队列 deque(maxlen=N)构造函数会新建一个固定大小的队列.当新的元素加入并且这个队列已满的时候,最老的元素会自动被移除掉. 如果你不设置最大队列大小,那么就会得到一个无限大小队列,你可以在队列的两端执行添加和弹出元素的操作. 1.deque其他操作: >>> q = deque() >>> q.append(1) >>> q.append(2) >>> q.append(3) >…
一.heapq堆队列算法模块 本模块实现了堆队列算法,也叫作优先级队列算法.堆队列是一棵二叉树,并且拥有这样特点,它的父节点的值小于等于任何它的子节点的值. 本模块实际上实现了一系列操作容器的方法,使之表现的如堆一般. 1.基本使用 heapq.heappush(heap, item) 把一项值压入list(用于表示堆heap),同时维持堆的排序要求,其特性是直接比较入列元素大小(包括入列元素为容器的情况),将大的放在后面. import heapq queue = [] heapq.heapp…
一.collections.defaultdict:多值映射字典 defaultdict省去了初始化容器的过程,会默认value对象为指定类型的容器 指定list时可以使用.append, from collections import defaultdict d = defaultdict(list) d['a'].append(1) d defaultdict(list, {'a': [1]}) 指定set时可以使用.add, d = defaultdict(set) d['a'].add(…
基础知识 Python3内置函数 『Python』库安装 『流畅的Python』第1~4章_数据结构.编码 『Python』基础数据结构常见使用方法 『Python CoolBook』数据结构和算法_多变量赋值&“*”的两种用法 『Python CoolBook:Collections』数据结构和算法_collections.deque队列&yield应用 『Python CoolBook:heapq』数据结构和算法_heapq堆队列算法&容器排序 『Python CoolBook…
工具:CodeBlocks 新建一个分享库工程( Shared library ),随便编写一个C代码的函数 // test.c #include <stdio.h> int fib(int n) { || n == ) { ; } else { ) + fib(n-); } } 编译,在bin/Debug/目录中生成libtest.dll动态链接库文件,该文件可以通过ctypes模块进行访问使用,在该文件目录下新建一个test.py文件 # test.py import ctypes imp…
语言概念 KV语言允许你以声明的方式创建控件树,以及绑定控件属性到其他的控件或使用一种自然的方式进行回调. 它允许非常快速并灵活的改变你的UI. 它还可以让你的应用程序与应用程序的界面进行分隔. 如何加载kv文件 你可以告诉Kivy直接加载一个字符串或一个文件.如果这个字符串或文件定义了一个根控件,它将被下面的方法返回: Builder.load_file('path/to/file.kv) 或者 Builder.load_string(kv_string) 内容规则 KV源自规则的搭建,这些规…
一.Python函数传参 在python中,函数传参实际上传入的是变量的别名,由于python内在的变量机制(名称和变量值相互独立),只要传入的变量不可变(tuple中的元素也要是不可变的才行),那么函数体内是无法直接修改传入的变量的. 假如我们把v=1传入函数体f(v1),实际就是新增了v1变量名,它和v同时指向1这个对象,如果我们在函数内部试图修改v1,由于整形是不可变的,实际上会创建一个新的对象,将v1指向新的对象,如果v指向的是可变对象,则内部对于其的修改会体现在外部上,这也是推荐tup…
1. 函数的返回值 ​ 一个函数就是封装一个功能, 这个功能一般都会有一个最终结果的. ​ 比如写一个登录的函数, 最终登录是否成功你总得告诉我一声吧? ​ 还有咱们之前也用过 len() 这个函数, 它就是获取一个对象的元素的总个数, 然后返回一个元素个数的结果: s1 = 'qwerasdf' print(len(s1)) # 8 ​ 那么, 如何设置返回值呢? 这就得借助Python中的一个关键字: return 知道了设置函数的返回值要用到return, 那么赶紧, 把我们之前写的交友的…
一. 基本运算符 运算按种类可以分为: 算数运算.比较运算.逻辑运算.赋值运算.成员运算.身份运算.位运算. 今天我们只学习算数运算.比较运算.逻辑运算.赋值运算.成员运算 1.1 算数运算 以下假设变量: a = 10, b = 20 运算符 描述 实例 + 加 - 两个对象相加 a + b = 30 - 减 - 得到负数或者是一个数减去另一个数 -b = -20, a - b = -10 * 乘 - 两个数相乘或者是返回一个被重复若干次的字符串 a * b = 200 / 除 - x 除以…
现在有一个需求, 询问用户的姓名, 年龄, 工作, 爱好, 然后打印成以下格式 ************ info of Conan ************ name: Conan age: 23 job: student hobbies: code ***************** end ***************** 在没学格式化输出之前, 你会怎么实现呢? 你会发现, 如果直接用字符串拼接的方式去实现, 这也太麻烦了吧... 所以, 今天就学一下格式化输出的用法. 你会发现这一大…
在生活中经常遇到循环的事情, 比如循环列表播放歌曲等. 在Python中, 也有循环, 就是其流程控制语句while. 1. 基本循环 while 条件: 循环体 # 如果条件为真, 那么就执行循环体 # 如果条件为假, 那么就不执行循环体. 举个例子: while True: print('你不要担心') print('青春') print('有一天') 上面的代码有一个问题就是: 没有停止的时候. 只要电脑不死机, 就会一直循环下去. 那么具体的它是怎么执行的呢? 看下面这张图. 那么应该如…
本节只是对基础数据类型做个简单介绍, 详情会在之后慢慢介绍 什么是数据类型? 我们人类可以分清数字与字符串的区别, 可是计算机不能. 虽然计算机很强大, 但在某种程度上又很傻, 除非你明确告诉它数字与字符串的区别. 因此, 在每个编程语言中都有叫 数据类型 的东西, 其实就是对常用的数据类型进行了明确的划分. Python中常用的数据类型有很多种, 本节只介绍3中: 数字.字符串.布尔类型 整数类型 - int 在32位机器上,整数的位数为32位,取值范围为-231-231-1,即-214748…
一. Python安装 1. 下载安装包 https://www.python.org/downloads/release/python-374/ # 3.7安装包 # 如需安装python2.7版本可以到这里下载 https://www.python.org/downloads/release/python-2716/ # 2.7安装包 2. 安装Python3.7 增加环境变量, 选择 Customize installation, 剩下的一直下一步就好. 3. 在命令行测试 打开 cmd,…
一. Python介绍 Python是一门高级计算机程序设计语言,1989年,荷兰的Guido von Rossum创造了它.Guido是是一个牛人,1982年,他从阿姆斯特丹大学获得了数学和计算机硕士学位,因此他可以算是一位数学家,不过他更享受使用计算机解决问题的感觉.Python只是由Guido的一次hacking产生的,1989年圣诞节假期,早就萌发了设计一门好用的高级语言的想法的Guido,放弃了休息,全身心的投入到了设计新语言的活动中去,结果产生了世界上少有的几门最优美.最易用.最简洁…