Python学习笔记(三)之函数

申明:资料来源于网络及书本,通过理解、实践、整理成学习笔记。

文章目录

  • 函数定义
  • 函数参数
  • 变量作用域
  • lambda表达式
  • 递归函数

函数定义

定义一个函数只要以"def"开头即可,Python内置了很多有用的函数,我们可以直接调用。

def function_name(arg1):
    function body
    return value
  1. 函数名(function_name):函数名以字母或下划线开头,并且区分大小写
  2. 函数参数(arg1):调用一个函数时可以传递的参数,参数可以没有,也可以有一个或多个
  3. 函数内容(function body):在函数的内部,与"def"相比需要缩进4个空格
  4. 函数返回值(return value):函数执行完成后返回的值,也可以不返回内容,默认为none

函数参数

  1. 必须参数:如果函数内容中使用了此函数参数,此参数就是必须参数,调用函数时缺少的话就会报错
    #定义函数
    def fun1(a):
        print(a)
    #调用函数
    fun1(1)
    执行结果:
    1
    
    #定义函数
    def fun1(a):
        print(a)
    #调用函数
    fun1()
    执行结果:
    发生异常:TypeError fun1() missing 1 required positional argument: 'a'
    
  2. 关键字参数:使用关键字参数可以不按参数的顺序来调用函数
    def fun1(a,b):
        print(a,b)
    fun1("深圳","广州")
    fun1(b="广州",a="深圳")
    执行结果:
    深圳 广州
    深圳 广州
    
  3. 默认参数:在定义函数时给参数添加默认值,如果调用函数时没有传入参数,函数就会使用默认值。注意:默认参数一定要定义在必须参数的后面
    def fun1(a,b = 1):
        print(a,b)
    fun1("深圳")
    fun1("深圳","广州")
    执行结果:
    深圳 1
    深圳 广州
    
  4. 可变参数:如果我们不能在定义函数的时候确定参数的数量和内容,就可以使用可变参数。如下:用 * 分隔开,args表示一个元组,用 ** 分隔开,kwargs表示一个字典
    def fun1(*args,**kwargs):
        print(args)
        print(kwargs)
    i = (1,2,3)
    j = {
           "sz": "深圳", "gz": "广州"}
    fun1(*i,**j)
    执行结果:
    (1, 2, 3)
    {
           'sz': '深圳', 'gz': '广州'}
    
  5. 组合参数:顾名思义,就是将上面的必须参数、关键字参数、默认参数、可变参数组合到一起使用

变量作用域

变量的作用域相当于变量的命名空间,Python中变量赋值的位置决定了哪些范围的对象可以访问这个变量,这个范围被称为作用域。Python中有两种最基本的变量作用域:局部变量和全局变量。

  1. 局部变量:一般情况下,在函数内进行赋值的变量和不做特殊声明的变量都是局部变量

    #变量a在函数内赋值,属于局部变量
    def fun1():
        a = 1
        print(a)
    fun1()
    执行结果:
    1
    
    #变量b属于函数的参数,也属于局部变量
    def fun1(b):
        print(b)
    fun1(1)
    执行结果:
    1
    
  2. 全局变量:在函数外赋值的变量就属于全局变量,全局变量可以在整个程序范围内进行访问

    #变量a在函数外赋值,属于全局变量
    a = 1
    def fun1():
        print(a)
    fun1()
    

lambda表达式

lambda表达式也称为匿名函数,不再使用 def 语句这样标准的形式定义一个函数,就是匿名函数。

a = lambda x, y : x + y
print(a(1,2))
执行结果:
3
  1. ":“左边的"x”,"y"是函数的参数
  2. ":"右边的是要返回的值
  3. "a(1,2)"是调用此lambda函数
  4. 注意:lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数

递归函数

如果一个函数在内部调用自身本身,这个函数就是递归函数。例如连加、连乘及阶乘等

#阶乘
def fact1(n):
    if n == 1:
        return 1
    return n * fact1(n-1)
#fact1(5) = 5! = 5*4*3*2*1
print(fact1(5))
执行结果:
120

注意:使用递归函数需要注意防止栈溢出,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出,解决递归调用栈溢出的方法是通过尾递归优化

尾递归:在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况

def fact1(n):
    return fact2(n, 1)
def fact2(a, b):
    if a == 1:
        return b
    return fact2(a - 1, a * b)
print(fact1(5))
执行结果:
120
执行过程
fact1(5)
-》fact2(5, 1)
-》fact2(4, 5)
-》fact2(3, 20)
-》fact2(2, 60)
-》fact2(1, 120)
-120

一个坚持学习,坚持成长,坚持分享的人,即使再不聪明,也一定会成为优秀的人!

如果看完觉得有所收获的话,记得一键三连哦,谢谢大家!

你可能感兴趣的:(Python学习笔记,python,函数式编程,lambda,递归算法)