六個實例,八段代碼,詳解Python中的for循環
Python 支持for循環,它的語法與其他語言(如JavaScript 或Java)稍有不同。下面的代碼塊演示如何在Python 中使用for循環來遍歷列表中的元素:
上述的代碼段是將三個字母分行打印的。你可以通過在print語句的后面添加逗號“,”將輸出限制在同一行顯示(如果指定打印的字符很多,則會“換行”),代碼如下所示:
當你希望通過一行而不是多行顯示文本中的內容時,可以使用上述形式的代碼。Python 還提供了內置函數reversed(),它可以反轉循環的方向,例如:
注意,只有當對象的大小是確定的,或者對象實現了_reversed_()方法的時候反向遍歷的功能才有效。
01 使用tryexcept的for循環
清單1 的StringToNums.py說明了如何對一組從字符串轉換而來的整數求和。
- 清單1 StringToNums.py
- line = '1 2 3 4 10e abc'
- sum = 0
- invalidStr = ""
- print('String of numbers:',line)
- for str in line.split(" "):
- try:
- sumsum = sum + eval(str)
- except:
- invalidStrinvalidStr = invalidStr + str + ' '
- print('sum:', sum)
- if(invalidStr != ""):
- print('Invalid strings:',invalidStr)
- else:
- print('All substrings are valid numbers')
清單1 首先初始化變量line、sum和invalidStr,然后顯示line的內容。接下來將line中的內容分割為單詞,然后通過try代碼塊逐個將單詞的數值累加到變量sum 中。如果發生異常,則將當前str的內容追加到變量invalidStr。
當循環執行結束,清單1 打印出數值單詞的和,并在后面顯示非數值單詞。它的輸出如下所示:
02 指數運算
清單2 的Nth_exponet.py說明了如何計算一組整數的冪。
- 清單2 Nth_exponet.py
- maxPower = 4
- maxCount = 4
- def pwr(num):
- prod = 1
- for n in range(1,maxPower+1):
- prodprod = prod*num
- print(num,'to the power',n, 'equals',prod)
- print('-----------')
- for num in range(1,maxCount+1):
- pwr(num)
清單2 中有一個pwr()函數,其參數為一個數值。此函數中的循環可打印出參數的1 到n次方,n的取值范圍在1到maxCount+1之間。
代碼的第二部分通過一個for循環調用pwr()函數從1到maxCount+1的值。它的輸出如下所示:
03 嵌套的循環
清單3 的Triangular1.py說明了如何打印一行連續整數(從1開始),其中每一行的長度都比前一行大1。
- 清單3 Triangular1.py
- max = 8
- for x in range(1,max+1):
- for y in range(1,x+1):
- print(y,'', end='')
- print()
清單3 首先初始化max變量為8,之后通過變量x從1到max+1執行循環。內層循環有一個值為從1到x+1的循環變量y,并打印y的值。它的輸出如下所示:
04 在for循環中使用split()函數
Python 支持各種便捷的字符串操作相關函數,包括split()函數和join()函數。在需要將一行文本分詞化(即“分割”)為單詞,然后使用for循環遍歷這些單詞時,split()函數非常有用。
join()函數與split()函數相反,它將兩個或多個單詞“連接”為一行。通過使用split()函數,你可以輕松地刪除句子中多余的空格,然后調用join()函數,使文本行中每個單詞之間只有一個空格。
1. 使用split()函數做單詞比較
清單4 的Compare2.py說明了如何通過split()函數將文本字符串中的每個單詞與另一個單詞進行比較。
- 清單4 Compare2.py
- x = 'This is a string that contains abc and Abc'
- y = 'abc'
- identical = 0
- casematch = 0
- for w in x.split():
- if(w == y):
- identicalidentical = identical + 1
- elif (w.lower() == y.lower()):
- casematchcasematch = casematch + 1
- if(identical > 0):
- print('found identical matches:', identical)
- if(casematch > 0):
- print('found case matches:', casematch)
- if(casematch == 0 and identical == 0):
- print('no matches found')
清單4 通過split()函數對字符串x中的每個單詞與單詞abc進行比較。如果單詞精確匹配,就將identical變量加1 ;否則就嘗試不區分大小寫進行比較,若匹配就將casematch變量加1。
清單4 的輸出如下所示:
2. 使用split()函數打印指定格式的文本
清單5 的FixedColumnCount1.py 說明了如何打印一組設定固定寬度的字符串。
- 清單5 FixedColumnCount1.py
- import string
- wordCount = 0
- str1 = 'this is a string with a set of words in it'
- print('Left-justified strings:')
- print('-----------------------')
- for w in str1.split():
- print('%-10s' % w)
- wordCountwordCount = wordCount + 1
- if(wordCount % 2 == 0):
- print("")
- print("\n")
- print('Right-justified strings:')
- print('------------------------')
- wordCount = 0
- for w in str1.split():
- print('%10s' % w)
- wordCountwordCount = wordCount + 1
- if(wordCount % 2 == 0):
- print()
清單5 首先初始化變量wordCount和str1,然后執行兩個for循環。第一個for 循環對str1的每個單詞進行左對齊打印,第二個for循環對str1的每個單詞進行右對齊打印。在每個循環中當wordCount是偶數的時候就輸出一次換行,這樣每打印兩個連續的單詞之后就換行。清單5 的輸出如下所示:
3. 使用split()函數打印固定寬度的文本
清單6 的FixedColumnWidth1.py說明了如何打印固定寬度的文本。
- 清單6 FixedColumnWidth1.py
- import string
- left = 0
- right = 0
- columnWidth = 8
- str1 = 'this is a string with a set of words in it and it will be split into a fixed column width'
- strLen = len(str1)
- print('Left-justified column:')
- print('----------------------')
- rowCount = int(strLen/columnWidth)
- for i in range(0,rowCount):
- left = i*columnWidth
- right = (i+1)*columnWidth-1
- word = str1[left:right]
- print("%-10s" % word)
- # check for a 'partial row'
- if(rowCount*columnWidth < strLen):
- left = rowCount*columnWidth-1;
- right = strLen
- word = str1[left:right]
- print("%-10s" % word)
清單6 初始化整型變量columnWidth和字符串類型變量str1。變量strLen是str1的長度,變量rowCount是strLen除以columnWidth的值。之后通過循環打印rowCount行,每行包含columnWidth個字符。代碼的最后部分輸出所有“剩余”的字符。清單6 的輸出如下所示:
4. 使用split()函數比較文本字符串
清單7 的CompareStrings1.py說明了如何判斷一個文本字符串中的單詞是否出現在另一個文本字符串中。
- 清單7 CompareStrings1.py
- text1 = 'a b c d'
- text2 = 'a b c e d'
- if(text2.find(text1) >= 0):
- print('text1 is a substring of text2')
- else:
- print('text1 is not a substring of text2')
- subStr = True
- for w in text1.split():
- if(text2.find(w) == -1):
- subStr = False
- break
- if(subStr == True):
- print('Every word in text1 is a word in text2')
- else:
- print('Not every word in text1 is a word in text2')
清單7 首先初始化兩個字符串變量text1和text2,然后通過條件邏輯判斷字符串text2是否包含了text1(并輸出相應打印信息)。
清單7 的后半部分通過一個循環遍歷字符串text1中的每個單詞,并判斷其是否出現在text2中。如果發現有匹配失敗的情況,就設置變量subStr為False,并通過break語句跳出循環,提前終止for循環的執行。最后根據變量subStr的值打印對應的信息。清單7 的輸出如下所示:
05 用基礎的for循環顯示字符串中的字符
清單8 的StringChars1.py說明了如何打印一個文本字符串中的字符。
- 清單8 StringChars1.py
- text = 'abcdef'
- for ch in text:
- print('char:',ch,'ord value:',ord(ch))
清單8 的代碼簡單直接地通過一個for循環遍歷字符串text并打印它的每個字符以及字符的ord值(ASCII 碼)。清單8 的輸出如下所示:
06 join()函數
另一個去掉多余空格的方法是使用join()函數,代碼示例如下所示:
split()函數將一個文本字符串“分割”為一系列的單詞,同時去掉多余的空格。接下來join()函數使用一個空格作為分隔符將字符串text1中的單詞連接在一起。上述代碼的最后部分使用字符串XYZ替換空格作為分隔符,執行相同的連接操作。上述代碼的輸出如下:
關于作者:奧斯瓦爾德·坎佩薩托(Oswald Campesato),專門研究深度學習、Java、Android和TensorFlow。他是25本書的作者/合著者。