精华内容
下载资源
问答
  • 为什么会有个None因为print(funcList[0]())语句中, funcList[0]()的返回值是None:def printI():# 这里打印了i_List[i], 加一个括号, 但是不换行print...就会打印`None`如何在for循环中利用循环变量批量创建函数这是...

    为什么会有个None

    因为print(funcList[0]())语句中, funcList[0]()的返回值是None:def printI():

    # 这里打印了i_List[i], 加一个括号, 但是不换行

    print(i_List[i], end = ',')

    # 所有不显示返回的返回值都是None

    # 外层再有一个print()的话,就会打印`None`如何在for循环中利用循环变量批量创建函数

    这是个陷阱,情况跟Javascript类似。printI这个闭包捕获了i这个变量(捕获的是变量本身而不是变量的值), 但是i变量是变化的, 所以最后的结果都是i在迭代后的最后一个值。

    因此,有几个办法可以绕过(不限于以下几种):

    1....

    def printI(x):

    def _printI():

    print(i_List[x], end = ',')

    return _printI

    funcList.append(printI(i))

    ...

    2.from functools import partial

    ...

    def printI(x):

    print(i_List[x], end = ',')

    funcList.append(partial(printI, i))

    ...

    3....

    def printI(i=i):

    print(i_List[i], end = ',')

    funcList.append(printI)

    ...

    展开全文
  • }具体划分:for(循环变量赋初值;循环条件;循环变量增值)。其中,循环变量增值有以下方式:举例:1.假设每次循环增值为1. 书上116页提供的增值代码:#include<stdio.h>int main(){ for(i=1;i<=100;i++){...

    一.for循环语句一般形式为:

    for(表达式1;表达式2;表达式3)

    {

          语句;

    }具体划分:

    for(循环变量赋初值;循环条件;循环变量增值)。其中,循环变量增值有以下方式:


    举例:

    1.假设每次循环增值为1.

       书上116页提供的增值代码:

    #include<stdio.h>

    int main()

    {

       for(i=1;i<=100;i++)

    {

        printf(“%d”,i);

    }

       return 0;

    }
    其中循环增量采用先赋值后自增的方式。如果我们采用书上的增量方式并不方便,当循环增量不为1时,为2时,书上119页图5.10左边代码给出了代码:

    for(i=1;i<=100;i++,i++

    {

       sum=sum+i;

    }

    我发现使用++i其实可以替代i++,它们的含义不同,但编译结果是相同的。

    那最简便的增值方式是:i+=1。其展开式为i=i+1;等同于i++。

    当增量为100时,你就无需使用i++,i++,i++,i++一百次了,而是直接使用i+=100就可以搞定。

    二.总结:

    1.除了使用i++也可使用++i代替。

    2.当增量不为1时,为n时,可以采用i+=n(n为无穷大)。



    转载于:https://juejin.im/post/5bb2c4a8e51d450e8e772e5c

    展开全文
  • 文章目录python3中 for 循环中循环变量的作用域问题1-1 来看一个例子1-2 来看第二个例子1-3 循环变量 覆盖 外层变量的问题2 python 变量的作用域的问题2-1 来看一个 全局变量的例子2-2 如何修改一个全局变量呢2-3 在...

    python3中 for 循环中循环变量的作用域问题

    前段时间 对实际项目重构代码,然后在我给变量重新命名的时候,
    for 循环中循环变量名 和外层 的变量名,取名相同,结果直接覆盖了外层变量的值, 由此 我就查了一下 文档有了这篇文章。

    1-1 来看一个例子

    编写 hello.py

    
    for num in [1, 5, 10]:
        print(num,end=' ')
    
    print(f"=== after for:{num}")
    

    结果输出
    1 5 10 === after for:10

    num 这个变量 在 for 循环代码块 结束后,仍然有效。

    也就是说在 for 循环 迭代 一个可迭代对象的时候,离开for 循环的代码段,这个 循环变量num 依然有效 。

    1-2 来看第二个例子

    如果迭代是 对象没有值的话,num 就不会赋值 这个时候,for 循环 就不能进入,此时num 也没有赋值,即没有num 这个变量.

    
    for num in []:
        print(num,end=' ')
    
    print(f"=== after for:{num}")
    
    

    结果如下:

    img-01

    1-3 循环变量 覆盖 外层变量的问题

    如果我在 模块级别定义一个num 的变量,然后 for 循环的索引变量 也是num 并且 迭代对象 不为空的时候, 这个时候 就有可能出现 问题,

    因为此时 for 循环的 索引变量 num 会覆盖外层的变量, 使外层变量的值发生改变。

    
    num =100
    
    for num in [1,2,3]:
        print(num,end=' ')
    
    print(f"=== after for:{num}")
    
    

    结果如下:
    1 2 3 === after for:3

    从结果可以看出 num 的值是3 ,说明 经过 for 循环后 ,num 最后赋值为3, 和 上面 num =100 有冲突,直接 把 num 的值 覆盖了。
    这是因为 外层num 和 for 循环里面的 num 是处于一个作用域, 都是模块级别的变量。 所以都在模块级别的变量,不能重复。

    那么如何避免这种问题呢?

    方法一:
    修改 循环变量的名称,不要和外层变量名一样,这样两个变量名称,就不会冲突了。

    方法二 :
    可以把for 循环里面的内容 封装成一个函数,这样就可以 避免变量名 覆盖的问题。

    # -*- coding: utf-8 -*- 
    
    num = 100
    
    
    def print_num():
        for num in [1, 2, 3]:
            print(num, end=' ')
        print()
    
    
    if __name__ == '__main__':
        print_num()
        print(f"=== after print_num:{num}")
        pass
    
    

    结果如下:
    img-02

    从结果可以看出, num 没有被污染, 这两个 num 在不同的作用域里面。
    这样python 解释器 就不会覆盖。

    2 python 变量的作用域的问题

    正好来一起来探讨 变量作用域的问题 ,
    作用域 就是指 一个变量的作用范围在哪里。 一个变量的作用范围 或者说 在哪一代码段 是有效的。

    在python中

    全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。

    全局名称 就是 一般定义在模块级别的变量。

    局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

    局部 是指 定义在函数 或者类中的一些变量。

    2-1 来看一个 全局变量的例子

    # -*- coding: utf-8 -*-
    
    # 全局变量
    num = 100
    
    
    
    print(f"module num:{num}")
    
    
    def visit_num():
        print(f"visit num:{num}")
    
    
    
    
    
    if __name__ == '__main__':
        visit_num()
        print(f"main num:{num}")
        pass
    

    由于num 定义在 模块级别 是一个全局变量,此时 num 之后的所有代码 都可以访问到这个变量的。 这就是全局变量

    2-2 如何修改一个全局变量呢

    你可能 直接感觉 visit_num 函数里面修改这个变量不就可以了吗,

    如下面的代码段

    # -*- coding: utf-8 -*-
    
    
    num = 10000000
    
    print(f"module num:{num}")
    
    
    def visit_num():
        print(f"visit num:{num}")
        num = 0
    
    
    if __name__ == '__main__':
        visit_num()
        print(f"main num:{num}")
    

    运行代码发现会报错

    img-05

    原因是 解释器无法知道 num=0 是想在 visit_num() 这个函数定义一个变量叫num,还是想修改 上面定义的全局变量,所以 就报错了。

    那么如何让 解释理解 num 是要修改 全局变量呢?

    # -*- coding: utf-8 -*-
    
    num = 10000000
    
    print(f"module num:{num}")
    
    
    def visit_num():
        # 这里使用关键字进行声明
        global num
        print(f"visit num:{num}")
        # modify num
        num = 0
    
    
    if __name__ == '__main__':
        visit_num()
        print(f"main num:{num}")
    
    

    这样就可以正常 的修改 num 的值了。 就是需要在 函数前面的位置 用 global 关键字 进行声明 num, 这样解释器 就能明白我现在要 更改的是一个全局变量里面的num.

    2-3 在函数中定义自己的变量

    思考一下:
    如果想没有添加 global 声明 ,然后直接修改num 的值 ,会有什么结果呢?

    # -*- coding: utf-8 -*-
    
    num = 10000000
    print(f"module num:{num}")
    
    
    def visit_num():
        # modify num
        num = 0
        print("modify  num done.")
    
    
    if __name__ == '__main__':
        visit_num()
        print(f"main num:{num}")
        pass
    

    结果如下:
    img-06

    可以看出 这里并没有把num 的值 修改,原因是 在visit_num 中定义了一个新的 num 变量,这个变量 和外层的变量 不在一个scope 里面, 一个是局部变量,一个是全局变量。 所以 python解释器 就可以知道这是新定义的一个变量。 和外层的模块级别的 num 变量没有关系。

    所以 简单总结一下, 如果在函数中定义了一个和模块级别的变量的相同的名称,这两个变量 是 不相互影响的。

    但是如果都在模块级别定义相同的变量名称,就会出现变量名 被覆盖的情况。 不论这个变量出现在 for 循环,还是 其他的任何位置,只要 这段代码被执行了,就会覆盖之前的变量。

    
    num = 1000
    
    for num in [1, 2]:
        pass
    

    但是有一种比较特殊的情况,对于列表推导式的情况下,它的循环变量只在 自己的列表推导式里面, 出了列表推导式,变量就不存在了。

    
    >>> l = [num ** 2 for num in range(5)]
    >>> l
    [0, 1, 4, 9, 16]
    >>> num
    Traceback (most recent call last):
      File "<input>", line 1, in <module>
    NameError: name 'num' is not defined
    

    对于推导式的作用域就类似 在函数里面了, 出了列表推导式,变量 就失效了。

    总结

    平常还是要多留意不同语言之间的差别,每一种语言的设计,都有每一种语言的设计理念,只有理解的作者的理念,才能体会到语言之美,不断总结吧,也给自己一个小小的教训,不要想当然的认为 ,这个应该是这样的,多去实践,来去检查自己的想法。

    分享快乐,留住感动. '2020-10-24 09:54:18' --frank
    展开全文
  • [python笔记]for循环中循环变量迭代问题在python中,for循环相当于一个迭代器,在循环体中改变循环变量的值对循环次数是没有影响的。

    [python笔记]for循环中循环变量迭代问题

    在python中,for循环相当于一个迭代器(Iterator),在循环体中改变循环变量的值对循环次数是没有影响的。
    迭代器在一个独立的线程中工作,并且拥有一个mutex锁。迭代器被创建的时候,建立了一个内存索引表(单链表),这个索引表指向原来的对象,当原来的对象数量改变的时候,这个索引表的内容没有同步改变,所以当索引指针往下移动的时候,便找不到要迭代的对象,于是产生错误。就是说迭代器在工作的时候,是不允许被迭代的对象被改变的。
    举个例子,i从0到10循环,j取i+1到10,如果i+j大于5,则i跳到当前的j,并进行后面的循环(不知道怎么描述才对,看不明白就直接看代码吧/(ㄒoㄒ)/~~)。用for循环写就是:

    print("when we use 'for':")
    for i in range(10):
        print('i:',i)
        for j in range(i+1,10):
            print('\tj=',j)
            if i+j<5:
                j=j+1
                continue
            else:
                i=j
                break

    运行结果:

    when we use 'for':
    i: 0
            j= 1
            j= 2
            j= 3
            j= 4
            j= 5
    i: 1
            j= 2
            j= 3
            j= 4
    i: 2
            j= 3
    i: 3
            j= 4
    i: 4
            j= 5
    i: 5
            j= 6
    i: 6
            j= 7
    i: 7
            j= 8
    i: 8
            j= 9
    i: 9

    从运行结果可以看出,i并没有变动。


    List、Set等是动态的、可变对象数量的数据结构,但是迭代器是单向不可变、只能顺序读取、不能逆序操作的数据结构,当迭代器指向的原始数据发生变化时,迭代器自己就迷失了方向。因此,我们可以改用while循环:

    print("\nwhen we use 'while':") 
    i=0
    while i < 10:
        print('i:',i)
        j=i+1
        while j < 10:
            print('\tj=',j)
            if i+j<5:
                j=j+1
                continue
            else:
                i=j
                break
        i=i+1

    运行结果:

    when we use 'while':
    i: 0
            j= 1
            j= 2
            j= 3
            j= 4
            j= 5
    i: 6
            j= 7
    i: 8
            j= 9

    此时就得到了我们想要的效果。


    需要注意的是,while循环的运行效率比for循环低,所以会花费较多的时间。

    展开全文
  • matlab中for循环的循环变量在循环体中不能改变 for i = 1:50 if... i=i-1 else ... end i-1是不会起作用 用while吧
  • matlab之在循环中修改循环变量

    万次阅读 2017-06-16 16:48:34
    matlab有特定的for循环形式,如for i=1:10,这个循环每次都会在已定的向量中取值。 如果写作: for i=1:10 ... i=i+2; ...如果想要在每次循环中改变循环变量,可以使用while 如 while i ... i=i+2;
  • 其中的 i=i+5 这一行不会改变for循环中i的值,for循环变量i会取哪些值,是第一次进入循环时就决定了的。无论在循环中做什么事都不会改变循环的起始,中止,或步长值。要想实现想要的功能,可以使用while ...
  • 防止在循环体里修改循环变量 在默认情况下,编译器是允许在第二种for循环的循环体里,对循环变量重新赋值的。不过,因为这种做法对循环体外面的情况丝毫没有影响,又容易造成理解代码时的困难,所以一般并不推荐...
  • vb6.0编程语言平台怎么可以实现循环变量在循环里作为一个窗体的控件变量?怎么使用这个变量调用控件属性?
  • 预处理机制:批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。在不启用变量延迟,也...
  • 本文主要将在shell中如何编写for循环,并将循环变量作为下个shell脚本的参数。
  • 用vb6.0开发语言的方式怎么实现循环语句的循环变量转换为窗体变量,调用属性的方式?窗体变量调用窗体控件属性方式是?
  • 请问如何在vb6.0编程语言中实现循环的循环变量作为多个控件类型并循环调用?多个类型的变量在vb6.0的定义的方式?
  • 在使用vb6.0编程开发,请教各位怎么实现for循环的循环变量对窗体上界面控件的循环调用,这里的循环变量i的赋值怎么写?
  • 如何在vb6.0中实现循环语句的循环变量作为窗体控件的控件名来调用?怎么用循环变量调用控件属性?
  • 假如闭包调用循环变量,在Go中的实现方法为,循环中用一个新的变量保存这个循环变量的值,具体实现代码如下: //Go package main import ( "fmt" "reflect" ) func main() { var funcArray = count() for ...
  • Java循环变量在哪里赋值

    千次阅读 2017-07-20 20:08:06
    在循环体外为循环变量赋初值: int sum=0; int i=0,j=0,k=0; for(;i;i++){ for(;j;j++){ for(;k;k++){ sum++; } }
  • js中for循环变量的作用域

    千次阅读 2017-03-15 18:43:43
    js中for循环变量的作用域
  • 请问怎么才能在vb6.0中实现使用循环语句的做法调用循环变量作为控件名?控件名事先不知道可以作为循环变量写在循环里么?
  • 请问各位怎么实现vb6.0中文版编程中循环语句通过循环变量调用控件属性的属性值,属性和循环变量的控件怎么不通过控件名调用?
  • 将for循环的循环变量放到循环体外起到标志位的作用 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Break { class Program { static void Main(string[] ...
  • 易错点:for循环中循环变量的更新所带来的问题标签:C语言 for循环 易错点by 小威威1.for循环的介绍for循环的格式如下: for (表达式1;表达式2;表达式3) 其中,表达式1指初始化表达式,表达式2指循环条件表达式...
  • python的for循环中不能修改循环变量i

    千次阅读 2015-11-26 15:01:30
    python的for循环中不能修改循环变量i,有需求可以用while代替 如: for i in range(0,len(seq)) 可以修改为: i = 0 length = len(seq) while i  #just do it  i += 1
  • 请教vb6.0编程语言开发怎么循环不是按照顺序而是按照类别对循环变量进行调用的呢?怎么进行循环变量类型的判断和调用?
  • 第六课for循环(2)---使用循环变量

    千次阅读 2015-09-30 00:50:08
    第六课 for循环(2)---使用循环变量循环变量】 上节课样例程序中使用了c++的for循环语句的简单形式,基本格式为: for (int i=0; i < N; i++ )   语句/复合语句; 其中: l 第1部分“ int i=0 ”表示在循环...
  • matlab中for循环的循环变量在循环体中不能改变的问题最近一直在写java,写习惯了,发现写matlab还是挺不习惯的,由于本人是通信专业的学生,因此,也就避免不了要做一些仿真,也就避免不了要写了一些matlab程序,...
  • Python 嵌套函数中内部函数引用外部函数循环变量情况 Python中的嵌套函数也称为闭包(Closure),有一个特点就是内部函数可以引用外部函数内的变量并且在外部函数返回后保存该引用变量的值;但是如果该引用变量是...
  • 在for循环中,我们有时会想要在for循环中多个地方,改变当前控制for循环变量的值,让它按照这个值重新循环。一个解决方法是,用一个布尔值isChangeI,在改变后没这个值设置为true,最后再用if(isChangeI)判断,...
  • 请问vb6.0平台编程语言开发怎么实现使用循环语句对控件的列举,循环变量的写法是什么?怎么用循环变量表示控件?
  • 请教下怎么在vb6.0编程语言系统中实现用循环语句的循环变量表示窗体的每个控件?循环变量的赋值是怎么做到的?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,321
精华内容 23,328
关键字:

循环变量