日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

牛逼!Python的判斷、循環(huán)和各種表達式(長文系列第2篇)

 liqualife 2020-08-04

流程控制是python語法很重要的一個分支,主要包括我們經常用到的判斷語句、循環(huán)語句以及各種表達式,這也是上一篇文章沒有介紹表達式的原因,在這篇文章中會更加系統(tǒng)全面的講解這三方面的基礎知識。

判斷語句(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 語句。

循環(huán)語句

1、for循環(huán)

如果C語言是你最熟悉的需要,要注意python和C語言中的for語句表達形式完全不同。Python 的 for 語句依據任意序列(字符串、列表)中的子項,按照它們在序列中的順序來進行迭代。

In [3]: str1 = 'mao'

In [4]: for i in str1:
   ...:     print(i)
   ...:
m
a
o

對列表的循環(huán)與字符串幾乎一致,只是子項不同。

In [5]: list1 = ['a','aa','aaa']
In [6]: for i in list1:
   ...:     print(i,len(i))
   ...:
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]: [12345]

3、break、continue、pass

break語句的作用就是用來跳出一個for或while循環(huán)。

In [15]: for i in range(0,5):
    ...:     if i == 3:
    ...:         break
    ...:     else:
    ...:         print(i)
0
1
2

可以看到在for循環(huán)中加了一個判斷語句,當i等于3時會跳出for循環(huán),不再繼續(xù)執(zhí)行,輸出與語義符合。

continue語句的作用就是表示繼續(xù)執(zhí)行下一次迭代,可以結合判斷語句使用,在什么條件下繼續(xù)執(zhí)行,或者什么條件下跳出循環(huán)。

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占位,不會發(fā)生報錯。

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方法迭代到最后一個值時,繼續(xù)調用next方法會彈出報錯。當然也可以利用for循環(huán)迭代輸出:

In [6]: for i in it:
   ...:     print(i)
t
h
o
n

如果你深入了解Python之后會發(fā)現生成器用起來會更加方便,結合函數即可。生成器的關鍵字為yield,生成器也具有next()方法,并且可以利用for循環(huán)迭代輸出。

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

用小括號括起來的一個表達式可以用來創(chuàng)建一個生成器,下面將講述如何來書寫各種的表達式。

In [14]: gen2 = (i for i in range(0,5))

In [15]: print(gen2)
<generator object <genexpr> at 0x00000187ADA18D60>

表達式

列表表達式

各種表達式為我們創(chuàng)建相關數據類型提供了一種更加簡單的方法,首先是列表表達式,普通的方法是通過將一些操作應用于序列的每個成員并通過返回的元素創(chuàng)建列表,或者通過滿足特定條件的元素創(chuàng)建子序列。比如我們想獲取10以內的平方數,利用普通方法如下:

In [16]: squares = []
In [17]: for i in range(10):
    ...:     squares.append(i ** 2)

In [18]: squares
Out[18]: [0149162536496481]

但一行語句就足以囊括上面的內容,可見列表表達式的簡潔性。

In [20]: squares = [x**2 for x in range(10)]

In [21]: squares
Out[21]: [0149162536496481]

上面這個列表表達式應該是比較簡單的,我們還可以在表達式中加入判斷語句作為篩選條件。

In [22]: list2 = [x*2 for x in range(10if x*2>3]

In [23]: list2#0和2被過濾掉了
Out[23]: [4681012141618]

進一步可以結合兩個列表的元素組成一個列表表達式:

In [24]: list3 = [(x,y) for x in [1,2for y in [2,3]if x!=y]

In [25]: list3
Out[25]: [(12), (13), (23)]

在復雜一點的列表表達式就是嵌套類型的,但是這樣的表達式缺點就是可讀性不太好,因為你需要去思考他的一些細節(jié),比如將一個23的矩陣轉變?yōu)?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]: [[14], [25], [36]]

集合表達式

集合表達式與列表表達式有兩處不同:

  • 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(2for y in range(2)])

In [35]: set2
Out[35]: {(00), (01), (10), (11)}

字典表達式

字典是python中很常用的一種數據類型,所以字典表達式也顯得尤為重要。字典表達式同樣也用{}構建,只不過表達式還要用(key:value對)的形式。

In [36]: dict1 = {x:x**2 for x in range(1,4)}
In [37]: dict1
Out[37]: {112439}

字典表達式也可以結合一些方法、語句實現更多的功能。

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語句計算而得出的。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多