python--004--函数(基础、递归)

1. 函数和过程

  过程:就是没有返回值的函数
  在python中函数和过程是一样的,没有区别,如果没有返回值,python会自动赋值为None

2. 总结:

返回值=0:返回None(即没有写返回值时,python自动赋值为None)
返回值=1:返回object(即返回一个值时,其类型为object)
返回值>1:返回tuple(即有多个返回值时,其类型为tuple)

 

3. 形参和实参 

形参:形参只有在被调用时才能分配内存单元,调用结束后,即刻释放所分配的内存单元
实参:可以是常量、变量、表达式、函数等

混搭传值:位置参数必须要在关键字参数左边,且不能重复赋值

def test(x,y,z):
    print(x,y,z)

v=test(1,2,z=3)

默认参数
参数组:(非固定长度的参数)**字典 *列表

def test(x, *args):
    print(x)
    print(args)

v = test(1, 2, 3, 4, 5, 6)

 

print的args=(2,3,4,5,6)当作元组来处理,但是传入的时候args将多传入的值当作列表处理

def test(x, **kwargs):
    print(x)
    print(kwargs)

v = test(1, y=2, z=3)

# print结果kwargs,为字典

output:

  1
  {'y': 2, 'z': 3}

 

4. 全局变量与局部变量
    函数中可以使用global来表示以下使用和改变的是全局变量

NAME="ALEC"

def TEST():
    global NAME
    NAME='sky'
print("change name",NAME)


output:
    change name ALEC

如果函数的内容中无global关键字,优先读取局部变量,能读取全局变量,无法对全局变量进行赋值,NAME=“fff”
但是对于可变类型,可以对内部元素进行操作如append等
如果函数中有global关键字,便来那个本质上就是全局的那个变量,可读取可赋值

 

执行顺序:(需要补一个)

全局变量练习:
name="佩奇"
def weihou():
    name="乔治"
def weiweihou():
    global name
    # nonlocal name   #nonlocal代指上一级的name
    name = "苏茜"

weihou()
print(name)
weiweihou()
print(name)

output:
    佩奇
    苏茜

5. 风湿理论之函数即变量

   在执行过程中,函数即变量

def test():
    pass
    name="wendy"

 意思是,创建函数和创建变量name一样,在内存中都是相当于门牌号是test、name,然后房间内是函数体、字符串wendy

 

 6. 递归

def calc(n):
    print(n)
    if int(n/2)==0:
        return n
    return calc(int(n/2))
calc(10)

递归:如上即为递归,自己调用自己


递归的特点:

  1)必须要有一个明确的结束条件;
  2)每次进入更深一层递归时,问题规模相比上次递归都应有所减少;
  3)递归效率不高,递归层次过多会导致栈溢出(在计算机中,函调用是通过栈(stack)这种数据结构实现的;每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)

7. 函数的作用域

 

def test():
    pass
print(test)   # test 代表函数名称,代表内存中的门牌号,即函数体的内存地址
test()       # 加上()代表执行该函数  

output:<function test at 0x000000000205C268>

 

def test1():
    print('in the test1')
def test():
    print('in the test')
    return test1

print(test)    # 打印test函数的地址
res = test()   # 运行test返回test1函数的地址
print(res())   # 运行test1,返回print:in the test1

 

name = 'peiqi'
def foo():
    name = "qiaozhi"
    def bar():
        print(name)
    return bar

a = foo()        # 运行foo,返回bar这个函数的地址
print(a)         # 相当于打印bar这个函数的地址
a()              # 相当于运行bar这个函数,print name,但是这里虽然在全局作用域中调用,但是print的name是“qiaozhi”
                 # 因为这个函数在foo内部,所以要运行bar,肯定得先运行foo,所以离它最近的name应该是qiaozhi,而不是peiqi

 


 

 

posted @ 2019-03-17 21:54  会长大的  阅读(199)  评论(0编辑  收藏  举报