如何使for循环在python中更易于理解?

如何使for循环在python中更易于理解?,python,loops,Python,Loops,我目前正在教一些相当年轻的学生python编程。我希望他们学习的一件事是如何编写for循环 到目前为止,我向学生展示的方式如下: for i in range(1,11): print(i) for(int i = 1; i <= 10; i++) { /* do something */ } 它给出了一个循环,i从1到10 我的问题是,学生们似乎很奇怪,当他们希望循环增加到10时,他们需要将11作为range(1,11)的第二个参数。学生们对此感到困惑 在C/C++和

我目前正在教一些相当年轻的学生python编程。我希望他们学习的一件事是如何编写for循环

到目前为止,我向学生展示的方式如下:

for i in range(1,11):
    print(i)
for(int i = 1; i <= 10; i++)
    { /* do something */ }
它给出了一个循环,
i
从1到10

我的问题是,学生们似乎很奇怪,当他们希望循环增加到10时,他们需要将11作为
range(1,11)
的第二个参数。学生们对此感到困惑

在C/C++和相关语言中,这样的循环可以这样编写:

for i in range(1,11):
    print(i)
for(int i = 1; i <= 10; i++)
    { /* do something */ }
for(inti=1;i试试这个:

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


向他们展示两个C++变体:

# using <= operator
for(int i = 1; i <= 10; i++)
    { /* do something */ }

# using < operator
for(int i = 1; i < 11; i++)
    { /* do something */ }

#使用让他们了解列表和数组始终以0开头的标准方式很重要。为了便于理解,请向他们展示下面的代码,这将便于理解数组为何以索引0开头。不要避免复杂性,而是简化它

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


提醒他们range函数以这种方式工作是有原因的。它的一个有用特性是循环运行的次数等于range的第二个参数减去第一个参数

我认为人们对此很感兴趣,但事实是Python中的
for
循环与C非常不同。在C中,
for
循环基本上是while循环的包装器

这两个例子应该有助于说明循环在C和python中的工作方式之间的区别

# for(int x=1; x <= 10; x++)
x = 1
while x <= 10:
    print(x)
    x += 1


i = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  # range(1, 11)
for x in i:
    print(i)

#对于(int x=1;x您可以向他们展示此代码以更好地理解:

start = 1
length = 10
for i in range(start,start+length):
    print(i)
还有另一个类似的功能,叫做。

它不是“更多”或“更少”可以理解的,而是关于你如何描述它:

  • for x in something
    :将iterable
    something
    中的值作为变量
    x
    进行迭代。因此,您需要解释“范围(…)
返回的内容”
  • range(start,end,…)
    返回一个对象,该对象生成从开始(包含)到停止(独占)的整数序列。只需显示它们
    help(range)
  • 你问的是“如何使for循环更像C?”

    有一些方法可以做到这一点:

    
    def nrange(开始,数量元素,步骤=1):
    “”“类似于'range',但第二个参数是元素数。”“”
    返回范围(开始,开始+步骤*num_元素,步骤)
    def范围(启动或停止,停止=无,步骤=1):
    如果停止为无:
    开始=0
    停止=开始或停止+1
    其他:
    开始=开始或停止
    停止=停止+步进
    返回范围(开始、停止、步进)
    _默认值\更新\函数=lambda项:项+1
    def c_like_迭代器(开始、测试_func、更新_func=_默认值_更新_func):
    cur_值=开始
    测试函数(当前值)时:
    屈服电流值
    当前值=更新函数(当前值)
    对于nrange(1,10)中的i:
    印刷品(一)
    对于包含在(1,10)范围内的i:
    印刷品(一)
    对于包含范围(10)中的i:#这将给出11个元素,因为同时包含0和10个值
    印刷品(一)
    
    对于c_-like_迭代器(1,lambda x:x中的i,问题不是理解for循环,而是理解不包括端点的范围。一种方法是将范围的一部分视为栅栏柱和线段;使用范围(10)构建“栅栏”会得到一个包含10个栅栏柱的栅栏==|

    |-|-|-|-|-|-|-|

    但是,您看到的数字将计算围栏段==-您必须位于围栏柱的左侧(|),即0-1-2-3-4-5-6-7-8-9

    如果添加起点,范围(1,10),它仍然构建了一个包含10个栅栏柱的栅栏,但您的索引只会查看至少包含1个栅栏段的所有内容,因此第一个栅栏柱不在您的范围内。但是,当您查看的第一个栅栏柱的索引从0开始时,您会得到1-2-3-4-5-6-7-8-9;仍然没有10,因为我们最初的栅栏柱只有10个。因此,您要么构建一个有11根柱子的栅栏,忽略所有小于1段的部分(范围(1,11)),或者你建造一个有10根柱子的栅栏,并假装它的左边有另一段(范围(0,10)+1)


    将步长更改为大于1只意味着您只需从第一个开始计算每2个/3个/etc栅栏柱,因此如果剩下更多栅栏柱,但没有更多栅栏柱可计算,则末尾的其余栅栏柱将被截断并忽略。

    我认为计算机科学学习中最重要的概念之一是理解数组索引是如何工作的在Python,简单的代码>可以作为例子来说明这个概念。

    #a simple list
    In [15]: list1 = [1,2,3,4,5,6,7,8,9,10,11]
    In [23]: len(list1) #number of items in the list
    Out[23]: 11
    In [26]: list1[0] #the first item in the list
    Out[26]: 1
    In [25]: print("list1 starts at index {}. The number at this index is {}.".format(list1.index(1), list1[0]))
    list1 starts at index 0. The number at this index is 1.
    In [37]: list1[10] #the last item in the list
    Out[37]: 11
    In [19]: print("list1 ends at index {}. The number at this index is {}.".format(len(list1)-1, list1[-1]))
    list1 ends at index 10. The number at this index is 11.
    
    正如您将观察到的,“数字”值比“索引”值提前了
    1
    。如果列表
    list1
    以0开始,以11结束,那么索引值和“数字”值将是相同的,但列表中的项目数将增加
    1
    ,这是因为我们包含了0。请记住这一点我们需要这样的时刻:

    In [29]: list2 = [0,1,2,3,4,5,6,7,8,9,10,11]
    In [31]: len(list2) #total number of items in list
    Out[31]: 12
    In [32]: list2[0]
    Out[32]: 0
    In [35]: list2[11]
    Out[35]: 11
    
    请记住,根据文档,
    range()
    的语法是:
    range(开始、结束、步骤)
    。我们将忽略此讨论中的步骤

    因此,现在如果我想使用
    range()
    生成一个类似于
    list2
    的列表,我可以使用上述信息为range()生成一个通用语法:

    要将其放入列表中,我只需将上述内容作为参数传递给
    list()
    函数。深入了解此函数的本质并不重要,仅用于说明。因此,我们得到:

    In [39]: list3 = list(range(0,len(list2)+0))    
    In [40]: list3
    Out[40]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]    
    In [41]: list2 == list3 #both lists are equivalent
    Out[41]: True
    In [42]: len(list3)
    Out[42]: 12          #same number of items as list2
    In [46]: for i in range(0,len(list3)+0): #can replace list3 with list2 to get same results
        ...:     print(i, end=' ')
            ...:
    
    0 1 2 3 4 5 6 7 8 9 10 11   #Output         
    
    for循环按索引位置进行迭代。因此,
    i
    从项目0的索引位置0(范围的开始)开始,一直到项目11的索引位置11(范围的结束=11+0)

    我们还可以验证
    li的上述语法
    
    Syntax: range(start, len(list2)+start), where start is the first item in the range, 
            list2 is a list and len(list2) is its size and the end is len(list2) + start
    
    In [39]: list3 = list(range(0,len(list2)+0))    
    In [40]: list3
    Out[40]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]    
    In [41]: list2 == list3 #both lists are equivalent
    Out[41]: True
    In [42]: len(list3)
    Out[42]: 12          #same number of items as list2
    In [46]: for i in range(0,len(list3)+0): #can replace list3 with list2 to get same results
        ...:     print(i, end=' ')
            ...:
    
    0 1 2 3 4 5 6 7 8 9 10 11   #Output         
    
    In [6]: list(range(1,len(list1)+1))
    Out[6]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] #same as list1 above
    In [15]: for i in range(1,len(list1)+1):
        ...:     print(i, end=' ')
        ...:
    1 2 3 4 5 6 7 8 9 10 11
    
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int list2[12] = {0,1,2,3,4,5,6,7,8,9,10,11};
        std::cout << "Length of array list2 = " << (sizeof(list2)/sizeof(*list2)) << std::endl;
        for(int i=0;i<(sizeof(list2)/sizeof(*list2));i++)
        {
            cout<<i<<' ';
        }
        return 0;
    }
    
    //Output:
    Length of array list2 = 12                                                                                            
    0 1 2 3 4 5 6 7 8 9 10 11  #Output
    
    In [13]: for i in range(0,len(list2)+1):
        ...:     if i>=len(list2):
        ...:         print("\nI am outside of list2: {}".format(i))
        ...:     else:
        ...:         print(i, end=' ')
        ...:
    0 1 2 3 4 5 6 7 8 9 10 11
    I am outside of list2: 12
    
    for i in range(1,11):
         print(i)
    
        for i in range(1,11)  //in python 
            {do something}
    
        for(int i=1;i<11;i++)  //in C++
            {do something}
    
    for i in range(10):
        # will iterate exactly 10 times with i going from 0 to 9
    
     for i in range(A,B):   # for (i=A;i<B;i++)
         ...
    
     def inclusiveRange(start=0,end,step=1):
         return range(start,end+1,step)
    
     for i in inclusiveRange(1,10):
         ... # will iterate from 1 to 10 inclusively
    
    for i in [1,2,3]:
        {*do something*}
    
    len(range(a, b)) == b - a
    len(range(a)) == a
    range(a, a) == []
    range(a, b) + range(b, c) == range(a, c)
    
    collection = [1, 2, 3]
    for collectionMember in collection:
        print(collectionMember)
    
    collection = range(1,4)
    print(collection)
    for collectionMember in collection:
       print(collectionMember)
    
    start, stop, step = 1, 11, 1
    for i in range(start, stop, step):
        print(i, end=', ')
    # Output: 1 2 3 4 5 6 7 8 9 10