superfang
及时当勉励,岁月不待人

五 局部变量和全局变量

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
复制代码
 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.函数的返回值是一个函数名

 

 

 

 

 

 

 

 

 
posted on 2018-03-07 10:33  卡子方  阅读(167)  评论(0编辑  收藏  举报

levels of contents