Scalers点评:在2015年,ScalersTalk成长会完成Python小组完成了《Python核心编程》第1轮的学习。到2016年,我们开始第二轮的学习,并且将重点放在章节的习题上。Python小组是成长会内部小组,如果你想和我们一起学习Python,你需要是成长会成员,并且完成相关进群任务。
我们的节奏是行动是一周一章学到位,章节习题都会一个一个过。通过到位地执行,达到实质性的提升。
往期日志:
这是本周学习笔记的第1部分。
本周学习情况
本周(20160307-20160313)学习第八章,章节内容为《条件和循环》。本周复盘主持人为wojoin。
本章主要内容
-
8.1 if语句
-
8.2 else语句
-
8.3 elif语句
-
8.4 条件表达式
-
8.5 while语句
-
8.6 for 语句
-
8.7 break语句
-
8.8 continue语句
-
8.9 pass语句
-
8.10 再谈else语句
-
8.11 迭代器和iter函数
-
8.12 列表解析
-
8.13 生成器表达式
-
8.14 相关模块
-
8.15 练习
8.1 if 语句
if expression: expr_true_suite
多个条件的可以使用and,or,not
8.2 else 语句
if expression: expr_true_suite
else: expr_false_suite
由于使用了缩进作为代码块的边界,避免else与if的单语句匹配问题。
举个例子
8.3 elif (else-if 语句)
if expression1: expr1_true_suite
elif expression2: expr2_true_suite
elif expressionN: exprN_true_suite
else: none_of_the_above_suite
也可以使用成员关系操作符in/not in和序列或者字典的配合来满足我们的需求
8.4 条件表达式(三元操作符)
可以使用C and [X] or [Y])[0]来模拟条件表达式(完成条件判断和赋值操作),社区有不同的方案,参见PEP 308
Python 2.5 中加入的语法确定为: X if Celse Y———
true_part if condition else false_part
#条件表达式
def condition_expression(condition,true_part, false_part): return (condition and [true_part] or [false_part])[0]
def min(x, y): smaller = (x < y and [x] or [y])[0]
return smaller #Python 自带的条件表达式
def min2(x, y): smaller = x if x < y else y
return smaller
8.5 while 语句
while expression: suite_to_repeat
8.6 for 语句
for iter_var in iterable: suite_to_repeat
每次循环iter_var迭代变量狐会被设置成可迭代对象(list,tuple,dict,str) 的当前元素
-
序列类型的迭代
-
通过序列项迭代
-
通过索引迭代
-
通过项和索引来迭代
#通过序列项迭代 nameList =['Walter','Nicole','Steven','Henry']
for eachName in nameList:
print eachName #通过索引迭代--通过索引取元素
for index in range(len(nameList)):
print nameList[index] #通过项和索引来迭代 seasons = ['Spring', 'Summer', 'Fall','Winter']
for index, value in enumerate(seasons):
print index,"--",value
for index, value in enumerate(seasons,start=1):
print index,"--",value
for index, value in enumerate(seasons,start=5):
print index,"--",value #output start 的默认值为0
0 -- Spring
1 -- Summer
2 -- Fall
3 -- Winter #start=1
1 -- Spring
2 -- Summer
3 -- Fall
4 -- Winter #start=5
5 -- Spring
6 -- Summer
7 -- Fall
8 -- Winter
从性能方面思考,直接迭代序列要比通过索引迭代快。(参见8-13)
迭代器对象有一个 next方法, 调用后返回下一个条目. 所有条目迭代完后, 迭代器引发一个StopIteration异常告知程序循环结束. for 语句在内部调用next并捕获异常。
-
range内建函数
range 完整语法
range(start, end, step =1)
range返回的list
xrange返回xrange object—Thexrange type is an immutable sequence which is commonly used for looping.
区间为[start, end)(左开右闭)每次递增step,并且step不可以为零,否则将会引发异常。
如果只给start和end,则step默认为1
print range(3, 7) [3, 4, 5, 6]
for eachVal in range(2, 19, 3):
print " ",eachVal,
2 5 8 11 14 17
#loop in C
for (eachVal = 2; eachVal < 19; eachVal+= 3) { printf("valueis: %d
", eachVal); }
range 简略语法
range(end)—此时start默认为0,step默认为1
range(start, end)—此时step默认为1
xrange 内建函数
当有一个很大的范围列表时,xrange更为合适。
xrange只被用在for循环中,在for循环外使用是没用的。
range函数会在内存里创建列表的完整拷贝,而xrange函数不会。
与序列相关的内建函数
sorted,zip-返回一个序列(列表)
reversed,enumerate-返回迭代器(Iterator—Java,ContainerType::iterator-C++)
albums = ('Poe','Gaudi','Freud','Poe2') years = (1976, 1987, 1990, 2003)
for year, album in zip(years, albums):
print year, album
1976 Poe
1987 Gaudi
1990 Freud
2003 Poe2
8.7 break 语句
结束当前循环然后跳转到下面的语句
#the largest divisor of a given number num--数字 num 的最大约数
def largestDivisor(num): divisor = num / 2 while divisor > 0:
if num % divisor == 0:
print divisor,'is the largest factor of ', num
break divisor -= 1
for div in range(100): largestDivisor(div)
21 is the largest factor of 42
#greatest common divisor--最大公约数 #greatest common divisor=GCD
def GCD(num1, num2): if num1 % num2 == 0:
print num2,"is greatest common divisor",num1
return if num2 % num1 == 0: print num1,"is greatest common divisor",num2
return factor1 = num1 / 2 factor2 = num2 / 2 while True: #factor1
while factor1 > 0:
if num1 % factor1 == 0 :
break factor1 -= 1 #fator2
while factor2 > 0:
if num2 % factor2 == 0 :
break factor2 -= 1 if num1 % factor2 == 0:
print factor2,"is greatest common divisor ",num1, " and", num2
break if num2 % factor1 == 0:
print factor1,"is greatest common divisor ",num1, " and", num2
break
GCD(6, 12) GCD(12, 12) GCD(27, 36)
6 is greatest common divisor 6 and 12
12 is greatest common divisor 12 and 12
9 is greatest common divisor 27 and 36
8.8 continue 语句
遇到 continue 语句时, 程序会终止当前循环,并忽略剩余的语句, 然后回到循环的顶端。
在开始下一次迭代前
-
如果是条件循环, 将验证条件表达式是否成立
-
如果是迭代循环,将验证是否还有元素可以迭代只有在条件为真或者有元素可迭代时才开始下一次迭代
#用户最多输入3次密码
def checkPassword: valid = False count = 3 while count > 0: #check for valid passwd
for eachPasswd in ('123','1234','12345'): input = raw_input("enter password: ")
if input == eachPasswd: valid = True break if not valid:
print "invalid input" count -= 1 print "input password left",count," times " continue else: #login success break if valid:
print "login success" break; #输入成功的 enter password: 123
login success #输入3次不成的 enter password: 12
invalid input input password left 2 times enter password: 1q2w invalid input input password left 1 times enter password: 1q2w3e invalid input input password left 0 times
8.9 pass 语句
如果你在需要子语句块的地方不写任何语句, 解释器会提示你语法错误。
pass语句表明NOP=No OPeration,这在开发中可以作为一个标识,表明将来要完成的代码。
ScalersTalkID:scalerstalk
本微信公众号作者Scalers,游走在口译世界的IT从业者。微信公众号ScalersTalk,网站ScalersTalk.com,口译100小时训练计划群C 456036104
成长会是由Scalers发起的面向成长、实践行动,且凝聚了来自全球各地各行各业从业者的社群。有意入会者请和Scalers直接联系,我和其他会员会和你直接交流关于成长行动等各方面的经验教训。2016年成长会持续招募中,参见做能说会写的持续行动者:ScalersTalk成长会2016年会员计划介绍(2016.2更新)
