Python的循环、判断和各种表达式(长文系列第二篇)
流程控制是python语法很重要的一个分支,主要包括我们经常用到的判断语句、循环语句以及各种表达式,这也是上一篇文章没有介绍表达式的原因,在这篇文章中会更加系统全面的讲解这三方面的基础知识。
判断语句(if)
判断语句中最有名的应该就是if-else的组合,并且很多语言都通用这种格式,但是对于elif而言,不同语言表达形式可能会不同:
In [1]: x = 5
In [2]: if x>0:
...: print('正整数')
...: elif x<0:
...: print('负整数')
...: else:
...: print('零')
...:
正整数
一组判断语句可能会有零到多个 elif 部分,else 是可选的。关键字 elif 是 else if 的缩写,由于python对缩进的要求很严格,而这种写法恰巧可以有效地避免过深的缩进。 if ... elif ... elif ... 序列用于替代其它语言中的 switch 或 case 语句。
循环语句
1、for循环
如果C语言是你最熟悉的需要,要注意python和C语言中的for语句表达形式完全不同。Python 的 for 语句依据任意序列(字符串、列表)中的子项,按照它们在序列中的顺序来进行迭代。
In [3]: str1 = 'mao'
In [4]: for i in str1:
...: print(i)
...:
m
a
o
对列表的循环与字符串几乎一致,只是子项不同。
In [5]: list1 = ['a','aa','aaa']
In [6]: for i in list1:
...: print(i,len(i))
...:
a 1
aa 2
aaa 3
for语句与range函数结合是一种很常见的组合,range函数主要提供一个数值序列。
In [8]: for j in range(len(list1)):
...: print(j,list1[j])
...:
0 a
1 aa
2 aaa
range提供的数值索引方式可以参考列表的切片,同样默认以0开始,且不包括最后一位,上面这种场合利用enumerate()函数表达会更加简单。
In [9]: for i,v in enumerate(list1):
...: print(i,v)
...:
0 a
1 aa
2 aaa
2、while语句
In [10]: i = 1
In [11]: list2 = []
In [12]: while i<=5:
...: list2.append(i)
...: i+=1
In [14]: list2
Out[14]: [1, 2, 3, 4, 5]
3、break、continue、pass
break语句的作用就是用来跳出一个for或while循环。
In [15]: for i in range(0,5):
...: if i == 3:
...: break
...: else:
...: print(i)
0
1
2
可以看到在for循环中加了一个判断语句,当i等于3时会跳出for循环,不再继续执行,输出与语义符合。
continue语句的作用就是表示继续执行下一次迭代,可以结合判断语句使用,在什么条件下继续执行,或者什么条件下跳出循环。
In [20]: for i in range(2,7):
...: if i%2==0:
...: print('An even number',i)
...: continue
...: if i>4:
...: print('beyond 4')
...: break
...:
An even number 2
An even number 4
beyond 4
pass语句主要起到一个占位的作用,而有的语句后面是不能为空的,比如if、for、while,可以利用pass占位,不会发生报错。
In [1]: while True:
...: pass
迭代器、生成器
我们通常接触到的迭代器有序列,比如字符串、列表等等,利用iter()方法可以构建一个迭代器,与之匹配的next()方法可以迭代返回迭代器内的值,并将返回值弹出迭代器。
In [1]: it = iter('python')
In [2]: print(it)
<str_iterator object at 0x00000187ADA75A00>
In [3]: next(it)
Out[3]: 'p'
In [4]: next(it)
Out[4]: 'y'
当next方法迭代到最后一个值时,继续调用next方法会弹出报错。当然也可以利用for循环迭代输出:
In [6]: for i in it:
...: print(i)
t
h
o
n
如果你深入了解Python之后会发现生成器用起来会更加方便,结合函数即可。生成器的关键字为yield,生成器也具有next()方法,并且可以利用for循环迭代输出。
In [8]: def reverse(data):
...: for i in range(len(data)-1,-1,-1):
...: yield data[i]
In [9]: gen = reverse('mao')
In [10]: print(gen)
<generator object reverse at 0x00000187AD99FDD0>
In [11]: next(gen)
Out[11]: 'o'
In [12]: for i in gen:
...: print(i)
a
m
用小括号括起来的一个表达式可以用来创建一个生成器,下面将讲述如何来书写各种的表达式。
In [14]: gen2 = (i for i in range(0,5))
In [15]: print(gen2)
<generator object <genexpr> at 0x00000187ADA18D60>
表达式
列表表达式
各种表达式为我们创建相关数据类型提供了一种更加简单的方法,首先是列表表达式,普通的方法是通过将一些操作应用于序列的每个成员并通过返回的元素创建列表,或者通过满足特定条件的元素创建子序列。比如我们想获取10以内的平方数,利用普通方法如下:
In [16]: squares = []
In [17]: for i in range(10):
...: squares.append(i ** 2)
In [18]: squares
Out[18]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
但一行语句就足以囊括上面的内容,可见列表表达式的简洁性。
In [20]: squares = [x**2 for x in range(10)]
In [21]: squares
Out[21]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
上面这个列表表达式应该是比较简单的,我们还可以在表达式中加入判断语句作为筛选条件。
In [22]: list2 = [x*2 for x in range(10) if x*2>3]
In [23]: list2#0和2被过滤掉了
Out[23]: [4, 6, 8, 10, 12, 14, 16, 18]
进一步可以结合两个列表的元素组成一个列表表达式:
In [24]: list3 = [(x,y) for x in [1,2] for y in [2,3]if x!=y]
In [25]: list3
Out[25]: [(1, 2), (1, 3), (2, 3)]
在复杂一点的列表表达式就是嵌套类型的,但是这样的表达式缺点就是可读性不太好,因为你需要去思考他的一些细节,比如将一个23的矩阵转变为32的矩阵。
In [28]: mat = [[1,2,3],[4,5,6]]
In [29]: list3 = [[row[i] for row in mat] for i in range(3)]
In [31]: list3
Out[31]: [[1, 4], [2, 5], [3, 6]]
集合表达式
集合表达式与列表表达式有两处不同:
- 1、集合表达式需要用{}In [32]: set1 = {i for i in 'abcdddddd' if i not in 'abc'} In [33]: set1 Out[33]: {'d'}可以看到for语句中的字符串原本有很多d,经过条件过滤和集合去重最后只剩下了一个。
- 2、集合表达式返回的是集合,所以会对元素去重
当然也可以通过set()方法将一个列表表达式转换为集合的形式。
In [34]: set2 = set([(x,y) for x in range(2) for y in range(2)])
In [35]: set2
Out[35]: {(0, 0), (0, 1), (1, 0), (1, 1)}
字典表达式
字典是python中很常用的一种数据类型,所以字典表达式也显得尤为重要。字典表达式同样也用{}构建,只不过表达式还要用(key:value对)的形式。
In [36]: dict1 = {x:x**2 for x in range(1,4)}
In [37]: dict1
Out[37]: {1: 1, 2: 4, 3: 9}
字典表达式也可以结合一些方法、语句实现更多的功能。
In [38]: dict2 = {x:len(x) for x in ['aa','bb','ccc']}
In [39]: dict2
Out[39]: {'aa': 2, 'bb': 2, 'ccc': 3}
利用items()方法很容易实现键值对转换,不过需要注意字典的键需要唯一。
In [40]: dict3 = {v:k for k,v in dict2.items()}
In [41]: dict3
Out[41]: {2: 'bb', 3: 'ccc'}
通过上面几个例子可以看到,表达式是由包含一个表达式的括号组成,表达式后面会跟一个for语句,之后还可以跟零或者多个for或if语句,结果最终会返回一个指定的数据类型,其中的元素是通过表达式依据后面的for和if语句计算而得出的。
- Tomcat和Java Virtual Machine的性能调优总结
- 一次浴火重生的MySQL优化(EXPLAIN命令详解)
- 简单聊聊不可或缺的Nginx反向代理服务器--实现负载均衡【上篇】
- Java设计模式之适配器设计模式(项目升级案例)
- Java设计模式之模板方法设计模式(银行计息案例)
- 多线程之策略模式
- 文件上传的动作不能太俗,必须页面无刷新上传
- 这次真的忽略了一些ActiveMQ内心的娇艳
- 多线程编程:阻塞、并发队列的使用总结
- 多线程编程:多线程并发制单的开发记录【一】
- 如何使用线程锁来提高多线程并发效率
- 如何在分布式环境中同步solr索引库和缓存信息
- 如何在分布式环境中同步solr索引库和缓存信息
- Info模式下的隐形杀手(SpringMVC同时使用<mvc:resources.../>和FormattingConversionServiceFactoryBean时出现的问题)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 3D星空图
- shading-jdbc 4.1.1 + tk.mybatis + pagehelper 1.3.x +spring boot 2.x 使用注意事项
- 用辗转相除法求两个正整数的最大公约数
- Js根据数组相同的值生成二维数组
- 顺序消息管道《Message Pipe》v1.0.2版本发布
- Ts安装及自动编译ts文件
- python 自动化测试(1):获取验证码图片,实现自动登录
- RocketMQ学习第一步之源码构建
- python 库学习之:openpyxl
- python 学习之:读取xml配置文件
- 我的C语言入门笔记~!
- 宜信OCR技术探索之版面分析业务实践|技术沙龙直播速记
- python 学习之:将字符串转换成变量,调用该变量实例对象的方法
- iOS 登录接口封装实践
- 机器学习模型部署—PMML