python学习[第十三篇] 条件和循环
python学习[第十三篇] 条件和循环
if语句
单一if 语句
if语句有三个部分构成,关键字if本身,判断结果真假的条件表达式,以及表达式为真或非0是执行的代码
if expression:
expr_true_suite
条件表达式可以是多重的 通过布尔操作符 and or not来实现
单一语句的if 代码块,如果if语句的执行代码只有一行,可以放在一行来写
if expresssion: expr_tru_suite
>>> if True: print True ... True
else 语句
语法如下:
if expression: expr_true_suite else: expr_false_suite
elf 语句
可以有多个elif ,但只能由一个if 一个else , 语法如下
if expression1: expr1_true_suite elif expression2: expr2_true_suite elif expression3: expr3_true_suite .... elif expressionx: exprx_true_suite else: none_of_above_suite
python 中switch/case语句实现方法
我们可以通过字典来实现,注意字典后的值不要加引号,对应方法应在字典前定义好。
def insert_met(): print "this is insert_met" def delete_met(): print "this is delete_met" def update_met(): print "this is update_met" CMDs={"insert":insert_met,"delete":delete_met,"update":update_met} def choice(m): CMDs[m]() choice('insert') choice('update') choice('delete')
python中三元操作符的实现
X if C else Y
#推荐使用方法一 # 方法1 利用if else X if C else Y x=17 y=15 smaller= x if x<y else y #方法2 利用 布尔操作符 x=17 y=15 smaller=(x<y and [x] or [y] )[0] smaller
while 语句
while 语法格式如下
while expression: suite_to_repeat
计数循环
提前定义一个变量然后修改变量的值 , 然后通过判断该变量的条件表达式进行循环
count = 0 while count < 5 : print count count +=1
无限循环
无限循环不一定是坏事,通常用于网络服务器无限等待客户端连接。也可以用于其它情况,但一定要定义好break 的情况.
while True: always_true_suite
for 语句
for语句可以遍序序列成员,可以用在列表解析和生成器表达式中,他会调用迭代器的next方法,捕获StopIteration异常并结束循环。
for语句格式如下:
for itervar in iterable: suite_to_repeat
for 语句用在序列类型
通过序列项迭代
namelist=['pzq1','pzq2','pzq3'] for x in namelist: print x, 'shuaiqi boy'
通过序列索引迭代
namelist=['pzq1','pzq2','pzq3'] for x in range(len(namelist)): print namelist[x], 'shuaiqi boy'
通过序列项和索引迭代
namelist=['pzq1','pzq2','pzq3'] for x in range(len(namelist)): print '%d %s shuaiqi boy' % (x,namelist[x])
用于迭代器类型
用for循环访问迭代器和访问序列的方法差不多,唯一的区别就是for语句会做一些额外的事情。迭代器对象中有一个next()方法,调用后返回下一个条目。索引条目迭代完后,迭代器引发一个StopIteration异常告诉程序循环结束,for语句在内部调用next()方法。
range内建函数
基本用法
range (start,end,step=1)
range(start,end)
range(end)
>>> range(0,10,2) [0, 2, 4, 6, 8] >>> range(0,10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(10) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
xrange()和range()功能一样,不过当有大范围的列表是,xrange()更合适,因为不生成整个列表。
与序列相关的内建函数
sorted() zip()
enumerted(seq) 返回enumerate迭代器
reversed(seq) 返回reversed迭代器
break continue pass
break 语句跳出当前循环然后进入下一跳语句
continue结束本次循环,进入下一次循环
pass语句 NOP No Operation .什么都不做
else 语句 与while和for
python中while和for也可以与else 一起使用
#while-else while expression: suite_to_repeat else: suite_for_else #for-else for itervar in iterable: suite_to_repeat else: suite_for_else # break 与else,break 跳出循环后不会执行else >>> for x in range(0,5): ... if x == 2 : ... break ... print x ... else: ... print 'else' ...
迭代器
迭代器通俗来讲就是可以通过next()方法依次变量对象中元素的数据结构
如何迭代
通过next()方法来访问对象,不是通过索引。迭代器有一些限制,不能先后移动,不能回到开始,也不能赋值一个迭代器。
使用迭代器
常用的可迭代的python数据类型为 序列,字典和文件
迭代序列
>>> mytu = (123,'xyz') >>> i=iter(mytu) >>> i.next() 123 >>> i.next() 'xyz' >>> i.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
标准的访问迭代器的方法
fetch = iter(seq) while True: try: i = fetch.next() except StopIteration: break do_something_to(i) 例如: >>> fetch=iter(range(0,5)) >>> while True: ... try: ... i = fetch.next() ... except StopIteration: ... break ... print i ... 0 1 2 3 4
迭代字典
>>> x = { ('pzq','coder'):(1300,16500,0), ... ('pzq1','writer'):(1500,19990,0), ... ('pzq2','artist'):(2000,34000,0)} >>> x {('pzq', 'coder'): (1300, 16500, 0), ('pzq1', 'writer'): (1500, 19990, 0), ('pzq2', 'artist'): (2000, 34000, 0)} # 此例中 键是元组,值也是元组。为一种复杂的数据类型 >>> for i in x: ... print 'name is %s, Occupation is %s .' %(i) ... print 'month salary is %d, annual salary is %d, discount is %d ' % x[i] ... name is pzq, Occupation is coder . month salary is 1300, annual salary is 16500, discount is 0 name is pzq1, Occupation is writer . month salary is 1500, annual salary is 19990, discount is 0 name is pzq2, Occupation is artist . month salary is 2000, annual salary is 34000, discount is 0
迭代文件
f = open('test.txt') #print的时候结尾加了逗号,防止两次换行符的出现 for eachline in f: print eachline,
注意:不要在迭代可变对象的时候修改这个对象。
>>> myname=['pzq1','pzq2','pzq3','pzq4','pzq5'] >>> for i in range(len(myname)): ... print i,myname[i] ... del myname[i] ... 0 pzq1 1 pzq3 2 pzq5 3 Traceback (most recent call last): File "<stdin>", line 2, in <module> IndexError: list index out of range
通过iter()方法可以创建迭代器,通过reversed()和 enumerate()方法可以创建reversed类型的迭代器和enumerate(index,value) 类型的迭代器
列表解析 python2.0加入
列表解析表达式如下
[ expr for iter_var in iterable ]
扩展列表解析表达式
[ expr for iter_var in iterable if cond_expr ]
函数式编程
map filter
map 对所有列表成员应用一个操作
filter 基于一个表达式对列表成员过滤
>>> seq = [ 10,22,11,23,45,11,34 ] >>> map(lambda x: x **2 ,seq ) [100, 484, 121, 529, 2025, 121, 1156] #[ expr for iter_var in iterable ] >>> [ x**2 for x in seq ] [100, 484, 121, 529, 2025, 121, 1156] >>> filter(lambda x: x%2 ,seq) [11, 23, 45, 11] #[ expr for iter_var in iterable if cond_expr ] >>> [ x for x in seq if x%2 ] [11, 23, 45, 11] >>> map(lambda x: x**2 ,filter(lambda y : y%2,seq )) [121, 529, 2025, 121] #[ expr for iter_var in iterable if cond_expr ] >>> [ x**2 for x in seq if x%2 ] [121, 529, 2025, 121] >>> [ (x,y) for x in range(0,5) for y in range(0,5) ] [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4)]
生成器表达式 python2.2加入
生成器表达式是列表解析的一个扩展,生成器是特定的函数,允许返回一个值,然后'暂停'代码的执行,稍后恢复。因为列表解析一个不足就是一次生成所有的数据,用以创建列表,如果数据量巨大,会对内存有很大影响。生成器表达式就是为了解决此问题。生成器表达式不返回一个字典,而是返回一个生成器,这个生成器在每次计算一个条目后,把这个条目yield出来。生成器采用了延迟计算,这与 range()和xrange()类似。
(expr for iter_var in iterable if cond_expr)
列表解析
[expr for iter_var in iterable if cond_expr]
f = open('c:/test.py','r') #列表解析 获取总长度 sum([len(word) for line in f for word in line.strip()]) #生成器表达式获取长度,删除两边的[] f.seek(0) sum(len(word) for line in f for word in line.strip()) #os获取长度 import os os.stat('c:/test.py').st_size #获取最长的一行的长度 #列表解析 maxlines = max([len(x.strip()) for x in open ('c:/test.py','r')]) #生成器表达式 maxlines = max(len(x.strip()) for x in open('c:/test.py','r')) # >>> rows=[1,2,3] >>> def cols(): ... yield 15 ... yield 16 ... yield 17 ... >>> products=((i,j) for i in rows for j in cols()) >>> type(products) <type 'generator'> >>> for pair in products: ... print pair ... (1, 15) (1, 16) (1, 17) (2, 15) (2, 16) (2, 17) (3, 15) (3, 16) (3, 17) >>> type(pair) <type 'tuple'>
### end