Python核心编程-第八章
2016-06-07 00:00
387 查看
摘要: 条件与循环
个人觉得这本书不好,因为之前的练习题都把条件循环用上了,现在才来学,本末倒置啊
if expression:
ecpr_true_suite
只有在if 后面的布尔值为True,在实行后面的描述,没什么多说的。
expr_true_suite
else:
expr_false_suite
如上这种格式,两个是互补的,要么执行前者要么执行后者,所以,两者的合集就是全集。
expr1_true_suite
elif expression2:
expr2_true_suite
elif expressionN:
exprN_true_suite
else:
none_of_the_above_suite
就是以上的格式,不需多讲
书上发现了个有意思的方法:
这么做省去了很多的elif,
还有:
这个好处是用字典比for或者if查询要快得多
C语言上有个
C?X:Y,C为True时候取X值,为False的时候取Y值
用Python来写就是
一般在客户端或者服务器,需要一直循环下去
iter_var每次从迭代对象iterable中依次选出一个元素,执行suite_to_repeat
1.通过序列项迭代
这个经常用,变量每回都被设置为列表中特定的某个元素
2.通过序列索引迭代
觉得每次还要从新运行len这个函数,不好
3.使用项和索引迭代
迭代项和索引的终极方法,运用enumerate函数
迭代器对象有个next()方法,调用后返回下个条目,所有条目迭代完以后,迭代器引发一个 StopIteration异常告诉程序循环结束。而for在内部调用next()并捕获异常
range() 会返回一个包含所有 k 的列表, 这里 start <= k < end , 从 start 到 end , k 每 次增加step
我发现一个比较严重的问题,先声明一下,我目前正在从Python2往Python3转,所以之后的习题都会在Python3运行。
问题就是,在Python3中
并没有返回一个列表!而在python2中则是
那么,究竟怎么创造一个range()的list呢?查了一下收获不小,比方我要一个从1到9的整数列表,
用了个list的函数,恩恩就酱
值得一提的是这个zip函数,它变了,没错!它在Python3中变了
2.7是直接zip()函数就会返回一个列表,现在看来必须用list才能显示
这个例子是用来求解一个数的最大公约数
这个语句的意思就是遇到continue语句的时候,程序终止当前循环,并且忽略剩下的语句,回到循环的顶端
这个用来实现密码登录问题,还行 ,值得一看
这种语句可以用来先定性结构,不干扰其他代码
在循环中使用时,else子句只在循环完成后执行,也就是说break语句也会跳过else。
说这么多不如看代码:
当n=3的时候,就break跳出while循环了,else也不执行了。如果这个while循环正常执行完,则else内容也执行,如下
凡是可作用于next()函数的对象都是
2.字典
之前讲到过字典的迭代,有keys(),value(),items()
3.文件
这个知道就好,下一章节会讲到文件的迭代,迭代器会自动调用readline()这个方法
[expr for iter_var in iterable]
还有一种,[expr for iter_var in iterable if cond_expr]
这种方法叫做列表解析,要记住,以后会用得到的
如果列表元素可以按照某种算法推算出来,那我们可以在循环的过程中不断推算出后续的元素。这样就不必创建完整的list,从而节省大量的空间。它就是生成器。
这个东西是特定的函数,允许返回一个值,然后‘暂停’代码的执行,稍后恢复
列表解析: [expr for iter_var in iterable if cond_expr]
生成器表达式:(expr for iter_var in iterable if cond_expr)
仅仅是圆括号和方括号的区别
举得例子很不错,但是由于自己没有学到文件打开,而且代码不够清真。
引用一点廖雪峰的资料吧,生成器只是存储了一个计算方法,想要显示它要么用next()函数,一次显示一个,要么用下面的方法迭代出来
觉得写的质量大不如前了。所以,只能这样了,而且这些内容也比较基础,但是对于课后题我还是会好好的去完成!
个人觉得这本书不好,因为之前的练习题都把条件循环用上了,现在才来学,本末倒置啊
8.1 if 语句
语法if expression:
ecpr_true_suite
只有在if 后面的布尔值为True,在实行后面的描述,没什么多说的。
8.1.1 多重条件表达式
就是可以和布尔操作符and、or和not一起实现8.1.2 单一语句代码
就是本来该分行缩进的语句,用‘:’分开放在同一行,一半不推荐这么用8.2 else语句
if expression:expr_true_suite
else:
expr_false_suite
如上这种格式,两个是互补的,要么执行前者要么执行后者,所以,两者的合集就是全集。
8.3 elif语句
f expression1:expr1_true_suite
elif expression2:
expr2_true_suite
elif expressionN:
exprN_true_suite
else:
none_of_the_above_suite
就是以上的格式,不需多讲
书上发现了个有意思的方法:
if user.cmd in ('create', 'delete', 'update'): action = '%s item' % user.cmd else: action = 'invalid choice... try again!'
这么做省去了很多的elif,
还有:
msgs = {'create': 'create item', 'delete': 'delete item', 'update': 'update item'} default = 'invalid choice... try again!' action = msgs.get(user.cmd, default)#复习一下get函数,对于key(这里指user.cmd),返回它的value,如果没有, #则返回default,默认是none
这个好处是用字典比for或者if查询要快得多
8.4 条件表达式(‘三元操作符’)
好吧,被这种代码风格打败了,是折服了~~C语言上有个
C?X:Y,C为True时候取X值,为False的时候取Y值
用Python来写就是
>>> x, y = 4, 3 >>> smaller = x if x < y else y >>> smaller #需要注意的是,没有任何的冒号 3
8.5 while语句
while代码块会一直执行,直到循环条件不为真8.5.1 一般语法
while expression: suite_to_repeat
8.5.2 基数循环
count = 0 while (count < 9):#这个括号不用也罢 print 'the index is:', count count += 1
8.5.3 无限循环
while True: handle, indata = wait_for_client_connect() outdata = process_request(indata) ack_result_to_client(handle, outdata)
一般在客户端或者服务器,需要一直循环下去
8.6 for语句
8.6.1 一般语法
for iter_var in iterable: suite_to_repeat
iter_var每次从迭代对象iterable中依次选出一个元素,执行suite_to_repeat
8.6.2 用于序列类型
迭代序列的三种基本方法: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
觉得每次还要从新运行len这个函数,不好
3.使用项和索引迭代
迭代项和索引的终极方法,运用enumerate函数
>>> nameList = ['Donn', 'Shirley', 'Ben', 'Janice', ... 'David', 'Yen', 'Wendy'] >>> for i, eachLee in enumerate(nameList): ... print "%d %s Lee" % (i+1, eachLee) ... 1 Donn Lee 2 Shirley Lee 3 Ben Lee 4 Janice Lee 5 David Lee 6 Yen Lee 7 Wendy Lee
8.6.3 用于迭代器类型
这一节没啥多大作用,就是说了for也可以循环访问迭代器,迭代器对象有个next()方法,调用后返回下个条目,所有条目迭代完以后,迭代器引发一个 StopIteration异常告诉程序循环结束。而for在内部调用next()并捕获异常
8.6.4 range()内建函数
额,这个难道之前的 章节没有讲到吗?怎么感觉重复了呢?还是稍微写一下吧range(start, end, step =1)
range() 会返回一个包含所有 k 的列表, 这里 start <= k < end , 从 start 到 end , k 每 次增加step
我发现一个比较严重的问题,先声明一下,我目前正在从Python2往Python3转,所以之后的习题都会在Python3运行。
问题就是,在Python3中
>>> range(6) range(0,6) >>> type(range(6))
并没有返回一个列表!而在python2中则是
>>> range(6) [0,1,2,3,4,5]
那么,究竟怎么创造一个range()的list呢?查了一下收获不小,比方我要一个从1到9的整数列表,
>>> list(range(10)) [0,1,2,3,4,5,6,7,8,9]
用了个list的函数,恩恩就酱
8.6.5 xrange()内建函数
好吧,在Python3里面已经彻底的废弃了,那就不说了8.6.6 与序列相关的内建函数
就是指sorted()、reversed()、enumerate()、zip()函数值得一提的是这个zip函数,它变了,没错!它在Python3中变了
>>> lst1 = [1,2] >>> lst2 = ['a','b'] >>> zip(lst1,lst2) >>> list(zip(lst1,lst2)) [(1,'a'),(2,'b')]
2.7是直接zip()函数就会返回一个列表,现在看来必须用list才能显示
8.7 break语句
Python中break语句结束当前循环然后跳转到下条语句,用if检查当外部条件触发就实行count = num / 2 while count > 0: if num % count == 0: print count, 'is the largest factor of', num break count -= 1
这个例子是用来求解一个数的最大公约数
8.8 continue语句
核心笔记:continue语句这个语句的意思就是遇到continue语句的时候,程序终止当前循环,并且忽略剩下的语句,回到循环的顶端
valid = False count = 3 while count > 0: input = raw_input("enter password") # check for valid passwd for eachPasswd in passwdList: if input == eachPasswd: valid = True break if not valid: # (or valid == 0) print "invalid input" count -= 1 continue else: break
这个用来实现密码登录问题,还行 ,值得一看
8.9 pass语句
这个意思是代码块不做任何事,可以用来做一些调试什么的。这种语句可以用来先定性结构,不干扰其他代码
8.10 再谈else语句
就是讲else也可以跟在while和for语句之后,else并非是 if 的专有在循环中使用时,else子句只在循环完成后执行,也就是说break语句也会跳过else。
说这么多不如看代码:
n = 5 while n != 0: n -= 1 print(n) if n == 3: break else: print("what the...") #####以下是执行结果###### 4 3
当n=3的时候,就break跳出while循环了,else也不执行了。如果这个while循环正常执行完,则else内容也执行,如下
n = 5 while n != 0: n -= 1 print(n) else: print("what the...") ######以下是运行结果######## 4 3 2 1 0 what the...
8.11 迭代器和iter()函数
8.11.1 什么是迭代器
这个书上讲的和很垃圾,没搞明白讲的是什么,凡是可作用于next()函数的对象都是
Iterator类型,它们表示一个惰性计算的序列。就这么理解吧
8.11.2 为什么要用迭代器
讲述了PEP234中的定义,没啥乱用8.11.3 如何迭代
简单的说就是通过for语句或者其他循环机制语句,需要下一项的时候调用迭代器的next()函数(没错,迭代器都有一个next方法),条目全部取出以后,引发一个异常,告诉外部调用者for。结束迭代。(好多废话)8.11.4 使用迭代器
1. 序列>>> myTuple = (123, 'xyz', 45.67) >>> i = iter(myTuple) >>> i.next() 123 >>> i.next() 'xyz' >>> i.next() 45.67 >>> i.next() Traceback (most recent call last): File "", line 1, in ? StopIteration
2.字典
之前讲到过字典的迭代,有keys(),value(),items()
3.文件
这个知道就好,下一章节会讲到文件的迭代,迭代器会自动调用readline()这个方法
8.11.5 可变对象和迭代器
也就是说,不要在迭代可变对象的时候修改它们,反例>> myDict = {'a': 1, 'b': 2, 'c': 3, 'd': 4} >>> for eachKey in myDict: ... print eachKey, myDict[eachKey] ... del myDict[eachKey] ... a 1 Traceback (most recent call last): File "", line 1, in ? RuntimeError: dictionary changed size during iteration
8.11.6 创建迭代器
对一个对象调用iter()就可以得到它的迭代器,语法如下iter(obj) #如果是可迭代对象,根据索引从0一直迭代到结束 iter(func,sentinel)#如果两个参数,重复调用func,直到迭代器的下个值等于sentinel
8.12 列表解析
Python提供了一种动态创建列表的方式。语法如下:[expr for iter_var in iterable]
>>> [x ** 2 for x in range(5)] [0,1,4,9,16]
还有一种,[expr for iter_var in iterable if cond_expr]
>>> seq = [10,9,8,7,5] >>> [x for x in seq if x % 2] [10,8]
这种方法叫做列表解析,要记住,以后会用得到的
8.13 生成器表达式
利用列表解析能够迅速创建一个列表,但是这个列表不可能很大,所以有了生成器。如果列表元素可以按照某种算法推算出来,那我们可以在循环的过程中不断推算出后续的元素。这样就不必创建完整的list,从而节省大量的空间。它就是生成器。
这个东西是特定的函数,允许返回一个值,然后‘暂停’代码的执行,稍后恢复
列表解析: [expr for iter_var in iterable if cond_expr]
生成器表达式:(expr for iter_var in iterable if cond_expr)
仅仅是圆括号和方括号的区别
举得例子很不错,但是由于自己没有学到文件打开,而且代码不够清真。
引用一点廖雪峰的资料吧,生成器只是存储了一个计算方法,想要显示它要么用next()函数,一次显示一个,要么用下面的方法迭代出来
>>> g = (x * x for x in range(10)) >>> for n in g: ... print(n) ... 0 1 4 9 16 25 36 49 64
觉得写的质量大不如前了。所以,只能这样了,而且这些内容也比较基础,但是对于课后题我还是会好好的去完成!
相关文章推荐
- 《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版]
- C#中循环语句:while、for、foreach的使用
- Lua中数字for循环实例
- C#用链式方法表达循环嵌套
- Sql存储过程游标循环的用法及sql如何使用cursor写一个简单的循环
- Shell中的for和while循环详细总结
- C语言循环结构与时间函数用法实例教程
- php循环table实现一行两列显示的方法
- ThinkPHP采用<volist>实现三级循环代码实例
- ASP 循环导入导出数据处理 不使用缓存
- 详解JavaScript中循环控制语句的用法
- asp中for循环的使用方法
- JavaScript中利用各种循环进行遍历的方式总结
- Javascript循环绑定事件的示例代码
- C语言循环队列的表示与实现实例详解
- C++循环队列实现模型
- C# 分支与循环介绍
- 跟我学习javascript的循环
- javascript每日必学之循环
- 采用自执行的匿名函数解决for循环使用闭包的问题