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

来源:互联网 发布:记录恋爱的软件 编辑:程序博客网 时间:2024/06/08 12:38

大纲
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"]) #cocotest(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 oldchange_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)#10outer()def outer():    count=10#不是全局变量,嵌套    def inner():        nonlocal count        count=20        print(count)#20    inner()    print(count)#20    #global必须在全局作用域,不可以用在嵌套作用域,当嵌套作用域的值要修改必须加上nonlocalouter()#实例五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 retprint(foo(5))#方法二def foo1(n):    if n==1:        return 1    else:        return n*foo1(n-1)print(foo1(5))

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

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)
原创粉丝点击