python学习之路-基础篇-函数-day03

大纲
1.定义
2.使用函数的优势
3.return返回值详解
4.参数表详解
5.局部变量和全局变量
6.递归
7.高阶函数
一.函数的基本语法和特性
1.定义一个函数三要素
1)使用关键字def
2)参数表
3)返回值return
python中参数表和返回值不是必须要写的,是一个可选项
以下就是一个函数的简单模型:

def test(num):
    print("test")
    return 0

2.使用函数有哪些好处?
1)提高代码的可复用性
2)提高代码的可扩展性
3)可以根据自己的需求进行自定义函数,使代码模块化
3.return返回值详解:
1)不写return,默认隐式返回值是None
2)返回一个参数,比如return 0 返回值是0
3)返回参数个数大于1,返回的就是一个tuple,比如
return 1,“hello”,[1,2],返回值是(1,“hello”,[1,2])
为什么函数需要有返回值呢?为了返回函数的执行结果,方便后面程序的调用哦
return返回值的作用:(1)结束函数(2)返回某个对象
4.参数表详解:
1)关键参数和位置参数

def test(x,y):
    print(x)
    print(y)
test(1,2)  #传入的实际参数和形参一一对应--位置参数
test(y=1,x=2) #这种就是关键参数
test(y=1,2)   #SyntaxError: non-keyword arg after keyword arg这种写法就是错误的,y已经有了位置参数2了,所以就不可以在赋值关键参数y=1
# 总结关键参数不可以写在位置参数的前面
test(1,2,3)#TypeError: test() takes exactly 2 positional arguments (3 given)
test(1)#TypeError: test() takes exactly 2 positional arguments (1 given)
#总结:传入的实参个数要和形参个数一致
def test(x,y=1):#这里关键参数也不可以写在位置参数前面
    print(x)
    print(y)
test(1)
#默认参数,调用的时候默认参数不是必须传递

2)当实际参数的个数我们并不确定时,那么我们怎么去定义它的形参呢?
这里我们就要用到参数组的概念了,一次可以传入多个参数

def test(*args):
    print(args)
test(1,2,3,4)  #(1, 2, 3, 4)
test(*[1,2,3,4])#(1, 2, 3, 4)
def test(x,*args):
    print(x)   #1
    print(args)#(2, 3, 4)
test(1,2,3,4)
#得到的结果都是元祖形式

3)怎样传入字典呢?

def test(**kwargs):
    print(kwargs)
    print(kwargs["name"]) #coco
test(name="coco",age=8)#{'age': 8, 'name': 'coco'}
a=test(**{"name":"coco","age":8})#{'age': 8, 'name': 'coco'}

5.局部变量和全局变量,作用域问题
字符串,元祖是不可以修改的,列表,字段集合均可修改

#实例一
age=[12,25,36,44]#全局变量
def change_age():
    age[0]=11#修改全局变量
    print(age)#[11, 25, 36, 44]
change_age()
print(age)#[11, 25, 36, 44]
#实例二
name="coco"
def change_name():
    name="niko"
    print(name,"is 12 years old")#niko is 12 years old
change_name()
print(name,"is 12 years old")#coco is 12 years old
#实例三
x=6#全局变量
def f():
    print(x)
    x=5   #x=5是局部变量
f()
#UnboundLocalError: local variable 'x' referenced before assignment
#首先在局部寻找x,未声明就使用报错,改为
x=6#全局变量
def f():
    global x
    print(x)
    x=5   #x=5是局部变量
f()#结果  6
#实例四
def outer():
    count=10#不是全局变量
    def inner():
        count=20
        print(count)#20
    inner()
    print(count)#10
outer()
def outer():
    count=10#不是全局变量,嵌套
    def inner():
        nonlocal count
        count=20
        print(count)#20
    inner()
    print(count)#20
    #global必须在全局作用域,不可以用在嵌套作用域,当嵌套作用域的值要修改必须加上nonlocal
outer()
#实例五
age=0#全局变量
def change_age():
    #局部不声明也不修改可以正常使用
    print(age)
change_age()#0
#实例六
age=0#全局变量
def change_age():
    #***局部对全局变量要修改,必须声明global***
    global age
    age+=1
    print(age)
change_age()#1

6.递归
递归的概念:在一个函数的内部可以调用这个函数本身就是递归。
递归的缺点:效率不高,调用越多,容易栈溢出
那么递归的产生需要什么条件呢?
1)必须有明确的结束条件
2)每次进入更深一层,问题的规模要比上次的减少
递归函数实例1—阶乘

#方法一
def foo(n):
    ret=1
    for i in range(1,n+1):
        ret=ret*i
    return ret
print(foo(5))
#方法二
def foo1(n):
    if n==1:
        return 1
    else:
        return n*foo1(n-1)
print(foo1(5))

递归函数实例2—斐波那契

#方法一:
def fibo(n):
    before = 0
    after = 1
    for i in range(1,n-1):
        ret=before+after
        before=after
        after=ret
    return ret
print(fibo(5))

#方法二:
def fibo(n):
    if n==1:
        return 0
    elif n==2:
        return 1
    elif n==3:
        return 1
    else:
        return fibo(n-1)+fibo(n-2)
print(fibo(6))

7.高阶函数
概念:变量可以指向函数,函数本身也可以赋值给变量,那么一个函数可以接受另一个函数作为参数
也就是说(把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式)
举例:

def add(x, y, f):
    return f(x) + f(y)
print(add(5,-7,abs))#abs是取绝对值的意思,结果为12
#详解:x=5,y=-7,f=abs现在把x和y的值传给abs
#等价于abs(5)+abs(-7)

你可能感兴趣的:(python,python,函数,局部变量,全局变量,递归)