zoukankan      html  css  js  c++  java
  • python 学习之 函数进阶

    五 局部变量和全局变量

    在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
    全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
    当全局变量与局部变量同名时:
    在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
    复制代码
     1 name='lhf'
     2 
     3 def change_name():
     4     print('我的名字',name)
     5 
     6 change_name()
     7 
     8 
     9 def change_name():
    10     name='帅了一笔'
    11     print('我的名字',name)
    12 
    13 change_name()
    14 print(name)
    15 
    16 
    17 
    18 def change_name():
    19     global name
    20     name='帅了一笔'
    21     print('我的名字',name)
    22 
    23 change_name()
    24 print(name)
    复制代码

    六 前向引用之'函数即变量'

    复制代码
     1 def action():
     2     print 'in the action'
     3     logger()
     4 action()
     5 报错NameError: global name 'logger' is not defined
     6 
     7 
     8 def logger():
     9     print 'in the logger'
    10 def action():
    11     print 'in the action'
    12     logger()
    13  
    14 action()
    15  
    16 
    17 def action():
    18     print 'in the action'
    19     logger()
    20 def logger():
    21     print 'in the logger'
    22  
    23 action() 
    复制代码

    七 嵌套函数和作用域

    看上面的标题的意思是,函数还能套函数?of course

    复制代码
     1 name = "Alex"
     2  
     3 def change_name():
     4     name = "Alex2"
     5  
     6     def change_name2():
     7         name = "Alex3"
     8         print("第3层打印",name)
     9  
    10     change_name2() #调用内层函数
    11     print("第2层打印",name)
    12  
    13  
    14 change_name()
    15 print("最外层打印",name)
    复制代码

    此时,在最外层调用change_name2()会出现什么效果?

    没错, 出错了, 为什么呢?

    作用域在定义函数时就已经固定住了,不会随着调用位置的改变而改变

    复制代码
     1 例一:
     2 name='alex'
     3 
     4 def foo():
     5     name='lhf'
     6     def bar():
     7         print(name)
     8     return bar
     9 
    10 func=foo()
    11 func()
    12 
    13 
    14 例二:
    15 name='alex'
    16 
    17 def foo():
    18     name='lhf'
    19     def bar():
    20         name='wupeiqi'
    21         def tt():
    22             print(name)
    23         return tt
    24     return bar
    25 
    26 func=foo()
    27 func()()
    复制代码

    八 递归调用

    古之欲明明德于天下者,先治其国;欲治其国者,先齐其家;欲齐其家者,先修其身;欲修其身者,先正其心;欲正其心者,先诚其意;欲诚其意者,先致其知,致知在格物。物格而后知至,知至而后意诚,意诚而后心正,心正而后身修,身修而后家齐,家齐而后国治,国治而后天下平。

    在函数内部,可以调用其他函数。如果在调用一个函数的过程中直接或间接调用自身本身

    复制代码
     1 def calc(n):
     2     print(n)
     3     if int(n/2) ==0:
     4         return n
     5     return calc(int(n/2))
     6  
     7 calc(10)
     8  
     9 输出:
    10 10
    11 5
    12 2
    复制代码
    #_*_coding:utf-8_*_
    __author__ = 'Linhaifeng'
    import time
    
    person_list=['alex','wupeiqi','yuanhao','linhaifeng']
    def ask_way(person_list):
        print('-'*60)
        if len(person_list) == 0:
            return '没人知道'
        person=person_list.pop(0)
        if person == 'linhaifeng':
            return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' %person
        print('hi 美男[%s],敢问路在何方' %person)
        print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' %(person,person_list))
        time.sleep(3)
        res=ask_way(person_list)
        # print('%s问的结果是: %res' %(person,res))
        return res
    
    
    
    res=ask_way(person_list)
    
    print(res)
    复制代码

    递归特性:

    1. 必须有一个明确的结束条件

    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html 

    尾递归优化:http://egon09.blog.51cto.com/9161406/1842475

    十 函数式编程

    峰哥原创面向过程解释:

    函数的参数传入,是函数吃进去的食物,而函数return的返回值,是函数拉出来的结果,面向过程的思路就是,把程序的执行当做一串首尾相连的函数,一个函数吃,拉出的东西给另外一个函数吃,另外一个函数吃了再继续拉给下一个函数吃。。。


    例如:
    用户登录流程:前端接收处理用户请求-》将用户信息传给逻辑层,逻辑词处理用户信息-》将用户信息写入数据库
    验证用户登录流程:数据库查询/处理用户信息-》交给逻辑层,逻辑层处理用户信息-》用户信息交给前端,前端显示用户信息

    函数式编程: 

    http://egon09.blog.51cto.com/9161406/1842475

    11 高阶函数

    满足俩个特性任意一个即为高阶函数

    1.函数的传入参数是一个函数名

    2.函数的返回值是一个函数名

     
  • 相关阅读:
    cf536c——思路题
    cf536b——优先队列的运用
    王道论坛和九度论坛
    Ubuntu 12.04 LTS 下配置 apache支持SPDY, 使用wireshark 抓包分析SPDY 协议
    vnc/route/ifconfig 配置
    MIME protocol 说明
    理解邮件传输协议(SMTP、POP3、IMAP、MIME)
    GNU C中的零长度数组
    ftp protocol
    HTTP协议头部与Keep-Alive模式详解
  • 原文地址:https://www.cnblogs.com/superfangchao/p/8520932.html
Copyright © 2011-2022 走看看