15 python学习 函数变量与递归函数

上节复习

def test(x,y,z,type='xx'):

'注释’

代码

return res

test(1,2,3)     # 位置参数要在关键字参数左边

test(z=1,x=2,y=3)       #关键字传递

  默认参数 type不传的话可以按照默认值xx来进行,如果有变可以传

def test(x,*args,**kwargs):               #*args 接收多个参数 形成元祖的形式  

                                                      #   **kwargs接收多个参数x=  ,y=   kwargs  形成字典的形式

'注释'

代码

return   res

五 局部变量和全局变量

http://www.cnblogs.com/linhaifeng/articles/6113086.html#_label1点击打开链接

在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。

全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。

当全局变量与局部变量同名时:

在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。

name='dafa'
def change_name():
    name='帅了一笔'
    print('我的名字',name)

change_name()
print(name)
输出是
我的名字 帅了一笔               #在此函数内的局部变量有定义先用局部变量的值,没有定义用全局变量的值
dafa                           # 在那个函数外调用的都是全局变量的值
def change_name():
    global name             #在局部定义域中声明全局变量,这时候修改可以对函数外的变量造成变化 ,但是如果其他函数内没写有global 的name还是局部变量
    name='帅了一笔'          #修改全局变量了
    print('我的名字',name)

change_name()
print(name)
# 我的名字 帅了一笔
# 帅了一笔
如果函数的内容无global关键字定义全局变量,优先读取局部变量,
并且能读取全局变量无法重新赋值给全局变量 name='dsaf'
但是,对于可变类型,可以对内部元素进行操作
例如可以在函数内 name.append('abc')  这样也会对全局变量的name造成改变

如果有global关键字,变量本质是全局变量, 可以读取和赋值    name='dsaf'一定要先定义全局变量再修改值,不能反过来,
建议 也可以全局变量写大写,局部变量变量名小写可以更清晰分清。
name='海风'
def huangwei():
    name = "黄伟"
    print(name)                #     2
    def liuyang():      #内部再定义一个函数,函数定义声明如果未调用则先编译,但不执行
        name = "刘洋"
        print(name)             #    4
        def nulige():
            name = '炉指花'
            print(name)         #            7
        print(name)            #     5
        nulige()                #    6
    liuyang()                   #    3
    print(name)                  #           8

print(name)               #  0
huangwei()               #   1
print(name)               #                  9

输出结果

海风
黄伟
刘洋
刘洋
炉指花
黄伟

海风

 
name ='000'     #  00
def yu1():
    name='001'     #    2                 这里是001的局部变量
    def yu2():            #     4
        global name      #      5          这里指向的是000的全局变量
        name='002'      #       6             将000的全局变量变成002
        # nolocal name           *** 如果关键字global  变成nolocal,则指的是上一层的变量001
        # name='002'             ****这里也会将001的那个局部变量变成002    而全局变量没有改
        #                         ***使得最后的输出变成000   002  000
    yu2()         #     3
    print(name)  #               7             这里输出的是001的局部变量的值,在这一层先找这一层的局部变量,如果找不到才能找那个把000变成002的全局变量

print(name)    # 0   这里输出000
yu1()          #  1
print(name)    #                         8       最后输出002
输出 第5步用global        
000             001            002
如果第5步是用关键字nolocal
000             002            00

内层函数可以拿外层函数的变量,但是外层想拿内层的值需要return返回值来获取

def foo():
    print('from foo')
    bar()

foo()             #报错,bar()在foo()后找不到

def bar():
    print('from bar')

递归调用       

自己调用自己

def calc(n):
    print(n)
    if int(n/2) ==0:            # 10/2 5/2 2/2
        return n
    return calc(int(n/2))
 
calc(10)
 
输出:
10
5
2

1

# debug步骤         全点红,右键debug   点小三角一步步运行
import time
person_list=['alex','wupeiqi','linhaifeng','zsc']
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(1)
    res=ask_way(person_list)         #第一次 alex还没有执行完,res还没有得到值,
                                #也没有执行后边的,就执行下一个ask_way()函数 这时alex的res还在等待值return

    print('%s问的结果是: %res' %(person,res))
    return res
res=ask_way(person_list)
print(res)

结果

------------------------------------------------------------

hi 美男[alex],敢问路在何方
alex回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['wupeiqi', 'linhaifeng', 'zsc']...
------------------------------------------------------------
hi 美男[wupeiqi],敢问路在何方
wupeiqi回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['linhaifeng', 'zsc']...
------------------------------------------------------------
wupeiqi问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es
alex问的结果是: 'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'es

linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是

res结果的取得是经过许多等待,并没有能够马上获得,只有下一个获得后再一个个return返回

递归特性:

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

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

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

猜你喜欢

转载自blog.csdn.net/yunyupianlan/article/details/80950736
今日推荐