Python基础:函数

目录

1.函数的创建与调用

1.1函数的创建

1.2函数参数

1.3函数定义的形参

1.3.1个数可变的位置形参

1.3.2个数可变的关键字形参

1.3.3默认值形参

1.4函数调用的实参

1.4.1位置实参

1.4.2关键字实参

1.5函数的返回值

2.变量的作用域

3.递归函数


 函数:就是执行特定任务以实现特定功能的一段代码

为什么需要函数?

  • 复用代码
  • 隐藏实现细节
  • 提高可维护性
  • 提高可持续性便于调试

1.函数的创建与调用

1.1函数的创建

语法格式:

def  函数名([输入参数]):

​        函数体

​        [return xxx]

示例:

def calc(a,b):
    c=a+b
    return c
result = calc(11,22)
print(result)

运行结果:

 

1.2函数参数

函数参数分为形参和实参

形参:在定义函数阶段定义的参数被称之为形式参数,简称形参,相当于变量名。

  • 形参在定义阶段

实参:在调用函数阶段传入的值称之为实际参数,简称实参,相当于变量值。

  • 实参在调用阶段

形参和实参的关系

  • 形参和实参的关系实现只有在绑定函数关系的情况下才会有效,当函数调用结束后则解除关系。
  • 形参和实参是一一对应关系

1.3函数定义的形参

1.3.1个数可变的位置形参

个数可变的位置形参

  • 定义函数时,无法事先确定传递的位置实参的个数时,使用可变的位置参数
  • 使用*定义个数可变的位置形参
  • 结果为一个元组

语法结构:

def 函数名(*形参):

示例:

def fun(*a):
    print(a)


fun(10)
fun(10, 20)
fun(10, 20, 30)

运行结果:

1.3.2个数可变的关键字形参

个数可变的关键字形参

  • 定义函数时,无法事先确定传递的位置实参的个数时,使用可变的关键字参数
  • 使用**定义个数可变的关键字形参
  • 结果为一个字典

语法结构:

def 函数名(**形参):

示例:

def fun(**b):
    print(b)


fun(a=10)
fun(a=10, c=20, d=30)

运行结果:

 

总结当一个函数中,存在两个可变的位置形参或者是两个位置可变的关键字形参时,会出现报错,所以只能有一个个数可变的位置形参或个数可变的关键字形参。当一个函数中既出现位置形参又出现关键字形参,那么其顺序是个数可变的位置形参在前,个数可变的关键字形参在后。

1.3.3默认值形参

函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参

示例:

def fun(a, b=10):
    print(a, b)


fun(100)  # 此时的b采用默认值的形式,默认b为10
fun(20, 30)  # 此时的形参和实参不相等,无法采用默认值的形式,此时采用的是实参,所以b为30

运行结果:

 

1.4函数调用的实参

1.4.1位置实参

根据形参对应的位置进行实参传递

通过*将序列中的每个元素都转换为位置实参

示例:

def fun(a, b, c):  # 位置传参
    print('a=', a)
    print('b=', b)
    print('c=', c)

# 函数调用


fun(10, 20, 30)  # 函数调用时的参数传递,被称为位置传参
lst = [10, 20, 30]
'''fun(lst)  会出现报错,参数的变量有三个,这样输就只能有有一个,所以会报错,此时需要去添加个数可变的位置传参'''
fun(*lst)

运行结果:

1.4.2关键字实参

根据形参名进行实参传递

通过**将字典中的每个键值对都转换为关键字实参

示例:

def fun(a, b, c):
    print('a=', a)
    print('b=', b)
    print('c=', c)


fun(a=1, b=2, c=3)  # 函数调用,关键字参数
d = {'a': 11, 'b': 22, 'c': 33}
# fun(d) 直接输入会出现报错的情况,原因和位置参数是一样的
fun(*d)   # 不报错,但是只传键而没有传值
fun(**d)  # 此时将字典中的每个键值对都转换为关键字实参,用以实现关键字参数的调用

运行结果:

 

1.5函数的返回值

函数的返回值

  • 如果函数没有返回值(函数执行完毕之后,不需要给调用处提供数据)return可以省略不写
  • 函数的返回值,如果是一个,直接返回原类型
  • 函数的返回值,如果是多个,返回的结果为元组

是否需要return需要根据实际情况决定

示例:

def fun1():
    print('word')


fun1()


def fun2():
    return 'word'


res = fun2()
print(res)


def fun3():
    return 'hello', 'word'


print(fun3())

运行结果:

 

2.变量的作用域

变量的作用域:程序代码所能够访问该变量的区域。

变量分为局部变量和全局变量

  • 局部变量:在函数内定义并且使用的变量,只在函数内部有效。局部变量使用global声明,这样就会使得其变为全局变量。
  • 全局变量:函数体外定义的变量,可作用于函数内外

示例:

# 局部变量
def fun(a, b):
    c = a + b  # c为局部变量,在函数内部被定义的变量被称为局部变量,作用域也为局部。其中的a,b作用的范围也为内部,故为局部变量
    print(c)


# fun(c)
# fun(a)  其中的a和c已经超出了作用的范围


# 全局变量
name = '小明'  # name的作用范围是内部和外部均可以使用,所以为全局变量
print(name)
def fun1():
    print(name)


fun1()


def fun2():
    global age  # 函数内部所定义的变量,此变量使用global进行了声明。
    age = 20
    print(age)


fun2()

运行结果:

 

3.递归函数

递归函数:在一个函数体内调用该函数本身,这个函数被称为递归函数

  • 递归函数是由递归调用与递归终止条件组成

递归函数调用的过程:

  • 每递归调用一次函数,都会在栈内分配一个栈帧,
  • 没执行完一次函数,都会释放相应的空间

递归的优缺点:

  • 优点:思路和代码简单
  • 缺点:占用内存多,效率低下

案例1:利用递归函数计算阶乘

def fac(n):
    if n == 1:
        return 1
    else:
        return n*fac(n-1)


print(fac(6))

运行结果:

 

案例2:斐波那契数列的实现

def fac(n):  # fac为变量名,自行定义即可
    if n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return fac(n-1)+fac(n-2)


print(fac(8))

运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值