zoukankan      html  css  js  c++  java
  • Python-变量、函数及递归

    #规则:

      全局变量全部大写,局部变量全部小写

    #关于局部变量和全局变量在函数中应用的关系:

      定义全局变量:

    name = 'alex'         #全局变量

      1、函数中先定义与全局变量名相同的变量后再引用:

    name = 'alex'         #全局变量
    def test():
        name = 'oliver'  #先定义了局部变量(与全局变量名称相同) 
        print(name)     #后使用该变量
    test()
    print(name)
    # -->  oliver    alex

        可看出先定义与全局变量名称相同的局部变量后,在引用时使用的是局部变量的值(Oliver),且原全局变量不受改变(依旧是alex

      2、函数中先使用全局变量后再引用:

    name = 'alex'         #全局变量
    def test():
        print(name)   #本函数内找不到name,所以将采用全局变量name的值来使用
        name = 'oliver'  #修改name的值
        print(name)
    test()
    print(name)
    # -->  报错

        可看出如果函数中引用某变量时,在本函数内找不到定义,则会使用全局变量。但使用全局变量后就无法更改该变量的值。

    # global的使用:

      在上述的讨论中,已经知道方法二:函数中先使用全局变量后再引用,可以使用全局变量的值,但是不能修改,若想修改则需要使用global 将函数中的该变量更改为全局变量。

    name = 'alex'         #全局变量
    def test():
        global age, name
        age = 18    
        print(name, age)
        name = 'oliver'
        print(name)
    test()
    print(name, age)
    # -->  alex 18     oliver     oliver 18

        只要在函数中先用global定义变量,则该变量与在函数外定义的一样,具有全局性,可被修改(name),也可被外部直接引用(age

    #nonlocal的使用:

      global定义的变量为全局变量,该变量会与最外层定义的指定变量等效,但如果想让该变量与其上层函数所定义的某变量等效,则要使用nonlocal。

    name = 'haifeng'           #全局变量
    def huangwei():
        name = 'chenzhuo'      #第一级变量
        def liuwei():
            nonlocal name      #此处name将与第一级变量name等效
            name = 'lengjing'   #将更改第一级变量的值
        liuwei()
        print(name)
    huangwei()
    print(name)
    # -->  lengjing   haifeng   可看出第一级变量被改变,而全局变量值未被改变

    #定义的函数内也可以定义函数(函数嵌套):

    def huangwei():
        print('huang')
        def liuwei():
            print('liu')
        liuwei()
    huangwei()
    # --> huang   liu

      但内部定义的函数不能在外部调用:

    def huangwei():
        print('huang')
        def liuwei():
            print('liu')
        liuwei()
    liuwei()
    # --> 报错:name 'liuwei' is not defined

    #递归:

      函数内部继续调用本函数

    def calc(n):
        print(n)
        if int(n / 2) == 0:
            return n
        return calc(int(n / 2))
    calc(5)
    # -->  5  2  1

        特性:

            1、必须有一个明确的结束条件(否则内存溢出就会报错)

           2、每次进入更深一层递归时,问题规模要逐渐减小

  • 相关阅读:
    Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
    Wireshark抓包原理(ARP劫持、MAC泛洪)及数据流追踪和图像抓取(二)
    Pythonlog() 函数
    Rabbitmq+sockjs+stomp.js前端的使用
    alter table t_user alter column create_date set default CURRENT_TIMESTAMP; 报错(idea生成的sql)
    eldatepicker日期控件日期少一天
    实际开发中String转换为json串作为入参发生"JSON parse error:Cannot deserialize value of type Date......not a valid解决
    Cannot deserialize value of type `java.util.Date` from String
    ProtoBuf试用与JSON的比较
    TCP粘包/拆包问题
  • 原文地址:https://www.cnblogs.com/yu-long/p/9961323.html
Copyright © 2011-2022 走看看