Python中的for循環(huán),沒你想的那么簡(jiǎn)單~

公眾號(hào):尤而小屋
作者:Peter
一年四季,循環(huán)往復(fù):說(shuō)到底就是一個(gè)循環(huán)的問(wèn)題
for語(yǔ)句實(shí)際上解決的是循環(huán)問(wèn)題。在很多的高級(jí)語(yǔ)言中都有for循環(huán)(for loop)。
for語(yǔ)句其實(shí)是編程語(yǔ)言中針對(duì)可迭代對(duì)象的語(yǔ)句,它的主要作用是允許代碼被重復(fù)執(zhí)行。看一段來(lái)自維基百科的介紹:
In computer science, a for-loop (or simply for loop) is a control flow statement for specifying iteration, which allows code to be executed repeatedly。(作用:介紹了for循環(huán)是什么?)
A for-loop has two parts: a header specifying the iteration, and a body which is executed once per iteration. (for循環(huán)是什么構(gòu)成的?)
是什么:在計(jì)算科學(xué)中,是針對(duì)特殊迭代對(duì)象的控制流語(yǔ)句,能夠重復(fù)執(zhí)行 怎么構(gòu)成:一個(gè)頭部(是可迭代對(duì)象)+ 每個(gè)對(duì)象的執(zhí)行

1、可迭代對(duì)象
1.1什么是可迭代對(duì)象
可迭代對(duì)象(Iteratable Object) 是能夠一次返回其中一個(gè)成員的對(duì)象,比如我們常用的字符串、列表、元組、集合、字典等等之類的對(duì)象都屬于可迭代對(duì)象,獲取到這些對(duì)象我們就可以用for循環(huán)來(lái)進(jìn)行操作。
簡(jiǎn)單來(lái)理解,任何你可以循環(huán)遍歷的對(duì)象都是可迭代對(duì)象。
1.2怎么判斷
如何判斷一個(gè)Python對(duì)象是不是可迭代對(duì)象?通常是使用 isinstance()函數(shù)來(lái)判斷對(duì)象是否是可迭代對(duì)象
from?collections?import?Iterable

小結(jié):在Python常見的數(shù)據(jù)對(duì)象中,只有數(shù)字是不可迭代的,字符串、元組、列表、字典等都是可迭代的
2、字符串的for循環(huán)
一次遍歷打印字符串中的每個(gè)元素
for?i?in?"python":?
????print(i)????
p
y
t
h
o
n
在看另一個(gè)例子:
for?i?in?"abcdefg":
????print(i)
a
b
c
d
e
f
g
3、列表的for循環(huán)
不管是單層列表還是多層的嵌套列表,我們都可以遍歷打印出來(lái):
#?單層列表
a?=?["小明","小紅","小張","小王"]
for?i?in?a:
????print(i)??#?打印列表中的每個(gè)元素
小明
小紅
小張
小王
#?嵌套列表
b?=?["小明","小紅","小張","小王",[19,20,18,23]]
for?i?in?b:
????print(i)
小明
小紅
小張
小王
[19, 20, 18, 23]
上面的例子中最后一個(gè)元素當(dāng)做整體被打印出來(lái),如果也想分開打印呢?
def?qiantao(x):???#?定義一個(gè)函數(shù)
????for?each?in?x:??#?遍歷每個(gè)原始列表中的每個(gè)元素
????????if?isinstance(each,?list):??#?判斷每個(gè)元素是否是列表:isintance
????????????qiantao(each)??#?如果是列表,遞歸執(zhí)行函數(shù)qiantao()
????????else:
????????????print(each)??#?如果不是列表,就直接打印該元素
????????????
b?=?["小明","小紅","小張","小王",[19,20,18,23]]
#?調(diào)用函數(shù),傳入列表b
qiantao(b)??
小明
小紅
小張
小王
19
20
18
23
4、元組的for循環(huán)
元組tuple的循環(huán)和列表是類似的:
t?=?("小明","小紅","小王")
for?i?in?t:
????print(i)
小明
小紅
小王
5、字典的for循環(huán)
我們使用keys()、values()、items(),我們可以分別遍歷字典的鍵、值和鍵值對(duì)。需要注意的是:遍歷字典默認(rèn)是遍歷字典的鍵,先定義一個(gè)字典:
d?=?{"name":"Peter","age":20,"sex":"male","address":"china"}
5.1keys()
遍歷字典的鍵;
for?i?in?d.keys():??#?遍歷字典的鍵
????print(i)
name
age
sex
address
for?i?in?d:??#?默認(rèn)就是遍歷鍵的取值
????print(i)
name
age
sex
address
5.2 values()
遍歷字典的值:
for?i?in?d.values():??#?遍歷字典的值
????print(i)
Peter
20
male
china
5.3 items()
同時(shí)遍歷字典的鍵和值
for?i?in?d.items():??#?遍歷字典的值
????print(i)
('name', 'Peter')
('age', 20)
('sex', 'male')
('address', 'china')
分別取出字典的鍵和值:
for?k,v?in?d.items():
????print(k?+?"--->"?+?str(v))
name--->Peter
age--->20
sex--->male
address--->china
6、range函數(shù)的for循環(huán)
range函數(shù)是 Python 內(nèi)置函數(shù),用于生成一系列連續(xù)整數(shù),多用于 for 循環(huán)中。
range(start,stop,step)
start:包含start,默認(rèn)為0,可不寫則默認(rèn)為0 stop:不包含stop,必須寫 步長(zhǎng)step可正可負(fù),默認(rèn)是1,不能為0
1、基礎(chǔ)案例
range(10)??#?生成的是可迭代對(duì)象
range(0, 10)
默認(rèn)開頭是0
range(0,10)
range(0, 10)
指定開頭為1
range(1,10)
range(1, 10)
下面是將結(jié)果展開成列表:
list(range(10))??#?不包含10(尾部)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
指定步長(zhǎng)為2:
list(range(0,10,2))??#?不包含10,步長(zhǎng)是2
[0, 2, 4, 6, 8]
總結(jié):range函數(shù)是包含頭部不包含尾部
for?i?in?range(10):
????print(i)
0
1
2
3
4
5
6
7
8
9
2、找出100以內(nèi)能夠被5整除的數(shù):
for?i?in?range(101):??#?不包含101,0-100
????if?i?%?5?==?0:??#?%表示求余數(shù):余數(shù)為0則表示整除
????????print(i,end="、")
0、5、10、15、20、25、30、35、40、45、50、55、60、65、70、75、80、85、90、95、100、
3、高斯求和
求出1到100的所有數(shù)之和
sum?=?0
for?i?in?range(1,101):
????sum?=?sum?+?i??#?每循環(huán)一次,sum就是這個(gè)數(shù)字
????
sum
5050
求出100以內(nèi)奇數(shù)的和:
sum?=?0
#?步長(zhǎng)為2,從1開始:1,3,5,7...
for?i?in?range(1,101,2):??
????sum?=?sum?+?i
????
sum
2500
求出100以內(nèi)偶數(shù)的和:
sum?=?0
#?步長(zhǎng)為2,從2開始:2,4,6,8...
for?i?in?range(2,101,2):??
????sum?=?sum?+?i
????
sum
2550
7、多個(gè)for語(yǔ)句
for語(yǔ)句中還可以再使用for語(yǔ)句:
for?i?in?["python","java","html"]:
????for?j?in?i:
????????print(i.upper(),j)????# upper():將字母變成大寫
PYTHON p
PYTHON y
PYTHON t
PYTHON h
PYTHON o
PYTHON n
JAVA j
JAVA a
JAVA v
JAVA a
HTML h
HTML t
HTML m
HTML l
for?i?in?[4,5,6]:
????for?j?in?[1,2,3]:
????????print(i*j)??#?實(shí)現(xiàn)任意兩個(gè)數(shù)的乘法
4??#?4*1
8??#?4*2
12?#?4*3
5??#?5*1?
10?#?5*2
15?#?5*3
6??#?6*1
12?#?6*2
18?#?6*3
8、列表推導(dǎo)式
(1)上面我們提到能夠被5整除的數(shù):使用for循環(huán)和if來(lái)解決
five?=?[]??#?定義空列表
for?i?in?range(101):??#?不包含101,0-100
????if?i?%?5?==?0:??#?%表示求余數(shù):余數(shù)為0則表示整除
????????five.append(i)??#?添加到列表中
????????
five
[0,
5,
10,
15,
20,
25,
30,
35,
40,
45,
50,
55,
60,
65,
70,
75,
80,
85,
90,
95,
100]
(2)使用列表推導(dǎo)式如何實(shí)現(xiàn)呢?
[x?for?x?in?range(101)?if?x?%?5?==?0]
[0,
5,
10,
15,
20,
25,
30,
35,
40,
45,
50,
55,
60,
65,
70,
75,
80,
85,
90,
95,
100]
9、for-else
也許你聽過(guò)if-else,但是聽到for-else語(yǔ)句嗎?這也算是Python中的一個(gè)冷門知識(shí)點(diǎn)
for?i?in?range(5):
????print(i)
else:
????print("結(jié)束")
0
1
2
3
4
結(jié)束
也就是說(shuō):for語(yǔ)句結(jié)束了依然會(huì)執(zhí)行else的語(yǔ)句
for?i?in?[]:
????print(i)
????
else:
????print("結(jié)束")
結(jié)束
下面的例子中,當(dāng)i除以3的余數(shù)是2的時(shí)候回跳出并終止整個(gè)for循環(huán),后面的else就不會(huì)執(zhí)行了
for?i?in?range(10):
????print(i)
????if?i?%?3?==?2:
????????break
else:
????print("結(jié)束")
0
1
2
10、實(shí)現(xiàn)三角陣列
for?i?in?range(1,11):
????for?k?in?range(1,i):
????????print(k,?end="?")
????print("\n")
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
如果我們想要倒過(guò)來(lái),該如何實(shí)現(xiàn)呢?
for?i?in?range(10,0,-1):
????for?k?in?range(1,i):
????????print(k,?end="?")
????print("\n")
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7
1 2 3 4 5 6
1 2 3 4 5
1 2 3 4
1 2 3
1 2
1
11、99乘法表
下面舉個(gè)例子來(lái)說(shuō)明如何實(shí)現(xiàn)99乘法表,如何玩轉(zhuǎn)99乘法表參考以前的文章
for?i?in?range(1,10):
????for?j?in?range(1,i+1):??#?為了保證有4*4,也就是同個(gè)數(shù)字相乘的等式,需要讓i出現(xiàn),使用i+1
????????print('{}x{}={}'.format(j,?i,?i*j),?end="?")??#?end的結(jié)束符號(hào)用空格
????print("\n")

1、Python 3.10 正式發(fā)布了!我發(fā)現(xiàn)了一個(gè)可怕的功能...
3、寫 Python 代碼不可不知的函數(shù)式編程技術(shù)(留言送書)
4、某公司領(lǐng)導(dǎo)稱“80后就該退出iT行業(yè)”,遭網(wǎng)友怒噴
5、稚暉君自制機(jī)械臂,能給葡萄縫針的那種,成本1萬(wàn)塊,網(wǎng)友:能把腦子開源一下?

