我們要實現一個每隔1秒中在屏幕上列印一次「hello, world」;並持續列印一個小時的程序,我們肯定不能夠直接把`print('hello, world')`這句代碼寫3600遍,如果真的要這樣做,那麼編程的工作就太無聊乏味了。因此,我們還需要了解一下循環結構,有了循環結構我們就可以輕鬆的控制某件事或者某些事重複、重複、再重複的去執行。
Python 中的循環語句有 2 種,上一課我們已經對 while 做了詳細的講解,本節給大家介紹 for 循環,它常用於遍歷字符串、列表、元組、字典、集合等序列類型,逐個獲取序列中的各個元素。
for 循環的語法格式如下:
for 迭代變量 in 字符串|列表|元組|字典|集合:代碼塊
格式中,迭代變量用於存放從序列類型變量中讀取出來的元素,所以一般不會在循環中對迭代變量手動賦值;代碼塊指的是具有相同縮進格式的多行代碼(和 while 一樣),由於和循環結構聯用,因此代碼塊又稱為循環體。for 循環語句的執行流程如圖 1 所示。
for循環的語法格式很容易理解,主要有三種類型,分為數值循環、遍歷列表和元組、遍歷字典。我們通過幾個實例來熟悉它的用法。
實例1:計算1~100求和的結果
如果明確的知道循環執行的次數或者要對一個容器進行迭代(後面會講到),那麼我們推薦使用`for-in`循環,例如下面代碼中計算1~100求和的結果。
用for循環實現1~100求和sum = 0for x in range(101):sum += xprint(sum)
需要說明的是上面代碼中的`range(101)`可以用來構造一個從0到100的取值範圍,這樣就可以構造出一個整數的序列並用於循環中,例如:
- `range(101)`可以產生一個0到100的整數序列。
- `range(1, 100)`可以產生一個1到99的整數序列。
- `range(1, 100, 2)`可以產生一個1到99的奇數序列,其中2是步長,即數值序列的增量。
知道了這一點,我們舉一反三,來實現1~100之間的偶數求和。
ps:在 Python 2.x 中,除提供 range() 函數外,還提供了一個 xrange() 函數,它可以解決 range() 函數不經意間耗掉所有可用內存的問題。但在 Python 3.x 中,已經將 xrange() 更名為 range() 函數,並刪除了老的 xrange() 函數。
本課程用的都是Python 3.x 。
實例2:實現1~100之間的偶數求和
sum = 0for x in range(2, 101, 2):sum += xprint(sum)
循環結構是可以嵌套的,也就是說在循環中還可以構造循環結構。下面的例子演示了如何通過嵌套的循環來輸出一個九九乘法表。
實例3:九九乘法表
for i in range(1, 10):for j in range(1, i + 1):print('%d*%d=%d' % (i, j, i * j), end='\t')print()
使用 for 循環遍歷字典其實也是通過遍歷普通列表來實現的。字典包含了如下三個方法:
items():返回字典中所有 key-value 對的列表。keys():返回字典中所有 key 的列表。values():返回字典中所有 value 的列表。因此,如果要遍歷字典,完全可以先調用字典的上面三個方法之一來獲取字典的所有 key-value 對、所有 key、所有 value,再進行遍歷。如下程序示範了使用 for 循環來遍歷字典:
實例4:輸出小明的考試成績:my_dict ={'語文':89,'數學':92,'英語':80}
my_dict ={'語文':89,'數學':92,'英語':80}# 通過items()方法遍歷所有key-value對# 由於items方法返回的列表元素是key-value對,因此要聲明兩個變量for key, value in my_dict.items():print('key:', key)print('value:', value)print('-------------')# 通過keys()方法遍歷所有keyfor key in my_dict.keys():print('key:', key)# 在通過key獲取valueprint('value:', my_dict[key])print('-------------')# 通過values()方法遍歷所有valuefor value in my_dict.values():print('value:', value)
數學界,質數又稱素數。一個大於1的自然數,除了1和它自身外,不能被其他自然數整除的數叫做質數;否則稱為合數。
質數在實際生活中的應用很廣泛:
質數被利用在密碼學上,所謂的公鑰就是將想要傳遞的信息在編碼時加入質數,編碼之後傳送給收信人,任何人收到此信息後,若沒有此收信人所擁有的密鑰,則解密的過程中(實為尋找素數的過程),將會因為找質數的過程(分解質因數)過久,使即使取得信息也會無意義。在汽車變速箱齒輪的設計上,相鄰的兩個大小齒輪齒數設計成質數,以增加兩齒輪內兩個相同的齒相遇嚙合次數的最小公倍數,可增強耐用度減少故障。在害蟲的生物生長周期與殺蟲劑使用之間的關係上,殺蟲劑的質數次數的使用也得到了證明。實驗表明,質數次數地使用殺蟲劑是最合理的:都是使用在害蟲繁殖的高潮期,而且害蟲很難產生抗藥性。以質數形式無規律變化的飛彈和魚雷可以使敵人不易攔截。多數生物的生命周期也是質數(單位為年),這樣可以最大程度地減少碰見天敵的機會。那如何利用for循環判斷一個數字是不是質數呢?
實例5:隨機輸入一個正整數判斷是不是質數。
from math import sqrtnum = int(input('請輸入一個正整數: '))end = int(sqrt(num))is_prime = Truefor x in range(2, end + 1):if num % x == 0:is_prime = Falsebreakif is_prime and num != 1:print('%d是質數' % num)else:print('%d不是質數' % num)