条件

和其他语言类似,python中使用if...elif...else来形成分支,支持三目操作符 ?:,python中没有switch,但是缩进的特性让if...elif...else的结构同样便于阅读

循环控制

python中除了break,continue这两个一般的循环控制语句之外,还有一个pass,执行空操作。由于python的语法特性,添加pass可以留空某一个域,避免在调试过程中反复报错。

while循环

python中的while循环比其他语言增加了一个特性:支持else。在其他语言中,经常会用到判断是否正常结束循环还是中途break非正常结束,python中利用while...else可以简洁明了地解决这个问题:

i = 0
s = 'this is a test string'
while i < len(s):
    if s[i] == 'z' :
        break
    i += 1
else:
    print "There is no z in the string"

由于break会跳出整个while,包括else,所以else后面的语句可以在正常结束的情况下被执行。

for循环

python中的for循环更像是perl中的foreach,支持迭代器等特性,功能非常强大

for会访问可迭代对象中的每一个元素,并在所有元素都访问完毕之后结束循环,可迭代对象包括序列、字典、集合、迭代器等。

1. 直接循环序列项:这是最直接的循环方式:

alist = [‘A’,’B’,’C’,’D']
foreach value in alist:
    print “value=“,value

如果是字典类型,则直接访问返回的是键,而不是值

2. 通过序列索引来访问序列:通过range()函数等,建立序列的索引对应序列,再通过循环访问该索引序列去访问原序列, 如果要提取索引值的话,有些情况下这种方式也是必要的:

alist = [‘A’,’B’,’C’,’D']
foreach index in range(len(alist)):
    print “index=%i,value=%s“ % (index,list[index])

range()方法的完整语法是range(start,end,step=1),range(1,10,2)创建一个1到9的奇数序列,省略最后一个参数则步长默认为1,省略两个参数时,range()语法为range(end),默认从0开始,步长为1并且不可改变:

print range(1,10,2)
print range(1,10)
print range(10)

3. 同时访问索引和内容:通过enumerate()函数,构建一个enumerate对象,for每次循环可以从该对象中获取index和内容的对应元组,如果是字典的话,使用enumerate()方法只会提取键和其对应的索引(注意字典键的无序性),想要同时访问字典的键和值,则需要通过字典的iteritems()方法:

adict = {'A':'B','C':'D','EEE':'F'}
for k,v in adict.iteritems():
    print k,v
alist = ['A','B','C','D']
for k,v in enumerate(alist):
    print k,v

迭代器

迭代器和序列不同,并非根据索引来计数,迭代器是有一个next()方法的对象,for语句会使用next()方法获取下一项,并且在条目全部取出后,引发StopIteration异常,从而完成迭代。

通过iter方法可以生成一个迭代器,实际上,序列在for循环的过程中,也会被当成迭代器来迭代工作。字典的迭代器只会遍历字典的键,所以当使用for key in adict的时候,循环的是键,字典可以通过dict.iter*来生成键、值、键值对的迭代器。

迭代器是不可变的,所以不能在循环访问迭代器的过程中对相对应的对象进行改变,如果需要进行改变的操作,则需要利用keys()方法等返回一个键的列表,通过循环访问索引或者键的方式,再对对象进行改变。

列表生成器

在for循环的使用中,可以看到通过range()方法可以实现其他语言中for的简单功能,通过列表生成器生成特有的列表,则可以完成其他语言中for的全部功能。

列表解析:

[expr for iter_var in iterable if cond_expr]

生成器表达式:

(expr for iter_var in iterable if cond_expr)

生成器可以得到一个内存更加友好的结果,他并不创建数字列表,而是在每次计算出一个条目后,就讲该条目产生出来,生成器延迟计算的方式使其在内存上更加有效。

通过生成器,可以非常大限度上地简化代码,并且优化内存结构。

如通过[(x,y)for x in range(3) for y in range(3)]可以形成一个3*3的矩阵,而生成器则是不在内存中生成矩阵,而是逐个计算并生成结果。若要统计一个文件中的非空字节数,直接使用列表解析则可能会占用很大的内存,如使用 sum(len(word)) for line in data for word in line.split() 生成器,则可以事先不占用内存,而是逐行访问文件。

利用生成器,可以重构一些比较复杂的代码,如统计一个文件中的最长行的长度:

f = open(‘file’,’r')
allLineLens = [len(x.strip()) for x in f] 
f.close()
return max(allLineLens)

在allLineLens中解析了一个列表,会讲整个文件读取到内存中,使用生成器:

return max(len(x.strip())) for x in open(‘file')

可以逐行读取,优化内存的同时,简化代码。

Python在科学计算上大幅被应用,科学家是讨厌循环的思维方式,生成器的方式将数据的结构更加直观地展示出来,更加能符合科学家的思维习惯应该也有很大关系吧。

Python学习_05_条件、循环的更多相关文章

  1. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  2. Python学习笔记——条件控制

    Python中的条件控制方式基本和C语言类似,主要有如下几种语法: If条件判断 Python的条件语句的语法是if…elseif…else,如下的一个简单的猜数字的示例演示了这一过程: number ...

  3. python学习笔记:循环语句——while、for

    python中有两种循环,while和for,两种循环的区别是,while循环之前,先判断一次,如果满足条件的话,再循环,for循环的时候必须有一个可迭代的对象,才能循环,比如说得有一个数组.循环里面 ...

  4. 【Python学习笔记】循环和迭代

    for和while基本语法 break和continue else的使用 enumerate和zip在循环中的应用 for和while基本语法 Python中的的循环使用for和while语句来实现, ...

  5. python学习day6 for循环 字符串的内置方法

    1.for循环 和while相比 l=[1,2,3] i=0 while i <len(l) print(l[i]) i+=1 l=['a','b','c'] for item in l: pr ...

  6. Python学习4——条件、循环及其他语句总结

    多种语句 打印语句: 导入语句: 赋值语句: 代码块: 条件语句: 断言: 循环: 推导: pass.dal.exec和eval :  学习到的新函数:(以下函数的应用代码均在IDLE测试通过) ch ...

  7. python学习第六天 条件判断和循环

    总归来讲,学过C语言的同学,对条件判断和循环并不陌生.这次随笔只是普及一下python的条件判断和循环对应的语法而已. 条件判断: 不多说,直接贴代码: age = 23 if age >= 6 ...

  8. Python学习笔记—条件判断和循环

    条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age = 20 if age >= ...

  9. Python学习笔记——条件和循环

    1.条件表达式 >>> x = 3 >>> x = 1 if x<3 else 2 >>> x 2 2.for语句用于序列类型 <1& ...

随机推荐

  1. MYSQL 主从复制---原理

    复制的核心步骤 在主库上把数据更改记录到二进制日志(Binary Log)中; 备库将主库上的日志复制到自己的中继日志(Relay Log)中; 备库读取中继日志中的事件,将其重放到备库数据之上; 下 ...

  2. redis函数总结

    <?php /*1.Connection*/ $redis = new Redis(); $redis->connect('127.0.0.1',6379,1);//短链接,本地host, ...

  3. Dynamics CRM可以设置会话超时和非活动超时吗?

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复266或者20171213可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  4. ASP.NET没有魔法——ASP.NET MVC使用Oauth2.0实现身份验证

    随着软件的不断发展,出现了更多的身份验证使用场景,除了典型的服务器与客户端之间的身份验证外还有,如服务与服务之间的(如微服务架构).服务器与多种客户端的(如PC.移动.Web等),甚至还有需要以服务的 ...

  5. java学习笔记之String类

    String类总结 String类概述: java.lang.String 类是字符串操作类 String类的常用构造方法: //1.直接赋值 String str= "hellojava& ...

  6. Linux Rsync备份服务介绍及部署守护进程模式

    rsync介绍 rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份工具 在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输 ...

  7. JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)(转)

    转载自 http://www.cnblogs.com/xdp-gacl/p/3744053.html 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWe ...

  8. Error code:1728 Cannot load from mysql.proc. The table is probably corrupted

    Error code:1728 Cannot load from mysql.proc. The table is probably corrupted http://bugs.mysql.com/b ...

  9. Woody的Python学习笔记1

    Python 是一种解释性语言:这意味着开发过程中省去了编译这个环节,类似于PHP\Perl. Python 是交互式语言:这意味着你能够在一个python提示符,直接互动运行写你的程序. Pytho ...

  10. Elasticsearch和MongoDB分片及高可用对比

    本文旨在对比Elasticsearch和MongoDB高可用和分片的实现机制. Elasticsearch ES天生就是分布式的,那她又是如何做到天生分布式的? 通过ES官方指南我们可以知道: 一个运 ...