乐趣区

关于python: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)]

在简单一点的列表表达式就是嵌套类型的,然而这样的表达式毛病就是可读性不太好,因为你须要去思考他的一些细节,比方将一个 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 语句计算而得出的。

退出移动版