python入门2

Lesson 8 Python中的错误检测
写程序什么最重要?完成功能最重要。但是程序中难免要有用户的输入,对于这些写的时候未可预知的因素中间可能出现的错误,一般称作异常。对于异常情况的处理,不同语言有不同的做法,比如检查函数的返回值之类的,但是那种办法会把代码弄成一团浆糊。Python在这个方面是比较先进的,我们从一个例子来看看:
 

Code:
  1. # -*- coding: cp936 -*-   
  2. name = raw_input("请输入:")   
  3. print name   
  4. print eval(name)   
  5. integer = input("请输入:")   
  6. print integer   
  7. ################   
  8. print "开始输入:"  
  9. ################   
  10. print raw_input() #把输入的东西立即输出   
  11. print eval(raw_input())   
  12. print input()   
  13.   

input()会在raw_input()接收了“字符串”的输入之后进行一些处理,比如你是输入1+2,然后输出的就是3了,而raw_input就是原原本本的1+2的输出了.eval是求表达式的值,任何一个简单的python表达式,就像1+2这样的作为字符串送入,就能把值从eval处理之后取出来。现在你实验一下"sdfsdf”之后,你会发现提示你:

Code:
  1. Traceback (most recent call last):   
  2.   File "F:/python/demo12.py", line 11in <module>   
  3.     print eval(raw_input())   
  4.   File "<string>", line 1in <module>   
  5. NameError: name 'sdfsdf' is not defined  

如果输入其他稀奇古怪的字符串还可能有其他的出错提示,我们现在要做的就是捕捉这种由用户输入引起的错误。这么来作:

Code:
  1. # -*- coding: cp936 -*-   
  2. try:   
  3.     print input("请输入:")   
  4. except ZeroDivisionError:   
  5.     print "can't be divided by zero!"  
  6. except:   
  7.     print "there is an error in your input!!"  

运行:

Code:
  1. >>>    
  2. 请输入:5/0  
  3. can't be divided by zero!  
Code:
  1. 请输入:zou   
  2. there is an error in your input!!  

注意,捕捉所有错误的except必须放在所有的except的最后一位。明白了?OK

还有更多的能够捕捉的错误,自己查手册吧(暂时看不了手册没关系,慢慢来嘛)。以后还能够自己raise(引发)异常呢。不过那都是比较高级的应用了,对于出错处理从一开始就有这个印象,并牢记在心中对于以后写大一些的软件很有好处。
Lesson 9 走向模块化的第一步
大规模的程序设计需要你把一个大的程序拆分成n个模块。然后把模块进行组合,交互成为一个完整的程序。你不可能像现在这样,从顶写到尾。。。
那么我们从函数开始。
 

Code:
  1. # -*- coding: cp936 -*-   
  2. def square(x): #定义函数square,只有一个参数为x   
  3.     return x**2  
  4. print square(5)   
  5. def multiply(a,b): #两个参数a,b的函数   
  6.     return a*b   
  7. print multiply(3,4)    
  8. def swap(m,n): #两个参数的函数,且返回两个值,(n,m)是一个元组   
  9.     return(n,m)   
  10. print swap(1,2)   
  11. my_turple = (1,2,3)   
  12. my_list = []   
  13. for i in my_turple:   
  14.     my_list.append(i)   
  15. print my_list   
  16. 运行:   
  17. >>>    
  18. 25  
  19. 12  
  20. (21)   
  21. [123]  

元组是基本的变量类型。其实元组和列表非常像,但是列表的长度是可以变化的,而且成员是可以改变的。但是元组是什么都不能变的,是只读的。对于高级一点的话题:传递进来的参数是否可以被修改,这个问题取决于你传递了什么近来。如果是数字或者字符串,是不能够改变的!
Lesson 10 Python的文件操作
文件操作....是一个语言和外界联系的主要方法....现在以txt为例简单的讲一下...现在一个file.txt放在F盘python文件夹里,文件读取。

Code:
  1. infile = file("f://python//file.txt","r")   
  2. infile_content = infile.read()   
  3. print infile_content  

文件写,同一目录下一个空文件test.txt。

Code:
  1. # -*- coding: cp936 -*-   
  2. infile = file("f://python//test.txt","w")   
  3. infile.write("你信不信!/n")   
  4. infile.write("难说了!/n")   
  5. infile.writelines(["小情歌","喜欢!"])   
  6. infile.close()   
  7. infile = file("f://python//test.txt","r")   
  8. content = infile.read()   
  9. print content  

Lesson 11 走向模块化的第二步
函数上面还能是什么呢?内嵌函数^_^,其实python是支持的。不过用起来会让你吐血的,LGB名称查找规则。。。(寒)。python是面向对象的,对于面向对象的支持挺好玩的。
 

Code:
  1. # -*- coding: cp936 -*-   
  2. class person:   
  3.     school = "KUST"  
  4.     def __init__(self): #必须这个名字,初始化函数(构造函数),注意是__不是_!   
  5.         self.name = "zheng"  
  6.         self.id = 33110  
  7.     def say_id(self):   
  8.         print "%s's id is %d" %(self.name,self.id)   
  9. me = person()   
  10. me.say_id()   
  11. print me.school   
  12. >>>    
  13. zheng's id is 33110  
  14. KUST  


类是class关键来定义的。class person:就是说定义一个类,名字叫person。

对象
对象是用类来产生的。所以me就是对象,产生的办法就是像调用函数一样,person(),而且()中是能够放参数的,什么时候要参数,看下面的“初始化函数“

初始化函数
类可以有自己的初始化函数,每次类被创建的时候(调用person()这样的语句的时候),都会调用它。这个在C++中的名称是构造函数。__init__是必须的名字,你不能用其他名字来当初始化函数。但是你可以没有初始化函数。

类的数据
类的数据是所有类产生的对象共享的数据。这里有用到类的数据!


对象的数据
对象的数据是用
self.变量名 = 。。。
来生成的。这里self.name就是对象的数据。对象的数据和类的数据不同,因为对象之间的数据是互不共享的,而类的数据是被所有由类生成的对象共享的。

对象的函数(类的函数)
两个没有区别,是类的就是对象的。其实就是类的(我说的是底层实现,不过不用管,如果关心怎么实现的,等我写Hacking OO吧,还没影呢)。say_id就是对象的函数,你能够调用它。每个对象的函数都需要一个self参数,表示[color]这个对象[/color]。

为什么使用面向对象编程
除去让人觉得你比较专业外,当然由切实的好处。比较浅显的是你能够表达一定的层次关系,类与类之间能够有包含和继承的关系(当然你现在还不会。。。)。而且对象能够把数据和操作数据的函数放在一起,能够比较清晰。虽然有所谓的数据隐藏的概念,但是在python中其实就是一个不要直接调用对象中的数据的约定,而要用一个函数作为中转。其实不懂面向对象很正常,其实有的时候就是要在用的中间感悟的。什么时候把用函数编程用牛了,用出个道道来了,说不定你已经感觉到了什么是面向对象编程。另外:所谓什么OO,都是一些认为规定,不用语法支持,只要心中有这个想法(什么想法?自己悟啊),就能够写出OO的代码,不管你用的是什么语言,什么语法。
Lesson 12 python to exe
about py2exe

本文讲述如何将一个python源代码编译成一个exe.....我会的只是最初步最基本的.....实际上那个py2exe似乎有着更强大的功能

1:下载安装py2exe.....from http://twh@bitunion.org


2:假设你写好了一个python程序....guess_number.py.......存在了c:/Python23/下面

3:再写一个setup.py....也存在c:/Python23/下面......内容如下
 

Code:
  1. #setup.py   
  2. from distutils.core import setup   
  3. import py2exe   
  4. setup(name="demo11",scripts=["demo11.py"],)  

其中name和scripts是需要你到时候具体修改的....

4:找到windows的dos模式(命令提示符).....或者自己做个快捷方式也可以....
C:/Python23>
C:/Python23>python setup.py py2exe
构造就开始了....
几秒钟以后....
在你的C:/Python23就会出现两个文件夹build和dist,前面那个里面似乎是源程序(这个我不太清楚)....dist里面的就是编译好的.exe了.....ok....

Lesson 13 写一个简单的界面很容易
图形界面是非常有吸引力的东西。但是制作出来似乎不是那么容易,这个观点对于用C来笨拙写windows的窗口程序来说,是比较正确的。微软公司出品的windows是一个图形界面的操作系统,这个和dos或者linux这些不一样,他们一开始出来是针对字符界面的,然后再在上面加上一些库来提供图形的功能。windows则不同,它是包含在自己的最原始的功能之中,而这些图形功能的提供是在user32.dll这样的system目录下的dll文件中以函数导出的形式提供的,但是要使用这些东西必须使用c语言的函数接口,而且编写麻烦。有一个很大的wndproc中要填入所有的事件处理代码,非常丑陋。而作为脚本语言,所应该有的简洁性,python对这个进行了封装。但是事情不是如你所想象。中间过程非常复杂,而且python用的也不是自己的库,还是tcl的一个tk的库再封装了一次。虽然经过层层封装,裹得非常严实,但是除了影响其在比较高性能的图形场合下的应用之外,并没有带来太大的麻烦。你能够用很少的代码,来完成其他语言+库要很大行代码才能表达的图形样式,虽然非常简陋,不过足够使用。而且python除了自己原包装带的这个tkinter库之外,还有其他的第三方的选择,比较丰富,而且也有能够胜任各种应用的选择。甚至,还有opengl和directx的库的封装库,能够用来编写2d和3d的游戏,这个非常的诱人哦!

图形界面的奥秘其实并不深奥。我相信很多人学习windows编程都是从写一个窗口开始的,而且都是从尝试理解那个消息和事件驱动的模型入手的。大体的过程是这样的,窗口就是用象素画出来的。你可以把一个窗口想象成一个窗口,也可以把窗口看成一堆象素的集合。就像有人说看女色不过是皮肉色相一样。而且窗口中的按钮,编辑矿,各种图标,无论是什么看起来像一个”物体“的东西,其实本质上都是有应用程序或者是库或者是操作系统调用显卡的驱动,通过显卡的功能在屏幕上绘画一些点出来。而所谓的”物体“有很多称法,在windows中一般成为控件(control)。

而对于图形界面的操控一般是通过鼠标和键盘来完成的。鼠标在屏幕上有一个自己的形象,那就是一个箭头(当然你也可以调整这个图形为其他好玩的东西,it is your freedom)。而键盘呢则一般表示为一个虚线的框,表示这个是键盘的”焦点“所在的地方。或者是编辑框中闪动的竖杠。这两点中有一个共同点,就是都有一个位置来确定要操作的对象。你点下鼠标的时候,你操作的就是鼠标的箭头尖端指向的那个空间,而键盘按下也是在其焦点所在的控件那儿放声。发生的是什么呢?发生的过程从硬件层面到软件层面之后,最终是被操作系统接收。操作系统能够知道你是点击的是鼠标还是键盘,在什么一个地方点下的,而且按下的是左键还是右键。操作系统还知道当前窗口各处摆放的位置。综合各路的信息,操作系统就能够知道把这个”事件“作为”消息“发送给哪个窗口来处理。从中应该能够明白什么叫事件,而消息呢则是一个C中的结构体,其中有几个field中间放了有关这个事件的信息,然后就像一封信一样从操作系统投递到了窗口所在的应用程序。然后应用程序有一个事先注册的”窗口过程“,其实就是一个函数,用来接收这封“信”。其实就是接收到传过来的参数。然后再进行一些判断,作出一定的响应。这个就是所谓的事件驱动。在没有冗长的代码,和展示所有细节的情况下,如果你真的以前对这个过程一无所知,肯定会觉得非常茫然。这个一笔带过的叙述其实只是让你有一个感性的认识。其实在python中使用窗口根本不用管诸葛么多。基本上只是把自己要的窗口和控件,给一些位置的参数,一些文字的提示内容的参数就能把窗口摆好,显示出来。然后再通过代码告诉python,当“这个按钮按下的时候执行这个函数”,然后就能让窗口有响应。最后记得给一个退出窗口的办法就一切OK了。其中能省的复杂度基本上都被库给隐藏掉了。付出的代价是慢一些,但是我就不相信你能感觉出来,除非你用的电脑连vcd都看不流畅。所以大可放心的享受这种便利。

OK,下面来正式的看看怎么在python中创建一个窗口,然后显示出来。
 

Code:
  1. # -*- coding: cp936 -*-   
  2. #demo18.py   
  3. from Tkinter import *   
  4. root = Tk(className="interface"#className!!   
  5. w = Label(root) #w = Label(root,text="be your self")   
  6. w["text"] = "be your self"  
  7. w.pack()   
  8. v = Button(root)   
  9. v["text"] = "fire"  
  10. v.pack()   
  11. root.mainloop()  

注意一下Button和Label这些都是Tkinter这些库提供的,而button和Button这样大小写之间的差别仅仅是巧合,你能够随便的给变量取名字,但是Button和Label这些则是需要记住的东西,写代码的时候要经常用到的名字。但是点击按钮你会比较失望,因为并没有什么反应。不过也是当然的事情,你并没有告诉计算机对于这样一个按钮的点击操作需要作出一个什么样的反应来反馈给用户。而这个指定作出什么反应的工作只需要一个行,但是作出具体什么样反应的描述则需要新建一个函数来进行处理。
 

Code:
  1. #demo19.py 点击Button改变Label内容!   
  2. from Tkinter import *   
  3. def demo_fun():   
  4.     label["text"] = "Look!Changing the content!"  
  5. root = Tk(className="interface")   
  6. label = Label(root,text="be you self!")   
  7. label.pack()   
  8. button = Button(root,text="change it",command=demo_fun)   
  9. button.pack()   
  10. root.mainloop()  

button['command'] = on_click表示对于button(按钮)的点击属性用on_click这个函数来处理。而on_click函数也很简洁,只是把label的文本重新设置一下。这个完成了一个事件消息的处理,如果用C来写,需要比这个长更加不好懂的写法。另外你是否会对on_click中出现label这个变量比较奇怪呢?明明在on_click前面没有定义label这个变量啊。如果我在C中这么写程序,编译器一定会告诉我出错的。而python是怎么知道label这个变量存在,然后没有报错的呢?其实python在你写的时候根本就不用知道其是否存在,只是要在运行的时候找得到label就可以了。而运行的前后关系,是通过时间来关联的而不是代码上前后行的关系。这里由于label = Label(root)先于on_click执行,所以当on_click执行的时候,label就是一个已经定义的变量。如果没有定义呢?那就报告出错喽。

Code:
  1. from Tkinter import *   
  2. def on_click():   
  3.     label['text'] = text.get()   
  4. root = Tk(className='bitunion')   
  5. label = Label(root)   
  6. label['text'] = 'be on your own'  
  7. label.pack()   
  8. text = StringVar()   
  9. text.set('change to what?')   
  10. entry = Entry(root)   
  11. entry['textvariable'] = text   
  12. entry.pack()   
  13. button = Button(root)   
  14. button['text'] = 'change it'  
  15. button['command'] = on_click   
  16. button.pack()   
  17. root.mainloop()   


这个就比较复杂了。里面有一个StringVar。这个代表一个字符串,但是跟一般字符串不一样。一般的这样'dfsdf'的字符串是不可变的,你只能把变量指定为不同的字符串,但是字符串本身的内容是不可改变的。而StringVar则是可变的字符串。所以了set和get来设置和取得其内容。主要是entry(单行输入框)要求一个这样的属性来设置和接收其输入框的内容。一开始可能不习惯,但是用多了之后会觉得很方便的,因为只要用这个变量text,就能一直得到当前输入框的内容。当你能够完整的把这个例子看懂的时候,你已经入门了。但是离自己写一个有窗口的应用程序还有一定距离。主要是缺少更加丰富的控件和事件响应的处理能力,以及合理排版布局的能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值