Python核心编程--学习笔记--8--条件与循环
本章讲述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--条件与循环的更多相关文章
- python核心编程学习记录之条件和循环
- Python核心编程--学习笔记--4--Python对象
现在开始学习Python语言的核心部分.首先了解什么是Python对象,然后讨论最常用的内建类型,接下来讨论标准类型运算符和内建函数,之后给出对标准类型的不同分类方式,最后提一提Python目前还不支 ...
- Python核心编程--学习笔记--3--Python基础
本章介绍基本的Python语法.编程风格:并简要介绍标识符.变量和关键字,以及变量占用内存的分配和回收:最后给出一个较大的Python样例程序来体验这些特性. 1 语句和语法 1.1 注释 可以在一行 ...
- Python核心编程--学习笔记--2--Python起步(下)
16 文件和内建函数open(),file() 打开文件: fobj = open(filename, 'r') for eachLine in fobj: print eachLine, #由于每行 ...
- Python核心编程--学习笔记--2--Python起步(上)
本章是对Python的主要特性做一个快速介绍. 1 介绍 交互执行时,解释器有两种提示符: 主提示符(>>>):解释器在等待输入下一个语句: 次提示符(...):解释器在等待输入当前 ...
- Python核心编程--学习笔记--1--Python简介
本章介绍了Python的背景知识,包括什么是Python.Python的起源以及Python的一些关键特性. 1 什么是Python Python是一门优雅而健壮的编程语言,它继承了传统编译语言的强大 ...
- Python核心编程--学习笔记--9--文件和输入输出
本章将深入介绍Python的文件处理和相关输入输出能力,包括:文件对象(以及它的内建函数.内建方法和属性),标准文件,文件系统的访问方法,文件执行,最后简要涉及持久存储和标准库中与文件有关的模块. 1 ...
- Python核心编程--学习笔记--7--字典和集合
本章介绍Python语言中的映射类型(字典)和集合类型,包括操作符.工厂函数.内建函数与方法. 1 字典 字典是Python中唯一的映射类型——键key直接映射到值value.字典是容器类型,其对象是 ...
- Python核心编程--学习笔记--6--序列(下)列表、元组
11 列表 类似于C语言的数组,但是列表可以包含不同类型的任意对象.列表是可变类型. 创建列表——手动赋值.工厂函数: >>> aList = [12, 'abc'] >> ...
随机推荐
- HIVE配置文件
进入HIVE_HOME/conf 编辑文件hive-site.xml,内容如下:(这是伪分布式模式) 主要声明了以下几个内容: 数据仓库地址 数据库连接地址 数据库连接驱动 数据库连接用户名 数据库连 ...
- C/C++程序员面试易错题
c部分::::::::::::::::::::::::::::::::::: . 关键字volatile有什么含意? 并给出三个不同的例 子. [参考答案]一个定义为volatile的变量是说这变量可 ...
- Flex4 双选下拉列表的实现(源代码)
本文属原创文章,如需转载,请注明出处,谢谢 企业应用中少不了双选下拉列表控件,但几乎都没有独立的控件,Flex在这上面得天独厚,ArrayCollection的过滤功能使得我们只需要一个数据源就可以将 ...
- cocos2d-x Android版游戏之中国移动SDK嵌入
. 拷贝API 将SDK\runtime\CMBilling20007.jar拷贝至游戏工程的runtime目录下(或其他目录) ,但切记不能放在libs目录下编译,否则编译报错(如:bad rang ...
- MySQL数据库获取汉字拼音的首字母函数
需求简介:最近的一个项目,想实现如下图所示的显示效果.很明显,如果能够获取对应的汉字词组的拼音首字母就可以实现了,如果是固定的几个汉字,人为的拼一下就可以了,不过项目中有多处功能是需要这个效果的,并且 ...
- python时间相关
1.格式化时间time.strftime,返回字符串 import time time.strftime('%Y-%m-%d %H:%M:%S') 2.时间差 timedelta from datet ...
- .NET的三种缓存(页面缓存,控件缓存,自定义缓存)
BLL.Area bll = new BLL.Area(); protected void Page_Load(object sender, EventArgs e) { if (Cache[&quo ...
- 保护企业的Word文档
保护企业的Word文档 通常,我们可以对Word文件进行加密码.设置为只读.禁止复制甚至是将内容变成图片加以保护,但这仅限于个人少量文档,如果是企业每天生产大量的word文档好用这种方法就不行,今天为 ...
- hbase基本结构
HBASE 基本结构一.overview1. hbase <=> NOSQL 不错,hbase 就是某种类型的nosql 数据库,唯一的区别就是他支持海量的数据. hbas ...
- Oracle小数点格式化
1. select to_char(123456789.12345,'fm999999990.99') from dual; 如果fm后位数不足则会显示 ## select to_char(12345 ...