您的位置:首页 > 编程语言 > Python开发

Python核心编程-第八章

2016-06-07 00:00 387 查看
摘要: 条件与循环
个人觉得这本书不好,因为之前的练习题都把条件循环用上了,现在才来学,本末倒置啊

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

觉得写的质量大不如前了。所以,只能这样了,而且这些内容也比较基础,但是对于课后题我还是会好好的去完成!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息