楼主: jpld
1920 1

《Python基础教程》 读书笔记 第五章(下)条件语句 [推广有奖]

  • 2关注
  • 50粉丝

讲师

2%

还不是VIP/贵宾

-

威望
0
论坛币
1268 个
通用积分
2.1233
学术水平
120 点
热心指数
120 点
信用等级
99 点
经验
1249 点
帖子
192
精华
0
在线时间
271 小时
注册时间
2009-5-29
最后登录
2022-3-1

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

5.5.1while循环

1

2

3

4


x=1

while x<=100:

    print x

    x+=1


确保用户输入了名字:

1

2

3

4


name=""

while not name:

    name=raw_input('please enter  your name:')

print 'hello,%s!'%name


5.5.2 for循环

while语句非常灵活。它可以用来在任何条件为真的情况下重复执行一个代码块。一般情况下这样就够用了,但是有些时候还得量体裁衣。比如要为一个集合(序列和其他可迭代对象)的每个元素都执行一个代码块。这个时候可以使用for语句:

1

2

3


words=['a','b','c','d']

for word in words:

    print word


5.5.3 循环遍历字典元素

一个简单的for语句就能循环字典的所有键,就像处理序列一样

1

2

3


d={'x':1,'y':2,'z':3}

for key in d:

    print key,'corresponds  to',d[key]


注意:字典元素的顺序通常是没有定义的。换句话说,迭代的时候,字典中的健和值都能保证被处理,但是处理顺序不确定。如果顺序很重要的话,可以将键值保存在单独的列表中,例如在迭代前进行排序。

5.5.4一些迭代工具

1.并行迭代

程序可以同时迭代两个序列。

1

2

3

4


names=['anne','beth','george','damon']

ages=[12,45,32,102]

for i  in range(len(names)):

    print names[1],'is',ages,'years  old'


内建的zip函数可以用来进行并行迭代,可以把两个序列“压缩”在一起,然后返回一个元组的列表:

1

2


>>> zip(names,ages)

[('anne', 12), ('beth', 45), ('george', 32),  ('damon', 102)]


循环中解包元组:

1

2

3

4

5

6

7

8

9

10

11


>>> for name,age in zip(names,ages):


    print name,'is',age,'years  old'


anne is 12 years old


beth is 45 years old


george is 32 years old


damon is 102 years old


zip函数也可以作用于任意多的序列。关于它很重要的一点是zip可以应付不等长的序列:当最短的序列“用完”的时候就会停止:

>>> zip(range(5),xrange(100000000))


[(0, 0), (1, 1),(2, 2), (3, 3), (4, 4)]

2.编号迭代

有些时候想要迭代序列中的对象,同时还要获取当前对象的索引。例如,在一个字符串列表中替换所有包含’XXX’的子字符串:\

1

2

3

4

5

6

7

8

9


index=0


for string in strings:


    if 'xxx' in strings:


    strings[index]='[censored'


index+=1


另一种方法是使用内建的enumerate函数:

3.翻转和排序迭代

两个有用的函数:reversed和sorted:它们同列表的reverse和sort (sorted和sort使用同样的参数)方法类似,但作用于任何序列或可迭代对象上,不是原地修改对象,而是返回翻转或排序后的版本:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


>>> sorted([4,3,5,8,1])


[1, 3, 4, 5, 8]


>>> sorted('hell,world!')


['!', ',', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'r', 'w']


>>> list(reversed('hello,world'))


['d', 'l', 'r', 'o', 'w', ',', 'o', 'l', 'l', 'e', 'h']


>>> ''.join(reversed('hello,world!'))


'!dlrow,olleh'


5.5.5跳出循环

1. break

结束(跳出)循环可以使用break语句。

1

2

3

4

5

6

7

8

9

10

11


from math import sqrt


for n in range(99,0,-1):


    root=sqrt(n)


    if root ==int(root):


        print n


        break


2. continue

continue会让当前的迭代结束,“跳”到下一轮循环的开始。它最基本的意思是“跳过剩余的循环体,但是不结束循环”。当循环体很大而且很复杂的时候,这会很有用,有些时候因为一些原因可能会跳过它—这个时候可以使用continue语句

3.whileTrue/break习语

while True:


    word=raw_input('please enter a  word:')


    if not word:break


    print 'the word was '+word

while True的部分实现了一个永远不会自己停止的循环。但是在循环内部的if语句中加入条件可以的,在条件满足时调用break语句。这样一来就可以在循环内部任何地方而不是只在开头(像普通的while循环一样)终止循环。if/break语句自然地将循环分为两部分:第1部分负责初始化(在普通的while循环中,这部分需要重复),第2部分则在循环条件为真的情况下使用第1部分内初始化好的数据。

5.5.6循环中的else子句

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


from math import sqrt


for n in range(99,81,-1):


    root=sqrt(n)


    if root==int(root):


        print n


        break


    else:


        print "didn't  find it"


5.6列表推导式——轻量级循环

列表推导式(list comprehension)是利用其他列表创建新列表(类似于数学术语中的集合推导式)的一种方法。它的工作方式类似于for循环:

1

2

3


>>> [x*x for x in range(10)]


[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


可以增加更多for语句的部分:

1

2

3


>>> [(x,y)for x in range(3) for y in range(3)]


[(0, 0), (0, 1), (0, 2), (1, 0),  (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)


5.7三人行 :pass, del和exec

5.7.1 pass

它可以在的代码中做占位符使用。比如程序需要一个jf语句,然后进行测试,但是缺少其中一个语句块的代码,考虑下面的情况:

1

2

3

4

5

6


if name=='ralph':

    print 'welcome!'

elif name=='enid':

    pass

elif name=='bill':

    print 'access'


5.7.2使用del删除

1

2

3

4

5

6

7

8

9

10


>>> scoundrel={'age':42,'first  name':'robin','last name':'of locksley'}

>>> robin=scoundrel

>>> scoundrel

{'last name': 'of locksley', 'first name': 'robin', 'age': 42}

>>> robin

{'last name': 'of locksley', 'first name': 'robin', 'age': 42}

>>> coundrel=None

>>> robin

{'last name': 'of locksley', 'first name': 'robin', 'age': 42}

>>> robin=None


首先,robin和scoundrel都被绑定到同一个字典上。所以当设置scoundrel为None的时候,字典通过robin还是可用的。但是当我把robin也设置为None的时候,字典就“漂”在内存里面了,没有任何名字绑定到它上面。没有办法获取和使用它,所以Python解释器(以其无穷的智慧)直接删除了那个字典(这种行为被称为垃圾收集)。

1

2

3

4

5

6

7

8

9

10

11

12


>>> x=["hello","world"]

>>> y=x

>>> y[1]="python"

>>> x

['hello', 'python']

>>> del x

>>> y

['hello', 'python']

>>> x

Traceback (most recent call last):

  File "<input>", line 1, in <module>

NameError: name 'x' is not defined


5.7.3 使用exec和eval执行和求值字符串

1 .exec
执行一个字符串的语句是exec:

1

2


>>> exec "print  'hello,world!'"

hello,world!


1

2

3

4

5

6


>>> from math import sqrt

>>> exec "sqrt=1"

>>> sqrt(4)

Traceback (most recent call last):

  File "<input>", line 1, in <module>

TypeError: 'int' object is not callable


exec语句最有用的地方在于可以动态地创建代码字符串。如果字符串是从其他地方获得的—很有可能是用户—那么几乎不能确定其中到底包含什么代码。所以为了安全起见,可以增加一个字典,起到命名空间的作用。

可以通过增加in<scope>来实现,其中的<seope>就是起到放置代码字符串命名空间作用的字典。

1

2

3

4

5

6

7


>>> from math import sqrt

>>> scope={}

>>> exec "sqrt=1" in scope

>>> sqrt(4)

2.0

>>> scope['sqrt']

1


可以看到,潜在的破坏性代码并不会覆盖sqrt函数,原来的函数能正常工作,而通过exec赋值的变量sqrt只在它的作用域内有效。注意,如果需要将scope打印出来的话,会看到其中包含很多东西,因为内建的_builtins_字典自动包含所有的内建函数和值:

1

2

3

4


>>> len(scope)

2

>>> scope.keys()

['__builtins__', 'sqrt']


2.eval

eval(用于“求值”)是类似于exec的内建函数。exec语句会执行一系列Python语句,而eval会计算Python表达式(以字符串形式书写),并且返回结果值,(exec语句并不返回任何对象,因为它本身就是语句)。例如,可以使用下面的代码创建一个Python计算器:

1

2

3


>>> eval(raw_input("enter an  arthmetric expression:"))

enter an arthmetric expression: 6+18*2

42





二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python基础教程 Python基础 python 读书笔记 基础教程 读书笔记

沙发
du402449468 发表于 2015-5-21 09:30:55 |只看作者 |坛友微信交流群
赞赞赞。。。。。。。。。。。。。。。。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-25 06:23