跳至主要内容

Python 中的 For 循环教程

学习如何实现 Python 中的 For 循环来迭代序列,或迭代 pandas 数据框的行与列。
· 5分钟 阅读

使用 AI 探索

简介

与其他编程语言类似,Python 中的 for 循环有些不同,更像是一个迭代器,而不是传统意义上的 for 关键字。在 Python 中,没有类似 C 的语法 for(i=0; i<n; i++),而是使用 for in n。

它可用于迭代一系列对象,如 list、string、tuple、set、array、data frame。

给定一个元素列表,for 循环可以遍历该列表中的每个项并执行相应操作。

要迭代一系列项目,For 循环会使用 range 函数。range 函数会根据序列的长度返回该范围内数字的新列表。

在遍历序列时,您也可以使用序列中元素的索引来迭代,但关键是先计算列表的长度,然后在该长度范围内进行迭代。

Python 中的 for 循环是从零开始索引的。

我们快速进入实现部分。

您也可以观看此视频,快速上手!

实现循环

首先,我们打印 1–10 的数字。由于 Python 中的 for 循环从零开始索引,您需要在每次迭代中加一;否则会输出 0–9。

for i in range(10):
    print (i+1)

# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10

我们用 for 循环遍历单词 Datacamp 的字符串,并只打印字母 a。

for i in "Datacamp":
    if i == 'a':
        print (i)

# a
# a
# a

假设您想要定义一个元素列表,并逐个迭代这些元素。

sequence = [1, 2, 8, 100, 200, 'datacamp', 'tutorial']
for i in sequence:
    print (i)

# 1
# 2
# 8
# 100
# 200
# datacamp
# tutorial

但如果您想先求出列表的长度,再对其进行迭代呢?您可以使用内置的 len 函数,然后基于长度的输出应用 range。

请记住,range 始终需要一个整数值。

sequence = [1, 2, 8, 100, 200, 'datacamp', 'tutorial']
for i in range(len(sequence)):
    print (sequence[i])

# 1
# 2
# 8
# 100
# 200
# datacamp
# tutorial

太棒了!但当您可以直接使用 for i in numbers 时,为什么还需要用 len 呢?答案很简单。如果您想要修改或操作序列的索引,比如更改现有列表的元素,那就需要 range(len(sequence))。

sequence = [1, 2, 8, 100, 200, 'datacamp', 'tutorial']
for i in range(len(sequence)):
    element = sequence[i]
    if type(element) == int:
        sequence[i] = element + 4

print(sequence)

# [5, 6, 12, 104, 204, 'datacamp', 'tutorial']

很酷,对吧?您能够根据 if 条件修改列表中的元素。

现在我们来看看如何打印 1–20 之间的奇数。为此,您需要在 range 函数中定义三件事:起始点、结束点,以及递增值(或步长),循环会按此步长在 1–20 的数字上递增。

for i in range(1,20,2):
    print (i)

# 1
# 3
# 5
# 7
# 9
# 11
# 13
# 15
# 17
# 19

嵌套 For 循环

for i in range(11):
    for j in range(i):
        print (i, end=' ')
    print()

# 1 
# 2 2 
# 3 3 3 
# 4 4 4 4 
# 5 5 5 5 5 
# 6 6 6 6 6 6 
# 7 7 7 7 7 7 7 
# 8 8 8 8 8 8 8 8 
# 9 9 9 9 9 9 9 9 9 
# 10 10 10 10 10 10 10 10 10 10 

使用 For 循环迭代数据框的行与列

import pandas as pd

iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')

iris.head()
 sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
05.13.51.40.2setosa
14.93.01.40.2setosa
24.73.21.30.2setosa
34.63.11.50.2setosa
45.03.61.40.2setosa
len(iris)

# 150
for i in range(len(iris)):
    Class = iris.iloc[i,4]
    if Class == 'versicolor' and i < 70:
        print (Class)

# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor
# versicolor

接下来,让我们给每一行的 sepal_length、sepal_width、petal_length 和 petal_width 四列都加上 2。

columns = ['sepal_length','sepal_width','petal_length','petal_width']

for indices, row in iris.iterrows():
    for column in columns:
        iris.at[indices,column] = row[column] + 2

iris.head()
 sepal_lengthsepal_widthpetal_lengthpetal_widthspecies
07.15.53.42.2setosa
16.95.03.42.2setosa
26.75.23.32.2setosa
36.65.13.52.2setosa
47.05.63.42.2setosa

使用 Lambda 函数遍历序列

Python 的 lambda 函数相较于基础的 for 循环更快更强大。它被广泛使用,尤其是在处理 DataFrame 时。借助 Lambda 函数,您可以用极少的代码处理数据。不过,有时它也不太容易理解。

x = [20, 30, 40, 50, 60]
y = []

for v in x :
    y += [v * 5]

print(y)

# [100, 150, 200, 250, 300]

现在,我们用 lambda 和 map 函数来实现。

Map 接受一个函数(例如 lambda 函数)和一个序列 x,然后返回一个新的序列。

x = [20, 30, 40, 50, 60]
y = map(lambda x: x * 5,x)

print(y)

# <map object at 0x4063cc8>

它返回的是一个生成器函数,若要从生成器中获取输出;您可以将其作为参数传给 list。

x = [20, 30, 40, 50, 60]
y = map(lambda x: x * 5,x)

print(list(y))

# [100, 150, 200, 250, 300]

现在,我们回过头同时看看 for 循环的方法和 lambda/map() 的组合。您会注意到两者的区别在于使用了 map、lambda,并去掉了 "for" 和 "in"。而且您在一行内就完成了编码。

结论

恭喜您完成本次 Python For 循环基础教程。

For 循环是每种编程语言的基石。在 Python 中,使用 For 循环并不难写,其风格也与英文句子类似。

如果您想进一步学习 Python 中的 for 循环,请查看 DataCamp 的 Python 数据科学工具箱(第 2 部分)课程。

如对本教程有任何疑问,欢迎在下方评论区留言。

主题