流程控制是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. 某cms代码审计

    前言   前几个礼拜上课老师带着挖cms的洞,挖出个cookie反序列化注入漏洞,和报错注入并且提交了cnvd.昨天去找源码的时候发现它更新了一个版本,更新日志上也没说修复,就想着看看漏洞还存不存在, ...

  2. Python-01矩阵、数组和列表等的总结

    python的基础知识总结 使用到了numpy库,所以第一步需要 import numpy as np 1.创建矩阵 1.1一般矩阵的创建 创建一个二维的矩阵,并使用ndim.shape.size分别 ...

  3. mongodb(四):对文档操作增删查改(python)

    连接mongodb #!/usr/bin/env python # -*- coding:utf-8 -*- import pymongo mongo_client = pymongo.MongoCl ...

  4. 机器学习03 /jieba详解

    机器学习03 /jieba详解 目录 机器学习03 /jieba详解 1.引言 2.分词 2.1.jieba.cut && jieba.cut_for_search 2.2.jieba ...

  5. Go Pentester - HTTP CLIENTS(4)

    Interacting with Metasploit msf.go package rpc import ( "bytes" "fmt" "gopk ...

  6. OSCP Learning Notes - Buffer Overflows(2)

    Finding the Offset 1. Use the Metasploite pattern_create.rb tool to create 5900 characters. /usr/sha ...

  7. 耐心看,1个Dubbo漏洞,35道必问面试题,Dubbo没什么可神秘的

    Dubbo漏洞 无意中在网上看到了这样的一条新闻,说是我们360监测发现了Dubbo官方发布的危险漏洞通告,而且尴尬的是,世界上受影响最大的居然是中国,有图有真相 我感觉这也从侧面证明了一件事情,就是 ...

  8. 机房vscode使用方法

    问题 众所周知,机房中的电脑有一个win7系统,(非常的好,摆脱linux了),同时win7上有一个 vscode ,更好了. 但是!vscode 由于老师不允许联网,导致插件无法安装,更为恶心的事, ...

  9. 乌班图16 配置nginx

    阿里云 乌班图16 安装ngnix sudo apt install nginx nginx 启动 重启 关闭 sudo service nginx start restart stop status ...

  10. java判断当前系统是win还是linux

    private static final boolean isWin = System.getProperty("os.name").toLowerCase().contains( ...