zoukankan      html  css  js  c++  java
  • 全局变量,局部变量,递归---Python重新开始第四天

    全局与局部变量

     1 NAME = "产品经理"
     2 
     3 def yangjian():
     4     # NAME = "史正文"
     5     global NAME # 已经声明,NAME就是全局的的那个变量
     6     print('我要搞', NAME)
     7     NAME = "小东北"  # 修改 全局的变量
     8     print('我要搞', NAME)
     9 
    10 def qupengfei():
    11     NAME = ""
    12     print('我要搞', NAME)
    13 
    14 如果函数的内容无global关键字,
    15   - 有声明局部变量(打印自己,内部定义了局部变量,用自己内部的)
    16         NAME = ["产品经理","廖波湿"]
    17         def qupengfei():
    18             NAME = "自己"
    19             print('我要搞', NAME)
    20         qupengfei()
    21   - 无声明局部变量(打印三个,没有局部变量,就用全局变量)
    22         NAME = ["产品经理","廖波湿"]
    23         def qupengfei():
    24             NAME.append('XXOO')
    25             print('我要搞', NAME)
    26         qupengfei()
    27 
    28 如果函数的内容有global关键字
    29   - 有声明局部变量(声明了这个是全局变量,把“自己”赋值给全局了,打印改变的全局变量)
    30         NAME = ["产品经理","廖波湿"]
    31         def qupengfei():
    32             global NAME
    33             NAME = "自己"
    34             print('我要搞', NAME)
    35         qupengfei()
    36         错误示例(报错,重复赋值,先定义局部变量,再声明是全局变量,这样不行)
    37         NAME = ["产品经理","廖波湿"]
    38         def qupengfei():
    39             NAME = "自己"
    40             global NAME
    41             print('我要搞', NAME)
    42         qupengfei()
    43   - 无声明局部变量(修改了全局,在修改的基础上,加了新的,打印“阿毛,XXOO”)
    44         NAME = ["产品经理","廖波湿"]
    45         def qupengfei():
    46             global NAME
    47             NAME = ["阿毛"]
    48             NAME.append('XXOO')
    49             print('我要搞', NAME)
    50         qupengfei()
    51 
    52 ####### 全局变量变量名大写
    53 ####### 局部变量变量名小写
    54 
    55 
    56 优先读取局部变量,能读取全局变量,无法对全局变量重新赋值 NAME=“fff”,
    57     但是对于可变类型,可以对内部元素进行操作
    58 如果函数中有global关键字,变量本质上就是全局的那个变量,可读取可赋值 NAME=“fff”
    59 qupengfei()
    60 yangjian()

    注意:nonlocal   可指定上一级变量,如果没有就继续往上直到找到为止

    函数即变量

     1 概念:定义函数时相当于定义了一个变量,没有调用时不会执行功能,
     2 但是存在于程序中,下面举两个例子,比较容易理解
     3 
     4 例1:程序不会出错
     5 def foo():
     6     print('from foo')
     7     bar()
     8 
     9 def bar():
    10     print('from bar')
    11 foo()    #在执行foo函数前已经定义好了bar
    12 
    13 例2:程序会出错
    14 def foo():
    15     print('from foo')
    16     bar()
    17 foo()    #在调用foo前没有定义好bar函数
    18 def bar():
    19     print('from bar')

     另外:

    如果一个函数没有return,那么默认return 的值是None

     1 ####################
     2 def bar():
     3     print('from bar')
     4 def foo():
     5     print('from foo')
     6     bar()
     7 
     8 foo()
     9 #################### 
    10 def foo():
    11     print('from foo')
    12     bar()
    13 
    14 def bar():
    15     print('from bar')
    16 foo()
    17 ####################
    18 #这样不行,第一步foo函数编译,第二部执行foo(),
    19 #执行到第三部发现,不知道bar()函数是干嘛的,报错
    20 def foo():             1
    21     print('from foo')  
    22     bar()              3
    23 
    24 foo()                  2
    25 
    26 def bar():
    27     print('from bar')

    递归函数

    递归函数效率不高,占用内存

    例1

    1 def calc(n):
    2     print(n)
    3     if int(n / 2) == 0:
    4         return n
    5     res=calc(int(n / 2))    #这样更好理解
    6     return res              #这样更好理解
    7      #return calc(int(n / 2))#两句合并成
    8 res=calc(10)
    9 print(res)

    例2

     1 import time
     2 person_list=['alex','wupeiqi','linhaifeng','zsc']
     3 def ask_way(person_list):
     4     print('-'*60)
     5     if len(person_list) == 0:
     6         return '根本没人知道'
     7     person=person_list.pop(0)
     8     if person == 'linhaifeng':
     9         return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' %person
    10 
    11     print('hi 美男[%s],敢问路在何方' % person)
    12     print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' % (person, person_list))
    13     time.sleep(1)
    14     res=ask_way(person_list)
    15 
    16     #此级别没完,在得到返回值后,还要执行打印,再把它返回的值,返回到上一级等待的res
    17     print('%s问的结果是: %res' %(person,res))
    18     return res
    19 
    20 res=ask_way(person_list)
    21 print(res)
    22 # 我             来英            杨建           是征文
    23 # res等 <————————res等  <————————res等  <——————return ‘沙河’
    24 # print(res)     print(res)      print(res)     

    总结:递归函数,在进入下级递归时,有一个res在等待返回的值,但是返回的值又是执行函数本身,一直执行,每一级都有个res在等着它的下一级返回值,

    直到设定的边界,边界return了值,返回给边界的上一级,上一级运行完,要执行res=xxx 后面的同级代码,遇到return,再返回给上上级

    看结果:

     1 ------------------------------------------------------------
     2 hi 美男[alex],敢问路在何方
     3 alex回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['wupeiqi', 'linhaifeng', 'zsc']...
     4 ------------------------------------------------------------
     5 hi 美男[wupeiqi],敢问路在何方
     6 wupeiqi回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['linhaifeng', 'zsc']...
     7 ------------------------------------------------------------
     8 wupeiqi问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
     9 alex问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
    10 linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是
  • 相关阅读:
    HTML撑起浮动子元素得父元素高度
    H5弃用标签和属性
    HTML常用转义字符
    php微信公众号开发入门
    常见正则表达式总结
    解决上下两个相邻图片之间存在默认间距的问题
    移动端真机调试的两种方法
    H5使用小结
    CF 11D
    Codeforces Round #639 (Div. 2) C Hilbert's Hotel (数学)
  • 原文地址:https://www.cnblogs.com/lishuaing/p/10679378.html
Copyright © 2011-2022 走看看