python基础(10):函数(附有代码)

✅作者简介:大家好我是Xlong,一枚正在学习COMSOL、Python的工科研究僧
📃个人主页: Xlong的个人博客主页
🔥系列专栏:Python学习
💖如果觉得博主的文章还不错的话,请👍支持一下博主哦🤞

本篇简介

         在上一章《python基础(9):字符串(附有代码)》中我们详细介绍了关于字符串的种种。这一篇文章我们主要来学习python中的函数

目录

本篇简介

一、函数的创建和调用

1.1 什么是函数

1.2 为什么需要函数

1.3 函数的创建

1.4 函数的调用

二、函数的参数传递

2.1 函数调用的参数传递(实际参数和形式参数的名称可以不相同)

三、函数的返回值

四、函数的参数定义

4.1 函数定义默认值参数

4.2 个数可变的位置参数

 4.3 个数可变的关键字形参 

4.4函数的参数总结

五、函数的作用域

5.1 变量的作用域

  六、递归函数

6.1 什么是递归函数

6.2 递归的组成部分

6.3 递归的调用过程

6.4 递归的优缺点

 6.5 斐波那契数列代码


一、函数的创建和调用

1.1 什么是函数

        函数就是执行特定任务和以完成特定功能的一段代码。

1.2 为什么需要函数

  • 复用代码

  • 隐藏实现细节

  • 提高可维护性

  • 提高可读性便于调试

1.3 函数的创建

                def 函数名([输入参数]): def calc(a,b):

                      函数体                                    c = a+b

                      [return xxx]                             return c

1.4 函数的调用

result = calc(10,20)

print(result)

def calc(a,b): #a,b称为形式参数,简称形参,位置是在函数定义处
    c = a+b
    return c

result = calc(10,20)  #10,20称为实际参数的值,简称实参,实参位置是函数的调用处
print(result) #运算结果:30

二、函数的参数传递

2.1 函数调用的参数传递(实际参数和形式参数的名称可以不相同)

(1)位置实参:根据形参对应的位置进行实参传递

(2)关键字实参:根据形参名称进行实参传递

def calc(a,b):
    c = a+b
    return c

res = calc(b = 10,a = 20)   #等号左侧变量的名称称为关键字参数
print(res)  #运算结果:30
def fun(arg1,arg2):
    print('arg1',arg1)   
    print('arg2',arg2)
    arg1 = 100
    arg2.append(10)
    print('arg1',arg1)
    print('arg2',arg2)
    #return #可以不用写return
n1 = 11
n2 = [11,22,33]
print('n1',n1)
print('n2',n2)
fun(n1,n2) #位置传参 arg1,arg2是函数定义处的形参,n1,n2是函数调用处的实参,总结,实参名称与形参名称可以不一致
print('n1',n1)
print('n2',n2)

 运算结果:

n1 11
n2 [11, 22, 33]
arg1 11
arg2 [11, 22, 33]
arg1 100
arg2 [11, 22, 33, 10]
n1 11
n2 [11, 22, 33, 10]

三、函数的返回值

1.函数返回多个值时,结果为元组

def fun(num):
    odd = []  #存奇数
    even = [] #存偶数
    for i in num:
        if i%2:
            odd.append(i)
        else:
            even.append(i)
    return odd,even
#函数的调用
lst = [10,29,34,23,44,53,55]
print(fun(lst))                   #运行结果:([29, 23, 53, 55], [10, 34, 44])
'''函数的返回值
(1)如果函数没有返回值【函数执行完毕之后,不需要给调用处提供数据】return可省略
(2)函数的返回值,如果是1个,直接返回类型
(3)函数的返回值,如果是多个,返回的结果为元组
'''
def fun1():
    print('hello')				   #运行结果:hello
fun1()

def fun2():
    return 'hello'
res = fun2()

def fun3():
    return'hello','world'
print(fun3()) 						#运行结果:('hello', 'world')
'''函数在定义时,是否需要返回值,视情况而定'''

四、函数的参数定义

4.1 函数定义默认值参数

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

def fun(a,b=10):  #b称为默认值
    print(a,b)

#函数的调用
fun(100)       #运行结果:100 10
fun(20,30)	   #运行结果:20 30

4.2 个数可变的位置参数

(1)定义函数时,可能无法事先确定传递的位置实参的个数时,使用可变的位置参数

(2)使用*定义个数可变的位置形参

(3)结果为一个元组

def fun(*args): #函数定义时的可变的位置参数
    print(args)
    #print(args[0])

fun(10)    #运行结果:(10,)
fun(10,30) #运行结果:(10, 30)
fun(30,405,50) #运行结果:(30, 405, 50)

 4.3 个数可变的关键字形参 

(1)定义函数时,无法事先确定传递的关键字实参的个数时,使用可变的关键字形参

(2)使用**定义个数可变的关键字形参

(3)结果为一个字典

def fun1(**args):
    print(args)

fun1(a=10)
fun1(a=20,b=30,c=40)
print()

'''def fun2(*args,*a):
    pass
    以上代码,程序会报错,个数可变的位置参数,只能是1个
    def fun2(**args,**args):
    pass
    以上代码,程序会报错,个数可变的关键字参数,只能是1个
    '''
def fun2(*args1,**args2):
    pass
'''def fun3(**args1,*args2):
    pass
    在一个函数的定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求,个数可变的位置形参,放在个数可变的关键字形参之前
    '''

4.4函数的参数总结

def fun(a,b,c): #a,b,c在函数的定义处,所以是形式参数
    print('a=',a)
    print('b=',b)
    print('c=',c)

#函数的调用
fun(10,20,30) #函数调用时的参数传递,称为位置传参
lst = [11,22,33]
fun(*lst) #函数调用时,将列表中的每个元素都转换为位置实参传入
print('-----------')
fun(a=100,c=300,b=200) #函数的调用,所以是关键字实参
dic = {'a':111,'b':222,'c':333}
fun(**dic) #函数调用时,将字典中的键值对都转换为关键字实参传入
def fun(a,b=10): #b是在函数的定义处,所以b是形参,而且进行了赋值,所以b称为默认值形参
    print('a=',a)
    print('b=',b)

def fun2(*args):
    print(args)

def fun3(**args2): #个数可变的关键字形参
    print(args2)

fun2(10,20,30,40)
fun3(a=11,b=12,c=13,d=44,e=55)

def fun4(a,b,*,c,d): #从*之后的参数,在函数调用时只能采用关键字参数传递
    print('a=',a)
    print('b=',b)
    print('c=',c)
    print('d=',d)

#调用fun4函数
# fun4(10,20,30,40) #位置实参传递
fun4(a=10,b=20,c=30,d=40)#关键字实参传递
fun4(10,20,c=30,d=40) #前两个参数,采用的是位置实参传递,而c,d采用的是关键字实参传递
'''需求,c,d只能采用关键字实参传递'''


'''函数定义时的形参的顺序问题'''
def fun5(a,b,*,c,d,**args):
    pass
def fun6(*args,**args2):
    pass
def fun7(a,b=10,*args,**args2):
    pass

五、函数的作用域

5.1 变量的作用域

(1)程序代码能访问该变量的区域

(2)根据变量的有效范围可分为:

  • 局部变量:在函数内定义并使用的变量,只在函数内部有效,局部变量使用global声明,这个变量就会成全局变量

  • 全局变量:函数体外定义的变量,可作用于函数内外

def fun(a,b):
    c = a+b #c为局部变量,因为c是在函数体内进行定义的变量,a,b为函数的形参,作用范围也是函数内部,相当于局部变量
    print(c)

#print(c) 因为a,c超出了起作用的范围(超出了作用域)
#print(a)
name = '杨老师' #name的作用范围为函数内部和外部都可以使用-->称为全局变量
print(name)
def fun2():
    print(name)
#调用函数
fun2()

def fun3():
    global age #函数内部定义的变量,局部变量使用global声明,这个变量实际上就变成了全局变量
    age = 20
    print(age)
fun3()
print(age)

  六、递归函数

6.1 什么是递归函数

        如果一个函数的函数体内调用了该函数本身,此函数即递归函数。

6.2 递归的组成部分

        递归调用与递归终止条件

6.3 递归的调用过程

        (1)每递归调用一次函数,都会在栈内存分配一个栈帧

        (2)每执行完一次函数,都会释放相应的空间

6.4 递归的优缺点

        (1)缺点:占用内存多,效率低

        (2)优点:思路和代码简单

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

print(fac(6))

 6.5 斐波那契数列代码

def fib(n):
    if n==1:
        return 1
    elif n==2:
        return 1
    else:
        return fib(n-1)+fib(n-2)

#斐波那契数列第6位上的数字
print(fib(6))
#输出这个数列的前6位上的数字
for i in range(1,7):
    print(fib(i))

运行结果:

8
1
1
2
3
5
8

持续更新中......

原创不易,各位看官烦请随手点个赞和关注哦,感谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xlong~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值