5.5.1while循环

x=1

while x<=100:

print x

x+=1

确保用户输入了名字:

name=""

while not name:

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

print 'hello,%s!'%name

5.5.2for循环

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

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

for word in words:

print word

5.5.3循环遍历字典元素

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

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

for key in d:

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

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

5.5.4一些迭代工具

1.并行迭代

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

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

ages=[12,45,32,102]

for i in range(len(names)):

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

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

>>> zip(names,ages)

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

循环中解包元组:

>>> 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’的子字符串:\

index=0

for string in strings:

if 'xxx' in strings:

strings[index]='[censored'

index+=1

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

3.翻转和排序迭代

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

>>> 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语句。

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语句:

for x in seq:

if condition1: continue

if condition2: continue

if condition3: continue

do_something()

da_ something_ else()

do_ another_thing()

etc()

很多时候,只要使用if语句就可以了:

for x in seq:

if not (condition1 or condition2 or condition3)

do_something()

do_something_else()

do_another_thing()

etc()

3.while True/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子句

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循环:

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

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

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

>>> [(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语句,然后进行测试,但是缺少其中一个语句块的代码,考虑下面的情况:

if name=='ralph':

print 'welcome!'

elif name=='enid':

pass

elif name=='bill':

print 'access'

5.7.2使用del删除

>>> 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解释器(以其无穷的智慧)直接删除了那个字典(这种行为被称为垃圾收集)。

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

>>> y=x

>>> y[1]="python"

>>> x

['hello', 'python']

>>> del x

>>> y

['hello', 'python']

>>> x

Traceback (most recent call last):

File "", line 1, in

NameError: name 'x' is not defined

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

1 .exec

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

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

hello,world!

>>> from math import sqrt

>>> exec "sqrt=1"

>>> sqrt(4)

Traceback (most recent call last):

File "", line 1, in

TypeError: 'int' object is not callable

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

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

>>> from math import sqrt

>>> scope={}

>>> exec "sqrt=1" in scope

>>> sqrt(4)

2.0

>>> scope['sqrt']

1

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

>>> len(scope)

2

>>> scope.keys()

['__builtins__', 'sqrt']

2.eval

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

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

enter an arthmetric expression: 6+18*2

42

5.8 小结

本章的新函数

chr(n) 当传入序号n时,返回n所代表的包含一个字符的字符串,(0, n< 256)

eval(source[,globals[,locals]]) 将字符申作为表达式计算,并且返回值

enumerate(seq) 产生用于迭代的(索引,值)对

ord(c) 返回单字符字符串的int值

range([start,]stop[,step]) 创建整数的列表

reversed(seq) 产生seq中值的反向版本,用于迭代

sorted(seq[,cmp][,key][,reverse]) 返回seq中值排序后的列表

xrange([start,]stop[,step]) 创造xrange对象用于迭代

zip(seq1,_eq2.…) 创造用于并行迭代的新序列

python基础语言与应用第五章_《Python基础教程》 读书笔记 第五章(下)循环语句...相关推荐

  1. 《Python黑帽子:黑客与渗透测试编程之道》读书笔记(五):扩展burp代理

    目录 前言 1.burp的fuzz脚本 2.burp中利用Bing服务 3.利用网站内容生成密码字典 结语 前言 <Python黑帽子:黑客与渗透测试编程之道>的读书笔记,会包括书中源码, ...

  2. python基础教程读书笔记——第三章 字符串

    第三章 字符串 摘要: %s , $x , find()  , join() , split() , lower() , title() , strip() 1.字符串格式化 format = &qu ...

  3. UnixLinux大学教程 读书笔记【1-3章】

    Bash:Bourne-again shell,所有linux系统中的默认shell.程序名称:bash Shell:通过充当命令处理器以及解释命令的脚本,提供Unix基本界面的程序. 操作系统:运行 ...

  4. 《Python从入门到实践》读书笔记——第五章 if语句

    <Python从入门到实践>读书笔记--第五章 if语句 1. 一个简单示例 cars = ['audi', 'bwm', 'subaru', 'toyota']for car in ca ...

  5. 鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一)

    鸟哥的LINUX私房菜 基础学习篇 读书笔记 -- 第零章 计算机概论 (一) 第零章 计算机概论 0.1 电脑:辅助人脑的好工具 0.1.1 计算机硬件五大组成部分 0.1.2 一切设计的起点: C ...

  6. 《Python从入门到实践》读书笔记——第六章 字典

    <Python从入门到实践>读书笔记--第六章 字典 1. 一个简单的字典 alien_0 = {'color': 'green', 'points': 5}print(alien_0[' ...

  7. 黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境

    黑帽python第二版(Black Hat Python 2nd Edition)读书笔记 之 第一章 配置python环境 文章目录 黑帽python第二版(Black Hat Python 2nd ...

  8. 《汇编语言》- 读书笔记 - 第1章-基础知识

    <汇编语言>- 读书笔记 - 第1章-基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储 ...

  9. 《深度探索C++对象模型》读书笔记第五章:构造析构拷贝语意学

    <深度探索C++对象模型>读书笔记第五章:构造析构拷贝语意学 对于abstract base class(抽象基类),class中的data member应该被初始化,并且只在constr ...

  10. 《电路分析基础》第7章 正弦稳态电路 读书笔记

    <电路分析基础>第7章 正弦稳态电路 读书笔记 想念生物笔记...

最新文章

  1. 胖子哥的大数据之路(7)- 传统企业切入核心or外围
  2. 由“ASP.NET网站限制访问频率”想到的两点问题(转)
  3. windows 安装cython-bbox
  4. Android rxjava2的disposable
  5. 此工作簿包含到其他数据源的链接
  6. ssm 框架配置详解
  7. HD_2553N皇后问题
  8. ad 4层板设计实例文件_案例 | 美研【风险管理专业】1620Fall 310+申请实例
  9. 用 Go 编写一个简单的 WebSocket 推送服务
  10. 工具,帮助我们更高效的工作
  11. 学了这么多年的人工智能居然还不了解它?
  12. 在Java环境下怎么打开_Java环境配置及在Dos命令下运行Java程序
  13. ExtJS初学——renderTo/applyTo区别
  14. 代码运行:CornerNet源码
  15. 一个UIView最多能有多少个superView?
  16. tensorflow中将标注文件写到train.txt, test.txt,trainval.txt中
  17. 安全性-身份验证和授权(一)之Principal
  18. 世界历史上10位征服过最广大土地的人
  19. python屏幕取词_GetWord 3.3 屏幕取词
  20. Spring Boot项目中pom.xml文件带横杠解决方案

热门文章

  1. java 汉字 数字_java数字转汉字工具类详解
  2. ajax中的让渡,jQuery必须掌握的API
  3. tensorflow中的tf.summary.image
  4. LeetCode 264. Ugly Number II--C++,Python解法
  5. ASP .NET Core Web Razor Pages系列教程四:使用数据库进行交互 entity-framework(MySQL/MariaDB 版)
  6. centos 7 安装GTK+-2.0
  7. 如何导出android studio程序,Android Studio 如何导出 Jar 给 Unity 使用
  8. SpringCloud核心组件及其作用
  9. Specification使用in
  10. Docker Compose安装