流程控制是python语法很重要的一个分支,主要包括我们经常用到的判断语句、循环语句以及各种表达式,这也是上一篇文章没有介绍表达式的原因,在这篇文章中会更加系统全面的讲解这三方面的基础知识。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

判断语句(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)]

在复杂一点的列表表达式就是嵌套类型的,但是这样的表达式缺点就是可读性不太好,因为你需要去思考他的一些细节,比如将一个2 3的矩阵转变为3 2的矩阵。

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、集合表达式需要用{}

  • 2、集合表达式返回的是集合,所以会对元素去重

In [32]: set1 = {i for i in 'abcdddddd' if i not in 'abc'}

In [33]: set1
Out[33]: {'d'}

可以看到for语句中的字符串原本有很多d,经过条件过滤和集合去重最后只剩下了一个。

当然也可以通过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语句计算而得出的。

牛逼!Python的判断、循环和各种表达式(长文系列第2篇的更多相关文章

  1. Python 条件判断 循环

    age = 20 if age >= 18: print('your age is', age) print('adult') 根据Python的缩进规则,如果if语句判断是True,就把缩进的 ...

  2. python之判断和循环

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

  3. Intellij IDEA 智能补全的 10 个姿势,太牛逼了。。

    一年多前,栈长那时候刚从 Eclipse 转型 IDEA 成功,前面转了好多次,都是失败史,都是泪..后面我就在微信公众号 "Java技术栈" 写了这篇文章:Intellij ID ...

  4. Intellij IDEA 智能补全的 10 个姿势,简直不能太牛逼!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 一年多前,栈长那时候刚从 Eclipse 转型 IDEA 成功,前面转了好多次,都是失败史,都是泪.. 后面我就在微信公众号 ...

  5. 为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?

    为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技 ...

  6. 我喜欢ASP.NET的MVC因为它牛逼的9大理由(转载)

    我很早就关注ASP.NET的mvc的,因为最开始是学了Java的MVC,由于工作的原因一直在做.Net开发,最近的几个新项目我采用了MVC做了,我个一直都非常喜欢.Net的MVC.我们为什么使用MVC ...

  7. Python之 for循环\while循环

    list或tuple可以表示一个有序集合.如果我们想依次访问一个list中的每一个元素呢?比如 list: L = ['Adam', 'Lisa', 'Bart'] print L[0] print ...

  8. csvkit---python一个牛逼到不行的csv处理库

    先吐槽一下:不管是百度还是谷歌,查来查去除了官方文档之外就没有任何可以借鉴的例子,虽然官方文档写的挺好的.但是我一直以为是在python语言的方式运行的,结果是以命令行的方式运行的,搞得我还以为这个库 ...

  9. Python数据结构与循环语句

    # Python数据结构与循环语句:   首先编程是一项技能,类似跑步,期初不必在意细节,能使用起来就行,等学的游刃有余了再回过头来关注细节问题也不迟.  关于买书: 学会python之后,才需要买书 ...

随机推荐

  1. Python-02 可视化之tkinter介绍

    1 控件介绍 1.1 Label import tkinter as tk # 使用Tkinter前需要先导入 window = tk.Tk() window.title('My Window') w ...

  2. Python之爬虫(二十一) Scrapy爬取所有知乎用户信息(下)

    在上一篇文章中主要写了关于爬虫过程的分析,下面是代码的实现,完整代码在:https://github.com/pythonsite/spider items中的代码主要是我们要爬取的字段的定义 cla ...

  3. Python之 爬虫(十二)关于深度优先和广度优先

    网站的树结构 深度优先算法和实现 广度优先算法和实现 网站的树结构 通过伯乐在线网站为例子: 并且我们通过访问伯乐在线也是可以发现,我们从任何一个子页面其实都是可以返回到首页,所以当我们爬取页面的数据 ...

  4. 关于springboot中过滤器和拦截器

    在解决跨域问题中,发现拦截器和过滤器用得不是熟练.就参考了下一下两个作者的文档.希望大家也可以汲取精华 文档1   https://blog.csdn.net/moonpure/article/det ...

  5. 小白从零开始阿里云部署react项目+node服务接口(一:阿里云服务器)

    准备阿里云服务器,并安装系统 如果没用自己服务器可以购买一个 https://www.aliyun.com/minisite/goods?userCode=x7i5glgc 初级购买一个1核2G的主机 ...

  6. HDOJ 1051. Wooden Sticks

    题目 There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The ...

  7. MySQL数据库---库的操作

    MySQL数据库中,以库,表,记录的形式管理所有的数据,安装MySQL数据库的服务器上可以包含多个库,一个库中包含多张表,一张表中包含多条记录.库对应的是文件系统中文件夹的概念,表对应的是文件的概念, ...

  8. PHP常见的十个安全问题

    相对于其他几种语言来说, PHP 在 web 建站方面有更大的优势,即使是新手,也能很容易搭建一个网站出来.但这种优势也容易带来一些负面影响,因为很多的 PHP 教程没有涉及到安全方面的知识. 此帖子 ...

  9. Django安装与简单配置(1)

    目录 1. 环境准备 2. 开始安装 2.1 安装Django 2.2 安装 Mysql数据库 3. 开始配置 3.1 Django简单配置 3.1.1 创建一个工程(project)为devops: ...

  10. xshell如果通过跳板机登录其他机器

    首先,跳板机设置隧道 目标机器,选择刚才的隧道作为代理