python中使用 C 类型的数组以及ctypes 的用法
Python 在 ctypes 中为我们提供了类似C语言的数据类型,
它的用途(我理解的)可能是:
(1) 与 其他语言(如 C、Delphi 等)写的动态连接库DLL 进行交换数据,因为 python 的 数据与 DLL难以进行数据交换。
(2) python 的字符串一旦形成,是不可变的,为了算法的需要,我们有时需要对字符串进行原位操作 ( in place ),而不想浪费另外的内存空间。
(3) python 具有很简明的语法,人们乐于使用。在解决实际问题时,字符串的处理占据了很大的开发量。
互联网上有很多有用的算法可以帮助我们解决问题,如果我们能用python 写类似于 C 语言的程序,就不需要用其他语去写扩展了。
有人会问,既然如此,用C语言,不就好了吗?
当然可作这种选择,在用 python 的优势在于:既用使用了C语言的优点,也使用了Python的最大优点: 垃圾自动回收,代码简洁等。
一、 导入 C 类型 库
from ctypes import *
二、 常用的C 类型
(1) c_int 、 c_long 、c_int32
C 类型的long int ,这两个类型完全相同。
python 用 int 与之相应 , 但c_int的取值范围是 32 bit 的整数 。
占用 4 字节内存
(2) c_int64
64 bit 整数,占用 8 字节内存 , python 用 int 与之相应
(2) c_double 、c_float
C 类型的 double , 这两个名字( c_double 、c_float 完全相同 )
占用 8 字节内存
python 用 float 与之相应
(3) c_byte
C 类型 的 byte , python 用 int 与之相应
占用1字节内存
(4) c_char
C 的 8 bit 字符型
(5) c_wchar
C 的 unicode 字符
【注】
ctypes模块 C类型 Python类型 ctypes 类型 当一个函数期望一个指针作为参数时,可以像这样调用 struct例子 Python例子 |
三、 生成类似C的数组
目的:初值化一个具有 10 个元素 的数组,每个元素初值为0的
(一) python 原生数组 list
>>> a = [ 0 ] * 10
>>> for i in range(0, len(a)):
print( a[i], end=" ")
0 0 0 0 0 0 0 0 0 0
>>>
(二) 生成 10 元素的 c_int 类型的数组:
格式一:
>>> from ctypes import *
>>> a = ( c_int * 10) ()
>>> for i in range(0, len(a)):
print( a[i], end=" ")
0 0 0 0 0 0 0 0 0 0
>>>
格式二:
>>> from ctypes import *
>>> M = 10
>>> a = ( c_int * M ) ()
>>> for i in range(0, len(a)):
print( a[i], end=" ")
0 0 0 0 0 0 0 0 0 0
格式三:
>>> from ctypes import *
>>> myArr10 = c_int * 10
>>> a = myArr10( )
>>> for i in range(0, len(a)):
print( a[i], end=" ")
0 0 0 0 0 0 0 0 0 0
c_double 的数组定义与上面相似。
四、如何使用 C 类型的数组 ?
例 1 , 对整数数组倒序的程序
#coding=gbk
from ctypes import *
# 定义 具有10个 c_int 元素的数组
# 编写一维数组的 倒序的程序
# 说明 : 本算法参照 网上基于指针的算法改写而成。
def outPut( A ):
for i in range(0,N):
print( A[i], end=" ")
print ( "\n")
def arrReverse( A , N):
i = 0 ; j = N-1
while i<j:
A[i], A[j] = A[j], A[i]
# 相当于 T =A[i]; A[i]=A[j]; A[j]=T
i = i+1; j=j-1
#测试程序
N = 10
a = (c_int * N )()
for i in range(0,N):
a[i] = i;
print ( "原数组:")
outPut( a )
arrReverse( a ,len(a) )
print ("倒序数组:")
outPut( a )
--- 结果 ---
原数组:
0 1 2 3 4 5 6 7 8 9
倒序数组:
9 8 7 6 5 4 3 2 1 0
例2 求倒序字符串
#coding=gbk
from ctypes import *
# 编写求字符串的倒序字符串
def arrReverse( A , N ):
i = 0 ; j = N-1
while i<j:
A[i], A[j] = A[j], A[i]
# 相当于 T =A[i]; A[i]=A[j]; A[j]=T
i = i+1; j=j-1
#测试程序
a = create_unicode_buffer( "张三买了一头小毛驴,花了1024.05元钱。")
print ( "原字符:")
print ( a.value )
arrReverse( a , len( a ) -1 )
print ("倒序字符串:")
print ( a.value )
-- 结果 --
原字符:
张三买了一头小毛驴,花了1024.05元钱。
倒序字符串:
。钱元50.4201了花,驴毛小头一了买三张
解说
(1) create_unicode_buffer( python的字符串 )
是创建一个 c_wchar 的数组,其长度是 字符串的长度 +1 , 因为 C 的字符串是以 NULL 结尾的所以要多出一个元素才行。
c_wchar 是 unicode 字符。
(2) 如果您想创建一个可以装行下 100 个 unicode 字符 的空的C_wchar 数组:
ar = create_unicode_buffer( 100+1 )
此时, ar 具有 101 个元素,但只能装 100个字符。
由于 ar 是一个真正的数组,我们可以对它的每个元素(字符)进行修改。
从 ar 中取出 python 的字符串:
s = ar.value
s 中存放的是 ar 中保存的 unicode 字符相应的字符串
向 ar 中存于字符串
ar.value = "要存入的字符串"
但要注意:
您向 ar 中存入的字符串的字符个数必须小于等于 len(ar) -1
(3) 如果您知道 ar 中第 i 个元素的 字符编码,请使用 ord( ar[i] ) .
(4) 如果您想使 ar 的第 i 个元素 变为 "好" 这个字符,有两种方法:
ar[i] = "好"
或者
ar[i] = chr(22909)
因为 , "好" 的 uncode 编码是 22909。
小结:
(1) 从这个程序我们看到 对整数数组及 unicode 字符数组 的倒序,我们用的是相同的arrReverse 函数。
(2) 调用 arrReverse
函数时,传递元素个数 N 时,如果是 c_wchar ( unicode ) 字符数组时, 如记住最后一个元素是 NULL 这个问题。
( 3 ) 您会发现,我们这里编的程序很像 C 语言的指针,只不过,我们不需要手工释放动态申请的数组。
( 4 ) 但是您的算法中若用了大量的动态数组,等不及垃圾自动回收,而急于想释放数组占用的空间时,请使用 del ( ar )即可。
( 5) 最后一点:
C 语言关于字符串的操作,常 使用指针的移动, 我们在 python 中移动的是数组的下标,这是作程序移植时常用的方法。
五、 C类型的数组 与 python 的 list 用法上有什么区别和联系呢?
1 C 类型的数组的长度是不可变 的。
2 C 类型数组的元素是可变的,即可以读写的
3 C 类型数组的元素是有类型的,即: 它的每个元素的类型是相同的, 而 python 的 list 的元素可以是相同类型,也可以是不同类型 。
4 C 类型数组除了不能用 形如 ar[ 3:5 ] = [] 格式的语句来删除某个子数组
5 C 类型数组的切片:
如 x = ar[3:5]
此时 x 是一个全新的 数组,它是原数组的完全拷贝, 此时 x 有两个元素:
x[0] 中存的是 ar[3]的值
x[1] 中存的是 ar[4]的值
此后,改变 x[0] 时, ar[3] 不会改变; 改变 ar[3] 的值,也不会改变 x[0] 的值。
python中使用 C 类型的数组以及ctypes 的用法的更多相关文章
- Python中内置数据类型list,tuple,dict,set的区别和用法
Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...
- Python 中的枚举类型~转
Python 中的枚举类型 摘要: 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表 ...
- python中对象、类型和元类之间的关系
在python中对象.类型和元类构成了一个微妙的世界. 他们有在这个世界里和平共处,相辅相成.它们遵循着几条亘古不变的定律: 1.python中无处不对象 2.所有对象都有三种特性:id.类型.值 3 ...
- Python中的集合类型分类和集合类型操作符解析
集合类型 数学上,把set称作由不同的元素组成的集合,集合(set)的成员通常被称作集合元素(set elements). Python把这个概念引入到它的集合类型对象里.集合对象是一组无 ...
- Python 中的字节与字节数组
Python 中的字节与字节数组 - Python - 伯乐在线 http://python.jobbole.com/84839/
- Python中的鸭子类型
今天,我们来聊一聊Python中的鸭子类型(duck typing). 编程语言具有类型概念,例如Python中有数字类型.字符串类型.布尔类型,或者更加复杂的结构,例如元组tuple.列表list. ...
- Python 中的鸭子类型和猴子补丁
原文链接: Python 中的鸭子类型和猴子补丁 大家好,我是老王. Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这 ...
- python中的filter、map、reduce、apply用法
1. filter 功能: filter的功能是过滤掉序列中不符合函数条件的元素,当序列中要删减的元素可以用某些函数描述时,就应该想起filter函数. 调用: filter(function,seq ...
- Python中的基本类型简介
1.变量 变量不仅可以是数字,还可以是任意数据类型 命名规范:变量是用一个变量名表示,变量名必须是大小写英文.数字和下划线_的组合,且不能用数字开头 python中等号“=”是赋值语句,可以把任意数据 ...
随机推荐
- APICloud-数据存储
APICloud 共有四种数据存储 1.file:目录操作,文件操作 文件存储方式,用于图片.文档的上传.下载.删除.管理. 2.db:本地 sqlite 数据库 用于离散数据的存储. 3.loacl ...
- Openresty 进行路由系统设计
1.系统基础设计图为: 用户通过Http访问Openresty(Nginx + Lua), 其中Nginx虚拟主机中配置文件进行Lua脚本加载. LUA通过nginx内置变量或者http请求中变量来区 ...
- 【原创】Proxmark3系列教程1——PM3用法
1 PM3介绍 proxmark3是一款开源的RFID安全研究平台黑色按钮从图中我们可以看到左上方有一颗黑色按钮,这个按钮就是Proxmark3的功能键,主要用于启动嗅探模式以及停止进程功能,其中内置 ...
- key单片机按键抖动
//write by:cyt //Time:2017-2-10 //Porject Name:key shake_destory #include<reg51.h> #define GPI ...
- Hadoop_CDH安装
——本文非个人原创,为大牛同事整理,发布于此以备忘 1 CDH5.8安装(2018年4月19日) 1.1 物理服务器注意事项 (1)把raid都去掉了,每个物理盘都用raid0创建一个虚拟 ...
- 田螺便利店—opencv3.4.5与vs2015配置并测试
参考博客:https://blog.csdn.net/sinat_39061823/article/details/80723096 遇到的问题:由于找不到 opencv_world345d.dll, ...
- JAVA乐观锁、悲观锁实现
一.名词解释 1.悲观锁:认为每次对数据库的操作(查询.修改)都是不安全的,因此每次操作都会把这条数据锁掉,直到本次操作完毕释放该锁 2.乐观锁:查询数据的时候总是认为是安全的,不会锁数据:等到更新数 ...
- 在VMware上安装CentOS6 64位操作系统
---恢复内容开始--- 1.创建新的虚拟机 2.选择自定义,点击下一步: 3.找到镜像位置,添加: 4.点击“稍后安装操作系统”,点击“下一步”: 5.默认点击“下一步”,然后分配CPU: 这里内存 ...
- IS基础(函数片)
函数基本介绍 为什么需要函数 之所以需要函数,是因为函数可以实现对代码的复用.相同的代码,我们不需要再重复书写,只需要书写一次就足够了.函数有些时候可以看做是一个暗箱.我们不需要知道函数内部是怎么实现 ...
- 渗透测试学习 三、Linux基础
Linux发行版本 内核+应用程序 打包在一起 一.优点: 完全免费 完全兼容POSIX 1.0标准 多用户,多任务 良好的界面 可靠安全稳定的性能 支持多种平台 丰富的网络功能 安全性更好(针对 ...