milang(小语)
caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
显示方程的图像,判断是否有极值
昨晚女儿正在家里做作业,看到她正为一道题苦思不得其解,也画不出来图形来。我只好使用python来帮她,把这个函数的图形画出来给她,所以就写了下面的代码,让她看到之后,就有思考的方向了。显然比手工画图快很多,代码如下:import numpy as npimport scipy as spimport scipy.optimize as optimport matplotlib.pypl...原创 2019-12-04 08:17:23 · 479 阅读 · 1 评论 -
创建Python程序2
在Milang的IDE里编辑好之后,然后按F5运行一下,就会在下面的Output窗口输出“Hello, World!”字符串,如下图: 恭喜你,你编写最简单的Python程序已经完成,已经成为一个Python的程序员了,对于一门语言的入门,就是这么简单的。通过上面这个简单的程序,就可看到Python程序是不需要编译,就可以直接运行。在这个程序基础之上,你可以修改它的输出,比如把Hello, Wor原创 2014-06-02 13:38:03 · 14318 阅读 · 10 评论 -
基本的语法
2 基本的语法在学习Python其它知识之前,先理解几个基本语法概念,这样才可以理解它的代码是怎么样排列组合的,否则编辑出来的文本文件并不能叫做程序,因为Python的运行环境并不能对它进行解释执行,没有正确的结果输出。2.1 大小写区分在Python程序中,对于每一个变量的名称都是大小写区分的,比如My和my是两个不同的变量。2.2 空格和制表符在编写程序时,都需要对程序进行排版,否则看起来不清原创 2014-06-07 17:57:33 · 3851 阅读 · 3 评论 -
数值类型
4 数值类型Python支持三种数值类型:整数、浮点数和复数。只有三种类型,这样比较简便,连长整数都省略了,因为当一个数据超长时,自动变成长整数。这与其它语言有众多的数值类型是不同的。在Python里所有变量的类型,都不需要定义的,只要给一个变量,然后赋值时就会自动选择合适的类型。这个特性在C++的C11里标准auto类型才实现这个功能。具有这个特性的语言是比较方便的,至少可以少打很多类型定义的字原创 2014-06-25 22:20:01 · 2265 阅读 · 0 评论 -
数据类型
3 数据类型数据类型是一门语言里最基本的表达单元。如果数据类型越丰富,表达能力就越强,使用起来就越方便。当然,如果类型太多,就会导致难记,因此在类型丰富与记忆之间取得一个平衡点。Python内置了不少的数据类型,这样编写代码时,达到编写最少的代码,但需要记忆的时间就多一些了。Python语言在输入时并不需要指明变量的数据类型,它的类型是由编译器和运行时动态地识别出来,如果类型不能操作时,就会抛出异原创 2014-06-16 22:03:48 · 2392 阅读 · 0 评论 -
创建Python程序
1. 创建Python程序欢迎来到Python世界!本系列文章告诉你怎么样编写Python程序。Python只是一种文本文件,跟普通文本文件是一样的,只不过这种文本文件不但可以看,还可以在Python环境里运行。你可以使用一种标准的文本编辑器来编辑它。至于你想使用什么样的文本编辑器,依赖你所使用的电脑系统拥有的文本编辑器了。当然,你想提高效率和更加方便地编写,使用一个带Python语法高亮显示的文原创 2014-06-01 11:13:07 · 3675 阅读 · 2 评论 -
Hello World程序
自从软件有开发教程开始,都倾向于使用一个最简单的Hello World程序为起点,我也不免了落后这个俗套,就从Hello World程序开始吧。从这个简短的程序开始,我们就开始进入了探索Python在Windows平台上开发Win32的API应用之旅,希望这次旅行让你不但掌握了更多知识,也会带来更多的乐趣,让我们都能改变世界,让世界变得更美好。对,当你学会使用Python开发WIN32的应用程序之原创 2014-08-02 15:09:31 · 1748 阅读 · 0 评论 -
使用milang出错:LookupError: unknown encoding: idna
今天同事pvuTraceback (most recent call last): File "F:\vmid.py", line 11, in vmiddle.connect((host, port))LookupError: unknown encoding: idna原创 2014-07-09 17:21:54 · 4402 阅读 · 0 评论 -
开源项目:小语编程语言(以python为基础)
本项目主要开发、学习、讨论小语(milang)编程语言,它是以python语法为基础,然后改进它语法、增加直接生成机器码,混合C++的优点,增加基于寄存器的虚拟机实现。有意者,可加入QQ群:126707482qq: 9073204原创 2013-09-18 17:00:43 · 5474 阅读 · 1 评论 -
from语句
在整个应用程序里,只有三行语句,是一个最简短的WIN32的应用程序,但它的功能也是很有限,只是显示一个提示框,把一个字符串显示出来,其它什么事情也没有做。下面就来分析这三行语句了,别小看这三行语句,其实是隐藏着很多知识点在其背后。比如使用了三个关键字:from、import和None。其中from关键字和import关键字做成一个语句表达形式,它们的简单意思就是表示从某个模块(库)里导入模块顶层的原创 2014-08-05 08:51:55 · 2912 阅读 · 0 评论 -
cdll和windll的区别
Python要想调用C语言写的动态连接库,不仅要兼容C接口的调用习惯,还需要兼容C语言的数据类型。幸运的是ctypes库已经做了这两方面的工作,以便调用动态连接库是非常方便的。在Hello World的程序里,这行代码编写如下:MessageBox = windll.user32.MessageBoxW从这行代码的简洁程度来看,是非常优美的。这种优美是由于ctypes库在背后做了非常多的工作,比如原创 2014-08-06 08:33:24 · 8152 阅读 · 0 评论 -
窗口类型注册类
从前面的窗口程序可以看到,这个程序主要做了三件事情,第一件是注册窗口,第二件是创建窗口,第三件是显示窗口。从程序的代码上,很容易就看出来每个函数是在做什么事情,这典型是基于函数式的编程,行云如流水般。对于小的程序,这样的编程方式是没有什么问题。现在我们来考虑一下如果要注册多个窗口,创建多个窗口和显示多个窗口,再使用这样的函数代码,就比较难复用了。因而随着编程技术发展和软件项目的增大,目前普遍基于面原创 2014-08-19 12:45:07 · 1959 阅读 · 0 评论 -
类的构造函数/类的析构函数
类的构造函数Python类的构造函数是__init__,它与其它函数的区别,首先是通过前面和后面带两个双下划线来跟别的函数名称进行区分。它的格式如下:def __init__(self, 参数列表):def是定义函数的关键字,__init__是构造函数的名称,self是类本身的参数,用来区分那些函数是属于类。最后的参数列表是可有可无的。构造函数主要用来初始化成员变量和分配资源,它是一个类旦生后立即原创 2014-08-20 12:28:47 · 1890 阅读 · 0 评论 -
MVC设计模式
在界面框架中,使用MVC的设计模式是最合适方式。为什么这样说呢?因为M是model的缩写,就是表示模型意思。模型就是算法,业务逻辑,商业表示。这个是经常会变的,比如像银行开发一个超市积分系统,对不同来店刷卡的人员给不同的积分,这个是随着不同的时间会变化,像中秋节时购买月饼就可以多增加积分,这个变化就表现在模型上。V就是view的缩写,也就是视图,对用户来说就是界面。界面在一定时间内是稳定的,但随着原创 2014-09-04 12:38:48 · 2717 阅读 · 0 评论 -
函数名称
在这个例子的Python源码里,把从动态连接库获取到的函数地址赋值给变量MessageBox,然后通过MessageBox就可以调用动态连接库里的函数了。windll.user32是实现了加载动态连接库user32.dll,而windll.user32.MessageBoxW是实现了从动态连接库user32.dll获取到函数MessageBoxW的地址。如果获取一个在动态连接库里不存在的函数时,c原创 2014-08-09 08:41:29 · 2132 阅读 · 0 评论 -
windll对象
回过头来,再看一下windll和oledll的区别,这两者之间最大的区别是oledll调用的函数都是固定返回HRESULT类型的值,而windll是不固定的类型的。在Python 3.3版本之前,都是返回命名为OSError类型错误,在这之后就返回命名为WindowsError类型错误。通一大段的讨论,我们彻底地了解cdll、windll和oledll之间的区别,为了更加清楚地记住它们,总结如下表原创 2014-08-08 08:20:23 · 2700 阅读 · 0 评论 -
类的成员
类的成员变量在Python里描述数据结构是使用类成员变量的方式,从上面的例子可以看到这样描述:self.wndClass = WNDCLASSEX()这行代码是写在类的构造函数里,通过使用类自身对象self来给类添加成员变量wndClass 。由于在Python语言里没有声明,每增加一个类成员变量,就是通过赋值的方式产生。不过,要注意的是Python语言里的成员变量是可以动态添加的,不但可以在构造原创 2014-08-21 12:58:41 · 2064 阅读 · 0 评论 -
函数参数
在下面这行语句里:MessageBox(None, 'Hello World!', 'Hello World', 0)括号里的就是函数的参数列表。C语言编写的函数时,定义函数的参数是使用C语言的方式来定义,那么在Python里编程是使用Python定义的类型,这两者之间是有差别的,这种差别主要体现在类型定义内存的方式不一样,比如大小不一样,就算大小一样,在Python里还有每个对象的引用计数。比如原创 2014-08-11 08:40:03 · 2011 阅读 · 0 评论 -
窗口创建类
在前面已经学习怎么样把注册窗口的功能封装成类的形式,接着下来就是创建窗口的功能,而这部分功能又是怎么样编写才是最合适的呢,以便后面所有开发工作都可以复用这些代码。我们来仔细地分析一下窗口上主要有什么东西是可变的,什么东西不变的,原则上就是把可变的东西变成通过函数方式来改变,不变的东西放在类内部,这样减少类的使用者在细节上考虑的问题。目前来看,一个窗口最容易变化的就两样东西:窗口类型,指明这个窗口是原创 2014-08-22 13:08:29 · 2254 阅读 · 0 评论 -
实例句柄
在Windows应用程序中,总需要加载应用程序文件到系统内存里,为了标识每个文件在内存的区别,Windows使用了句柄来标识这些文件。比如在一个应用程序里,有一个可执行文件(EXE)和多个动态连接库文件(DLL),这时可以标识可执行文件为0x1D000000,动态连接库文件为0x1D001000。这里的值只是举例,当系统运行应用程序时,就会分配实际的值给应用程序。加载到进程地址空间的每一个可执行文原创 2014-08-12 08:41:36 · 5994 阅读 · 1 评论 -
窗口显示类
窗口在前面已经注册,并且已经创建出来了,但这时这个窗口并不能出现在我们的眼前,又是什么原因呢?哦,还不显示出来,原来是有原因的,就是窗口有多种状态,窗口可以隐藏、普通显示、最大化显示、最小化显示等。并且创建出来时,不立即显示,也是可以方便一性地创建很多很多窗口,最后才一次性地显示出来;另外创建窗口之后在系统看来窗口已经是可用的,这时可以先在窗口上绘图,当完成时再一次性显示出来,也避免窗口不断地刷新原创 2014-08-25 12:45:22 · 2159 阅读 · 0 评论 -
回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数主要用来为不确定的事件、不确定的时间上进行的动作或响应。比如在C库里实现了一个算法叫做快速排序(qsort),为了能让库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑,这时就可以使用回调函数方式来实现。如msvcrt.dll里的快速原创 2014-08-13 08:45:38 · 2555 阅读 · 0 评论 -
窗口的消息处理
我们知道一个应用程序一般都不是只有一个窗口组成的,往往是多窗口组成的,比如一个对话框的窗口上有一个按钮,这里对话框是一个窗口,按钮也是一个窗口。如果一个对话框上有100个按钮,就是100个窗口,这样句柄会比较多。因而出现了DirectUI的设计方法,所有按钮和主窗口都是同一个窗口,采用分不同区域来绘画而成。这里就遇到了一个问题,每个窗口是独立存在的,但在前面的例子里,可以看到每个窗口都是调用PyW原创 2014-08-26 12:42:13 · 2218 阅读 · 0 评论 -
结构体
在C语言的世界里,程序的组成就是结构体加算法。因此,与Win32的API交互中,肯定少不了结构体的类型。在Python里定义的类,并不能直接使用于C的函数,需要通过ctypes里的结构类继承之后,并按它的格式填写字段才可以使用。下面的例子就是定义一个最简单的结构体,表示屏幕上一个点的坐标的结构体,如下:#windows应用程序#开发人员:蔡军生(QQ:9073204) 深圳 2014-8-14原创 2014-08-14 08:32:40 · 1912 阅读 · 0 评论 -
窗口消息处理对象的传递
在前面已经定义好窗口的消息处理类,虽然拥有处理能力了,但还没有放到回调函数里进行相应的调用,那还是达不到目标,还需要下面两个细节的处理,才可以嵌入到消息处理过程里。我们来顺着消息类的传递路径来进行分析它的具体过程,这样理解起来会更顺畅一些,更符常人的思维。具体的过程如下图所示:从上图可以看到,使用Controller类来创建窗口处理消息的实例对象ctrl,然后把它传送给WinMaker的实例对象,原创 2014-08-27 12:38:13 · 1720 阅读 · 0 评论 -
指针
在很多C语言编写的函数里,大部分都需要传递指针,比如给函数里传送值进去,或者从函数里返回多个值。在Python里想要跟C函数交互,那么需要模拟指针的类型,才可以实现这种梦想。值得注意的是ctypes已经实现了这个梦想,只要使用它定义的函数pointer()就可以。如下面的例子:#windows应用程序#开发人员:蔡军生(QQ:9073204) 深圳 2014-8-15from ctypes im原创 2014-08-15 08:40:04 · 2032 阅读 · 0 评论 -
模型(Model)类
在这个例子里,描述算法的类就叫模型类。而这个例子实现的功能比较简单,主要实现用户点击窗口之后,在窗口上画线,并把所有画的线记录起来,以便窗口刷新时还可以显示出来。要实现这个目标,需要使用数据结构来保存直线的起始和终点位置。而负责这方面工作的,就是模型类。模型类设计上,使用了Python里内置类型列表来保存所有坐标点属性。这个例子的代码如下:#开发人员:蔡军生(QQ:9073204) 深圳 201原创 2014-09-11 12:43:02 · 3160 阅读 · 0 评论 -
每个窗口单独处理消息的例子源码
整个窗口使用消息类重新写的源码如下:#windows应用程序#使用类来描述#开发人员:蔡军生(QQ:9073204) 深圳 2014-8-24from ctypes import *from ctypes.wintypes import *WS_EX_APPWINDOW = 0x40000WS_OVERLAPPEDWINDOW = 0xcf0000WS_CAPTION = 0x原创 2014-08-28 08:36:41 · 2130 阅读 · 0 评论 -
视类(View)
视类主要用来向界面显示内容用的,与显示无前的内容都不会放到这里。在本例子里,主要用来向窗口画直线和在窗口固定位置显示当前鼠标所在位置。在Windows的画直线,就是调用它的API函数LineTo来实现,显示字符串使用API函数TextOut。为了方便使用,在这里都对这些部件进行封装,抽像成好用的类,这样使用起来不用担心句柄资源泄漏。一年之前,在公司里有一个新同事进来,刚开始写界面的代码,为了给界面原创 2014-09-12 12:37:46 · 2940 阅读 · 0 评论 -
类的继承
在软件设计里,代码的复用和代码稳定性,一直是软件开发的重要目标之一,因为只有这样才能积累各种基础组件,以及维护以前做过的工作。从复用的特性来说,就是利用以前做过的工作,比如就像硬件里的IC一样,不需要知道它是怎么样实现的,只要使用它就行了。因而软件也需要有这种IC,在代码层次里的IC,以前看来只是用函数的方式复用,或者只是数据结构的复用。当迈进面向对象编程时代时,自然而然地想到就使用类来复用了,这原创 2014-08-29 12:29:27 · 2260 阅读 · 0 评论 -
整个窗口应用的源码
为了方便查看,所有源码放在一起,如下:#windows应用程序from ctypes import *from ctypes.wintypes import *WNDPROCTYPE = WINFUNCTYPE(c_int, HWND, c_uint, WPARAM, LPARAM)WS_EX_APPWINDOW = 0x40000WS_OVERLAPPEDWINDOW = 0xc原创 2014-08-18 08:44:37 · 2016 阅读 · 0 评论 -
创建窗口的应用程序
通过前面的基础知识的学习,已经对ctypes库的基本功能学会了使用,为了加强这种知识训练,以及运用刚学习的知识的快乐,我们来创建一个稍稍复杂一点的应用程序。这个应用程序是所有后面应用程序的基础,只有学会这个程序的基本原理,才可以更进一步学习WIN32的API程序开发。更何况后面所有程序都会在这个程序上修改而成,这个就相当你的爬向高楼顶层的第一个台阶。在所有工程技术里,都会从一个小小的演示程序开始,原创 2014-08-18 08:42:29 · 2296 阅读 · 0 评论 -
控制类(Controller)
在这个视图类里,由构造函数声明了两个保存当前鼠标坐标的点(x, y)。接着下来看到成员函数Paint,这个函数主要作用就是把界面所有画过的线,在窗口更新之后,再次把所有的直线显示出来。所以在这个函数传入两个参数:canvas和ptList,canvas是窗口的画布,ptList是保存所有直线的端点,有了画布和所有直线的端点,就可以把以前在界面画过的线重新显示出来。为什么要这样做呢?因为窗口每次更新原创 2014-09-24 12:56:02 · 4925 阅读 · 0 评论 -
控制类(Controller)继承
在控制类里,Controller只是基类,主要实现从窗口传递过来的消息触发,并通过字典的方式来处理不同的消息响应。在Python里有字典,而没有case语句,对于很多消息来说,只有采用字典的方式会更容易处理消息调用函数。接收到一个消息时,可以先判断是否在字典里,如果存在说明这个消息已经有相应的响应函数,如果不存在说明这个消息给窗口的默认函数处理。通过字典的方式来处理,从代码的编写上来看,比case原创 2014-09-26 12:42:10 · 6718 阅读 · 0 评论 -
Python标准库:内置函数callable(object)
如果对象object参数是可以调用的对象,就返回True;否则返回False。不过要注意的是,当一个对象是可以调用的,并不表示调用该对象时执行一定成功,但不可调用的对象去调用时一定不会成功。如果类对象是一个类对象,那么这个类是否重载有__call__()方法来决定,如果重载有这个方法就判断为True。例子:#callable()函数a = 'abc'def f(a): pass原创 2014-11-07 16:28:01 · 3953 阅读 · 0 评论 -
Python标准库:内置函数classmethod(function)
把类函数当作类的一个方法返回。类方法第一个参数是指明类,跟类中函数一样,第一个参数是指明类实例。类方法修饰符采用下面的格式来使用:class C:@classmethoddef f(cls, arg1, arg2, ...):...从上面格式来看,@classmethod是函数在前置的一个修饰符,可以查看语言参考手册。经过类方法修饰符的函数,可以直接通类来调用,比如C.f()方式;也可以通实例的方原创 2014-11-11 20:20:05 · 3481 阅读 · 0 评论 -
Python标准库:内置函数chr(i)
返回一个参数i表示的字符串。比如,chr(97)返回字符”a”。参数i的有效范围为0到1,114,111(0x10FFFF),其它范围的值会抛出异常ValueError。与之相反转换的函数是ord(),它是把一个字符串变成数值。例子:#chr()函数print('0x5a:', chr(0x5a), ' 97:', chr(97), ' 60:', chr(60))输出结果如下:0x5原创 2014-11-10 15:51:12 · 5776 阅读 · 0 评论 -
Python标准库:1. 介绍
标准库包含了几种不同类型的库。 首先是那些核心语言的数据类型库,比如数字和列表相关的库。在核心语言手册里只是描述数字和列表的编写方式,以及它的排列,而没有定义它的语义。换一句话说,核心语言手册只是定义语法和优先级之类,并没有定义对这些类型的功能上的操作。 其次标准库包含了一些内置函数和异常处理对象,在使用这些对象时,并不需要明确使用import语句进行导入。其中有一些是核心语言需要的,但很多不是核原创 2014-10-26 10:52:20 · 1958 阅读 · 0 评论 -
Python标准库介绍
在《Python语言参考手册》中描述了Python的语法和语义,而本手册主要介绍了Python标准库的内容和使用,也介绍了一些发行库里可选的组件库。 Python标准库包含的内容是非常广泛的,通过标准库的目录长度和内容就可明白到这一点。标准库包含一些模块是使用C语言来编写的,比如访问系统I/O的文件功能,这些功能对Python开发人员来说是不能直接访问的,因此这些模块都设计成为内置模块。另外标准库原创 2014-10-25 10:48:36 · 2672 阅读 · 0 评论 -
MVC整个例子的源码
下面就是整MVC例子的源码:#windows应用程序#开发人员:蔡军生(QQ:9073204) 深圳 2014-9-24 #使用类来描述from ctypes import *from ctypes.wintypes import *WS_EX_APPWINDOW = 0x40000WS_OVERLAPPEDWINDOW = 0xcf0000WS_CAPTION = 0xc000原创 2014-09-30 13:00:34 · 4592 阅读 · 0 评论