本章讲述if、while、for以及与他们搭配的else、elif、break、continue、pass等语句。

1 if语句

  语法:三部分——关键字if、条件表达式、代码块。(记住冒号)

if cond_expr:
expr

1.1 多重条件表达式

  条件表达式可以是一个由not、and、or连接起来的逻辑表达式。

1.2 单一语句的代码块

  如果代码块只有一行,可以将三部分写在一行,不推荐这样。

2 else语句

  同C语言中的if...else...,记住冒号。else一定要与和它搭配的if对齐。

if cond_expr:
expr0
else:
expr1

3 elif语句

  类似于C中使用else if。if后面只可以配一个else,但是可以有多个elif。

if cond_expr0:
expr0
elif cond_expr1:
expr1
elif cond_expr2:
expr2
else:
expr3

  如果出现这种形式的用法:

if user.cmd == 'create':
  action = "create item"
elif user.cmd == 'delete':
  action = 'delete item'
elif user.cmd == 'update':
  action = 'update item'
else:
  action = 'invalid choice... try again!'

  不如使用元组或字典来判断成员,效率更高,顺便复习一下之前学到的知识:

#判断元组成员
if user.cmd in ('create', 'delete', 'update'):
  action = '%s item' % user.cmd
else:
  action = 'invalid choice... try again!' #判断字典成员,并使用字典方法
msgs = {'create': 'create item', 'delete': 'delete item', 'update': 'update item'}
default = 'invalid choice... try again!'
action = msgs.get(user.cmd, default)

4 条件表达式

  即C语言中的?:表达式。C语言中的 cond ? A : B   等价于  Python中的 A if cond else B  。

5 while语句

5.1 语法

  类似C语言中while的用法,记住冒号:

while cond_expr:
expr

5.2 计数循环

>>> count = 0
>>> while count < 9:
... print 'index is', count
... count += 1

5.3 无限循环

  死循环,while True:  ,很多通讯服务器的客户端/服务端就采用无限循环。

6 for语句

  Python中最强大的循环结构,可以遍历序列成员,可以用在“列表解析”和“生成器表达式”中,它会自动地调用迭代器的next()方法,捕获StopIteration异常并结束循环,这一切都是在内部发生的。

6.1 语法

for iter_val in iterable:
expr

  序列可以直接迭代,而且比通过索引迭代更有效率。可以通过enumerate()的返回值同时迭代索引和元素。

6.2 用于迭代器类型

  迭代器对象有一个next()方法,调用它则返回下一个元素,迭代结束后引发一个StopIteration异常。

>>> it = reversed( range(3) )    #reversed函数返回一个迭代器,它是参数的逆序
>>> it.next()
2
>>> it.next()
1
>>> it.next()
0
>>> it.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

  for语句迭代一个迭代器时,在内部调用next()方法,并自动捕获异常。

6.3 range()内建函数

  返回一个包含数值的列表。有三种语法,完整的和简略的:

 range(start, end, step = 1)  #完整语法,返回一个列表,包含[start, end - 1]
range(start, end) #步长默认为1
range(end) #开始默认为0,步长默认为1

6.4 xrange()内建函数

  和range()很相似,参数一样。不过它返回一个xrange对象,可迭代。在数据量很大时,比range()高效且节省内存。(即数据是按需计算)

6.5 与序列相关的内建函数

  以下函数都返回一个可迭代的对象:

 sorted()    #返回一个序列
zip() #返回一个序列 reversed() #返回一个迭代器
enumerate() #返回一个迭代器

7 break语句

  类似于C语言里的break,用于退出循环。

8 continue语句

  类似于C语言里的continue,忽略循环中的剩余语句,立即回到循环头,检查条件表达式,进行下一次循环或退出循环。

9 pass语句

  NOP,即no operation。对于想好结构,没有想好具体代码的程序,可以作为一个占位语句。类似C语言的空语句 {} 或 ;  。

10 用在循环中的else

  else与while或for对齐使用,当循环正常结束时(非break)执行else里的语句。可以认为它与循环的判断条件(当成一个if)搭配使用。

#!/usr/bin/env python 

for i in range(3):
if i == 1:
break #跳出循环,不执行后面的else语句
print i
else:
print 'loop over'
$ python pytest.py   #执行脚本
0

  将break改成continue,最终循环也是正常结束的(即循环的判断条件失败时推出的循环),则执行else语句:

$ python pytest.py
0
2
loop over

11 迭代器

  • 迭代器为类序列对象提供一个类序列接口,可以用它来迭代不是序列但是表现出序列行为的对象(比如字典、文件等)。
  • 迭代字典,结果就是遍历dict.keys()返回的列表;迭代文件对象,结果就是遍历fp.readlines()返回的列表。
  • 序列迭代的时候可以修改成员,其他对象不可以修改,也不推荐迭代的时候修改。
  • iter()可以为一个序列或者集合等生成其迭代器。

12 列表解析

  语法:

[expr for iter_val in iterable]

  例如:

#一维列表
>>> [x*x for x in range(3)]
[0, 1, 4] #二维列表
>>> [(x, y**2) for x in range(2) for y in range(3)]
[(0, 0), (0, 1), (0, 4), (1, 0), (1, 1), (1, 4)]

  扩展形式,对迭代变量加一个条件:

>>> [x*x for x in range(4) if x % 2]     #只求奇数的平方
[1, 9]

13 生成器表达式

  语法和列表解析类似:

(expr for iter_val in iterable)  #这里是小括号

  类似于range和xrange的区别,列表解析会返回一个列表,数据量大时占用大量内存;生成器表达式则是返回一个生成器,调用next()方法时计算并返回一个数据。

14 模块

  Python有一个模块itertools,用于辅助使用迭代器。

练习题

8–4 素数。编写函数,函数名为isprime()。如果输入的是一个素数,那么返回True,否则返回False。

 #!/usr/bin/env python 

 import math

 def isprime(num):
if type(num) is not type(1) or num < 2:
print 'You should input an integer >= 2'
return
for i in range(2, int(math.sqrt(num)) + 1):
if not num % i:
return False
return True

8-4

8-5 约数。完成一个名为getfactors()的函数。它接受一个整数作为参数,返回它所有约数的列表,包括1和它本身。

 #!/usr/bin/env python 

 def getfactors(num):
factors = []
for i in range(1, num + 1):
if not num % i:
factors.append(i)
return factors

8-5

8–6 素因子分解。以刚才练习中的isprime()和getfactors()函数为基础编写一个函数,它接受一个整数作为参数,返回该整数所有素数因子的列表。这个过程叫做求素因子分解,它输出的所有因子之积应该是原来的数字。注意列表里可能有重复的元素。例如输入20,返回结果应该是[2, 2, 5]。

 #!/usr/bin/env python

 def getprimefactors(num):
primefactors = []
while num != 1:
for i in range(2, num + 1):
if isprime(i) and not num % i: #调用isprime()
primefactors.append(i)
num /= i
break
return primefactors

8-6

8–7 全数。完全数被定义为这样的数字:它的约数(不包括它自己)之和为它本身。例如:6的约数是1、2、3,因为1 + 2 + 3 = 6,所以6被认为是一个完全数。编写一个名为isperfect()的函数,它接受一个整数作为参数,如果这个数字是完全数,返回1;否则返回0。

 #!/usr/bin/env python 

 def isperfect(num):
if sum( getfactors(num) ) - num == num: #调用getfactors()
return 1
return 0

8-7

Python核心编程--学习笔记--8--条件与循环的更多相关文章

  1. python核心编程学习记录之条件和循环

  2. Python核心编程--学习笔记--4--Python对象

    现在开始学习Python语言的核心部分.首先了解什么是Python对象,然后讨论最常用的内建类型,接下来讨论标准类型运算符和内建函数,之后给出对标准类型的不同分类方式,最后提一提Python目前还不支 ...

  3. Python核心编程--学习笔记--3--Python基础

    本章介绍基本的Python语法.编程风格:并简要介绍标识符.变量和关键字,以及变量占用内存的分配和回收:最后给出一个较大的Python样例程序来体验这些特性. 1 语句和语法 1.1 注释 可以在一行 ...

  4. Python核心编程--学习笔记--2--Python起步(下)

    16 文件和内建函数open(),file() 打开文件: fobj = open(filename, 'r') for eachLine in fobj: print eachLine, #由于每行 ...

  5. Python核心编程--学习笔记--2--Python起步(上)

    本章是对Python的主要特性做一个快速介绍. 1 介绍 交互执行时,解释器有两种提示符: 主提示符(>>>):解释器在等待输入下一个语句: 次提示符(...):解释器在等待输入当前 ...

  6. Python核心编程--学习笔记--1--Python简介

    本章介绍了Python的背景知识,包括什么是Python.Python的起源以及Python的一些关键特性. 1 什么是Python Python是一门优雅而健壮的编程语言,它继承了传统编译语言的强大 ...

  7. Python核心编程--学习笔记--9--文件和输入输出

    本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数.内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块. 1 ...

  8. Python核心编程--学习笔记--7--字典和集合

    本章介绍Python语言中的映射类型(字典)和集合类型,包括操作符.工厂函数.内建函数与方法. 1 字典 字典是Python中唯一的映射类型——键key直接映射到值value.字典是容器类型,其对象是 ...

  9. Python核心编程--学习笔记--6--序列(下)列表、元组

    11 列表 类似于C语言的数组,但是列表可以包含不同类型的任意对象.列表是可变类型. 创建列表——手动赋值.工厂函数: >>> aList = [12, 'abc'] >> ...

随机推荐

  1. Java中1000==1000为false而100==100为true

    public static void main(String[] args) { int z1 = 0; int z2 = 0; System.out.println(z1==z2);//TRUE I ...

  2. 【caffe-windows】 caffe-master 之 cifar10 超详细

    本教程尽量详细,大多步骤都有图,如果运行出错,请先对照自己的文件是否和图上的一样,包括标点啊,空格啊,斜杠,反斜杠啊之类的小细节. 本例程是在 win10 64位   caffe-master     ...

  3. css+js+html基础知识总结

    css+js+html基础知识总结 一.CSS相关 1.css的盒子模型:IE盒子模型.标准W3C盒子模型: 2.CSS优先级机制: 选择器的优先权:!important>style(内联样式) ...

  4. 解决setInterval计时器不准的问题

    在js中如果打算使用setInterval进行倒数,计时等功能,往往是不准确的,因为setInterval的回调函数并不是到时后立即执行,而是等系统计算资源空闲下来后才会执行.而下一次触发时间则是在s ...

  5. Flex开发自定义控件

    前期准备: 点击File菜单 -> New -> MXML Component,然后弹出一个对话框. 在对话框中输入组件名,选择此组件继承的类型,如:Canvas,DataGrid,Com ...

  6. (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)

    hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...

  7. Android ROM 备书

    1. Android ROM 目录接口 我们经常说的刷ROM是刷系统的意思,但是ROM的原意并不是这样,ROM的全称是read only memory只读储存器,正因为它是“只读”的,而且系统文件通常 ...

  8. android View 继承关系

    二. View  SurfaceView  GLSurfaceView   View SurfaceView GLSurfaceView 功能 显示视图,内置画布,提供图形绘制函数.触屏事件.按键事件 ...

  9. Compilation failed: this version of PCRE is not compiled with PCRE_UTF8 support at offset 0

    在安装pcre-8.13.tar.gz时候出了错,说是缺少libpcre.so.0 下面是解决方法.真不容易哦,一个问题来没解决,新问题就出来了.一环扣一环,会搞死去.. errorgrep: err ...

  10. 【ITOO 1】将List数据导出Excel表

    需求描述:在课表导入的时候,首先给用户提供模板(excel),然后将用户填写好的数据读取到list集合中.再进行判空处赋值处理,以及去重处理.这篇博客,主要介绍读取excel表和导出excel表的方法 ...