欢迎来到我的博客园

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

posted @ 2018-07-23 16:04  panzq  阅读(207)  评论(0编辑  收藏  举报