Lesson 5 Python中的输入与判断
健全的程序大凡都需要输入的功能,所以要学习一下简单的输入:
输入要使用的是raw_input或者input函数,区别是raw_input直接把你的输入作为字符串返回,而input则在raw_input的基础上把字符串转换为数字返回(如果你输入$@#$$怎么办?自己试试看)。我们就利用这两个输入函数来作一些有趣的事情。
代码:
your_name = raw_input("please input your name:") hint = "welcome! %s" % your_name print hint |
不简单吧,还有%呢。%s表示在这个位置插入一个字符串,%表示把后面提供的参数“推”入前面的字符串中,所以推的结果是把%s推出去了,把your_name给填入那个地方了。printf知道吧,C中的printf就是一样的嘛。
代码:
inputed_num = 0 while 1: inputed_num = input("input a number between 1 and 10\n") if inputed_num >= 10: pass elif inputed_num < 1: pass else: break print "hehe, don't follow, won't out" |
pass就是pass了,过了嘛,什么都不干了。break就是跳出这个while 1(无穷循环,1总是真的,while总是执行)。\n是换行,不会全部忘光了吧。
Lesson 6 Python余兴节目
from Tkinter import * root = Tk() w = Label(root, text="Hello, world!") w.pack() root.mainloop() |
呵呵,一次太超前了一点,不过也不是解释不清楚。我干脆也不解释了吧。给大家增进一点兴趣。
---------
还是解释一下
fromt Tkinter import *
是引入一个模块,这个模块用来创建GUI(Graphic User Interface)窗口
Tk()创建了一个主窗口
Label()创建一个标签
Label的第一个参数是root表明Label是在这个主窗口中的。
w.pack()是指用缺省的方式把Label放置在主窗口中
root.mainloop()开始了一个循环,是等待你的输入的循环。
Lesson 7 Python基本语法要素齐动员
现在的目的是尽量想出一个用的东西仅限于内置的变量类型和语句的一个综合的例子,我想还是那个联系人表的例子吧
################ #呵呵,还忘记了讲注释 #第一个算是完整的程序 ################ contact = {} contact_list = [] while 1: contact['name'] = raw_input("please input name: ") contact['phone'] = raw_input("please input phone number: ") contact_list.append(contact.copy()) go_on = raw_input("continue?\n") if go_on == "yes": pass elif go_on == "no": break else: print "you didn't say no\n" i = 1 for contact in contact_list: print "%d: name=%s" % (i, contact['name']) print "%d: phone=%s" % (i, contact['phone']) i = i + 1 |
首先是回忆一下字符串
字符串既能够用""也能够用''。然后是很有特色的%操作,起到格式化字符串的作用,前面仅仅在字符串中有一个%s,现在有%d和%s两个,分别代表插入十进制数值和字符串于%x标记的位置处。
然后是列表
列表是顺序的序列,用append在后面附加,也能构用索引值索引。所以我们完全可以用一个变量保存len(contact_list)得到的长度,然后一个个的遍历,不过这里展示了另外一种非常方便的方法。而且值得注意的是append()中的参数,我使用了contact.copy(),你可以尝试着把copy()给去掉,观察结果你就知道了所谓的append是怎么干的了,特别是你对指针之类的东西很有感觉的话(但是在Python中是没有指针这个概念的)
再来看看字典
字典是键(key)和值(value)的对应组合成的无序的序列。所以你存的时候要指明键(name或者phone),而且取的时候也是一样的。
接下来是判断
if是很好用的,==表示判断两个是否相等,=表示把右边的赋给左边的。而且可以直接判断字符串是否相等,这个太方便了,如果你曾经用过strcpy()的话,就知道了。elif是表示else if的意思,如果if不满足就判断elif的条件是否满足,最后是到else中去。
循环是个主体
while和for都是循环。不过这里while就没什么说的了,又是很经典的while 1,死循环,然后必须在里面用break来跳出。for和C中的for是不一样的,for in才是一个完整的语句,指的是从一个能够逐一取值的序列中(比如list),一个一个的取出值赋给for后面指定的变量中,直到取空,循环结束。其实回想一般用C中的for的经历,也大体如此。而且你还可以用for i in range(1,100)来指定一个范围从多少到多少。可以说for in充分体现了python的体贴周到,用起来很直观,不会绕弯。
接下来就是运行了,大家慢慢调试吧。下次可能是讲异常处理,因为我觉得在深入到使用各种高级的要素之前,先要学会怎么去处理异常。最常见的异常应该是input(),然后你给出的输入是一个无法转换为数字的字符串了,那么我们就要来处理它。
Lesson 8 Python中的错误检测
写程序什么最重要?完成功能最重要。但是程序中难免要有用户的输入,对于这些写的时候未可预知的因素中间可能出现的错误,一般称作异常。对于异常情况的处理,不同语言有不同的做法,比如检查函数的返回值之类的,但是那种办法会把代码弄成一团浆糊。Python在这个方面是比较先进的,我们从一个例子来看看:
呵呵,看不同吧。其实input是输入,print是输出。也就是把输入的东西立即输出。但是这个和
有什么不同呢?
不同的地方是,input()会在raw_input()接收了“
字符串”的输入之后进行一些处理,比如你是输入1+2,然后输出的就是3了,而raw_input就是原原本本的1+2的输出了。用代码表示就是
eval是求表达式的值,任何一个简单的python表达式,就像1+2这样的作为字符串送入,就能把值从eval处理之后取出来。
现在你实验一下"sdfsdf”之后,你会发现提示你
提示:
Traceback (most recent call last): File "", line 1, in -toplevel- input() File "", line 0, in -toplevel- NameError: name 'sdfsdf' is not defined |
如果输入其他稀奇古怪的字符串还可能有其他的出错提示,我们现在要做的就是捕捉这种由用户输入引起的错误。这么来作:
try: print input() except: print 'there is an error in your input' |
这下你无论怎么输入都不会有什么其他的提示了,就是自己设定的print语句作为提示。现在把try except的组合去掉,回到print input()你再尝试一下:
1/0
这个显然是一个错误,被零除的错误。那么专门来捕捉一下这个错误:
try: print input() except ZeroDivisionError: print 'can not be divided by zero' |
这下你能够捕捉到被零除的错误了。然后你再尝试其他的输入,可能错误就没有被捕捉了。所以再补上:
try: print input() except ZeroDivisionError: print 'can not be divided by zero' except: print 'there is an error in your input' |
注意,捕捉所有错误的except必须放在所有的except的最后一位。明白了?OK
还有更多的能够捕捉的错误,自己查手册吧(暂时看不了手册没关系,慢慢来嘛)。以后还能够自己raise(引发)异常呢。不过那都是比较高级的应用了,对于出错处理从一开始就有这个印象,并牢记在心中对于以后写大一些的软件很有好处。
Lesson 9 走向模块化的第一步
大规模的程序设计需要你把一个大的程序拆分成n个模块。然后把模块进行组合,交互成为一个完整的程序。你不可能像现在这样,从顶写到尾。。。
那么我们从
函数开始。
def square(x): return x**2
print square(5) |
简单吧,这个是我看过的函数定义中最简洁的。def表示这个开始定义一个函数,x是参数,参数是不需要类型的,因为python是不需要明确指出类型的。return是返回值,返回的值插入到调用函数的地方。再复杂一些
def multiply(a, b): return a*b
print multiply(1,2) |
这是两个参数的函数。那么返回两个值呢?
def swap(a, b): return (b,a) print swap(1,2) |
呵呵,其实这里返回的并不是两个值,而是一个值。怎么说呢。(b, a)就是一个东西,是一个元组(turple),你可以用这样的方式成生一个元组,并使用它。元组是基本的变量类型:
my_turple = (1, 2, 3) my_list = [] for i in my_turple: my_list.append(i) print my_list |
其实元组和列表非常像,但是列表的长度是可以变化的,而且成员是可以改变的。但是元组是什么都不能变的,是只读的。
对于高级一点的话题:传递进来的参数是否可以被修改,这个问题取决于你传递了什么近来。如果是数字或者字符串,是不能够改变的,但是如果是这样的:
def test_func(list_be_passed): list_be_passed[0] = 'towin' my_list = ['taowen'] print my_list test_func(my_list) print my_list |
就能够改变传递近来的参数了,所以处理的时候要小心,必要的时候copy一下再传递。
函数简单吧,但是很好用的。想起C中的函数那么那么多麻烦,真是感慨万千啊。下面是应该讲GUI编程呢,还是面向对象呢?思考一下
Lesson 10 Python的文件操作
文件操作....是一个语言和外界联系的主要方法....现在以txt为例简单的讲一下...
首先是建立关联...假设在存在以下文件 c:\a.txt
This is line #1 This is line #2 This is line #3 END |
>>> xxx = file('c:\\a.txt', 'r') |
关键字的第一部分,是文件路径及名称。注意这里面,路径需要用
\\第二部分,是对文件的模式或者叫权限,一般有以下3种 "r" (read), "w" (write)和 "a"(append).
之后,就可以利用
xxx_content = infile.read()
xxx_content = infile.readlines()
来读取文件内容了
>>> xxx = file('c:\\a.txt', 'r') >>> xxx_content = xxx.read() >>> print xxx_content This is line #1 This is line #2 This is line #3 END >>> xxx.close() >>>
>>> infile = file('c:\\a.txt', 'r') >>> xxx = file('c:\\a.txt', 'r') >>> for xxx_line in xxx.readlines(): print 'Line:', xxx_line Line: This is line #1
Line: This is line #2
Line: This is line #3
Line: END >>> xxx.close() >>> |
然后是文件的写入
>>> xxx=file('c:\\test.txt','w') >>> xxx.write('billrice') >>> xxx.write('testtest') >>> xxx.write('enter\n') >>> xxx.writelines(['billrice','ricerice']) >>> xxx.close() >>> >>> xxx=file('c:\\test.txt','r') >>> content=xxx.read() >>> print content billricetesttestenter billricericerice >>> |
需要注意的是...在
xxx.close()之前,c盘下面只有一个空空的test.txt,xxx.close()的作用相当于最后的存盘。