python学习之 —— 条件和循环

if 语句
由三部分组成:关键字本身,用于判断结果真假的条件表达式,以及当表达式或者非零时执行的代码块

if expression:
    expr_true_suite

expr_true_suite只有在代码块条件表达式结果的布尔值为真实才执行,否则继续执行跟在该代码块后面的语句
多重条件表达式
单个 if 语句可以通过使用布尔操作符 and or 和 not 实现多重判断条件或是否定判断条件

if not warn and (system_load >= 10 ):
   print "WARNING: losing resources"
   warn = warn + 1

单一语句的代码块
如果一个复合语句的代码块仅仅包含一行代码,那么它可以和前面的语句写在同一行上
 if make_hard_copy: send_data_to_printer()
else 语句

if expression:
   expr_strue_suite
else:
   expr_false_suite
下面是样例代码:

if passwd == user.paswd:
    ret_str = "password accepted"
    id = user.id
    valid = True
else:
    ret_str = "invalid password entered.. try again!"
    valid = False

elif (即 elif-if ) 语句
elif 是 python的 else-if 语句,它检查多个表达式是否为真,并在为真时执行特定代码中的代码。和 else 一样, elif 声明是可选的,然而不同的是,if 语句后最多只能有一个 else 语句,它检查多个表达式是否为真,并在为真时执行特定代码中的代码。和

if expression1:
    expr1_true_suite
elif expression2:
    expr2_true_suite
        :
elif expressionN:
    exprN_true_suite
else:
    none_of_the_above_suite

while 语句
python 的 while 是本章我们遇到的第一个循环语句。事实他是一个条件循环语句。与if声明相比,如果if后的条件为真,就会执行一次相应的代码块。
一般语法:
while expession:
    suite_to_repeat
while 循环的suite_to_repeat 子句会一直循环执行,直到 expression 值为布尔假。这种类型的循环机制常常用在计数循环中

计数循环

count = 0
 while (count<9):
     print ‘the index is:‘,count
     count + = 1
>>> count = 0
>>> while (count<9):
     print ‘the index is:‘,count
     count  = count + 1
the index is: 0
the index is: 1
the index is: 2
the index is: 3
the index is: 4
the index is: 5
the index is: 6
the index is: 7
the index is: 8
>>>


无限循环

for 语句
python 提供给我们的另一个循环机制就是for语句。它提供了python中最强大的循环结构。

for iter_var in iterable:
    suite_to_repeat

每次循环,iter_var迭代变量被设置为可迭代对象(序列,迭代器或其它支持迭代的对象) 的当前元素,提供给 suite_to_repeat语句块使用

用于序列类型
字符串

>>> for eachLetter in ‘Names‘:
    print ‘current letter: ‘, eachLetter
current letter:  N
current letter:  a
current letter:  m
current letter:  e
current letter:  s
>>>

当迭代字符串时,迭代变量只会包含一个字符串。但这并不常用。在字符串中查找字符时,程序员往往使用in来测试成员关系,或者使用string模块中的函数以及字符串方法来检查字符串。

看到单个的字符串在一种情况下有用,即在通过 print 语句调试 for 循环中的序列时,如果你在应该看到字符串的地方发现的却是单个字符,那么很有可能你结婚搜到的是一个字符串,而不是对象的序列

迭代序列有三种基本方法:
1. 通过序列项迭代

>>> nameList = [‘Walter‘,‘Nicole‘,‘Steven‘,‘Henry‘]
>>> for eachName in nameList:
    print eachName, ‘Lim‘
Walter Lim
Nicole Lim
Steven Lim
Henry Lim
>>>

2. 通过序列索引迭代

>>> nameList = [‘Cathy‘,‘Terry‘,‘Joe‘,‘Heather‘,‘Lucy‘]
>>> for nameIndex in range(len(nameList)):
    print ‘Liu‘,nameList[nameIndex]
Liu Cathy
Liu Terry
Liu Joe
Liu Heather
Liu Lucy

3. 使用项和索引迭代
两全其美的办法是使用内建的 enumerate() 函数

>>> len(nameList)
5
>>> range(len(nameList))
[0, 1, 2, 3, 4]
>>>
>>> namelist = [‘Donn‘,‘Shirley‘,‘Ben‘,‘Janice‘,‘David‘,‘Yen‘,‘Wendy‘]
>>> for i,enchLee in enumerate(namelist):
    print ‘%d %s Lee‘ % (i+1,enchLee)
1 Donn Lee
2 Shirley Lee
3 Ben Lee
4 Janice Lee
5 David Lee
6 Yen Lee
7 Wendy Lee

关于迭代器以后会详细描述,现在只是大致了解

range() 完整语法,完整语法要求提供两个或三个整型参数
range(start, end , step = 1)

range() 会返回一个包含所有 K 的列表,这里 start <= k < end ,从start 到end,k每次递增 step。step不可以为0,否则将发生错误

>>> range(2,19,3)
[2, 5, 8, 11, 14, 17]


如果给两个参数,而省略step,step就使用默认值1

>>> range(3,7)
[3, 4, 5, 6]


解释器环境下的例子

>>> for eachVal in range(2,19,3):
    print "Value is :", eachVal
Value is : 2
Value is : 5
Value is : 8
Value is : 11
Value is : 14
Value is : 17


再来回顾 range() 的语法

range(start, end , step = 1)


默认下,start为0,step为1,如果丹单纯的给定一个数字那么就是下面的形式了
range(0,n,1) 这样的了,下面给个5

>>> range(5)
[0, 1, 2, 3, 4]


下面的例子必须要先定义好count

>>> for count in range(2,5):
    print count
2
3
4


xrange()  内建函数
xrange() 类似 range() ,不过当你有一个很大的范围列表时,xrange() 可能更为适合,因为它不会在内存里创建列表完整拷贝。它只被用在 for 循环中, for 之外没有意义。  

与序列相关的内建函数
sorted() , reversed() ,zip()
下边是使用循环相关和序列相关函数的例子。
sorted()和 zip()返回一个序列(列表),而另外两个函数返回迭代器(类似序列)

>>> albums = [‘Poe‘,‘Gaudi‘,‘Freud‘,‘Poe2‘]
>>> years = (1922,1912,1932,2003)
>>> for album in sorted(albums):
    print album,
Freud Gaudi Poe Poe2
>>> for album in reversed(albums):
    print album,
Poe2 Freud Gaudi Poe
>>> for i,album in enumerate(albums):
    print i,album
0 Poe
1 Gaudi
2 Freud
3 Poe2
>>>
>>> for album,yr in zip(albums,years):
    print yr,album
1922 Poe
1912 Gaudi
1932 Freud
2003 Poe2



break 语句
break 可以结束当前循环后跳转到下一条语句,类似C中的传统break。常用在某个外部条件被触发(一般通过if语句检查),需要立即从序号中退出时,break 语句可以用在 while 和 for 循环中

>>> num = 32
>>> count = num /2
>>> while count > 0 :
    if num % count == 0:
        print count ,‘is the largest factor of‘,num
        break
    count -=1
16 is the largest factor of 32
>>> num = 33
>>> count = num /2
>>> while count > 0 :
    if num % count == 0:
        print count ,‘is the largest factor of‘,num
        break
    count -=1
11 is the largest factor of 33



pass 语句,非常有趣的一个语句,如果需要在语句块的地方写程序 ,而没有写,或是等会在完善的,那么空着就会报错了,而用pass就表示啥都不要做。这个方法太棒了,据说是从汇编借用来的

def foo_func():
    pass
if user_choice == ‘do_calc‘:
    pass
else:
    pass

这样的代码,在开发的时候作为调试非常有用的,有时候我们需要定下结构后再写上代码,如果不想让这段代码干扰其他代码,那么用这个pass非常有用了

迭代器和 iter()
什么是迭代器:
它为类序列对象提供了一个类序列的接口。
为什么要使用迭代器?
提供了可扩展迭代器接口
对列表迭代来了性能上的增强
在字典迭代中性能提升
创建真正的迭代接口,而不是原来的随机对象访问
与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后兼容
迭代非序列集合(例如映射和文件)时,可以创建更简洁的代码

如何迭代?
迭代器就是有一个next() 方法的对象,而不是通过索引来计数。当一个循环机制(例如 for 语句)需要下一个项时,调用迭代器的 next() 方法就可以获得它。条目全部取出后,会引发一个stopiteration异常,并不是错误发生,只是告诉外部调用者,迭代完成


参考书:《python核心编程2》

迭代器明天再写,昨晚上写完发现网络断掉了,今天才能上传的。今晚上学习循环语句,不过还剩下迭代没有学完啊

发现一个问题:记录总是好的,做题能发现很多问题,多做题啊 。以后多花点时间做题和复习,自己写的笔记都不阅读?还有什么人来看你的笔记了?代码质量又如何提高了?

python学习之 —— 条件和循环,布布扣,bubuko.com

python学习之 —— 条件和循环

上一篇:java 读取固定文件夹下的文件(和上篇差不多)


下一篇:P5143 攀爬者