七、python函数的定义和使用

版权声明: https://blog.csdn.net/sandalphon4869/article/details/88560046

一、函数的定义

(1)一段具有特定功能的、可重用的语句组

(2)一种功能的抽象,一般函数表达特定功能

(3)两个作用:降低编程难度和代码复用

 

二、自定义函数:

def <函数名>(<参数(0个或多个)>):
    <函数体>
    return <返回值>
#例1:n的阶乘
def fact(n):
    s=1
    for i in range(1,n+1):
        s*=i
    return s

三、函数的参数传递

1.函数可以没有参数,但必须保留括号:

def <函数名>():
    ...

2.必选参数与可选参数:

(1)可选的意思是不指定的话就采用默认值

(2)必选参数放在可选参数前面。

(3)def <函数名>(<必选参数>,<可选参数>):

#例:n!//m
def fact(n,m=1):
    s=1
    for i in range(1,n+1):
        s*=i
    return s//m
print(fact(4))
#24
print(fact(4,5))
#4

(4)调用方法:

def fact(n,m=1):
    s=1
    for i in range(1,n+1):
        s*=i
    return s//m
#位置调用
print(fact(10,5))           #725760
#名称调用
print(fact(m=5,n=10))       #725760

3.可变数量参数:

(1)可变数量参数的意思是不给的话就没有这个参数

(2)def  <函数名>(<参数>,*b):

b是随便起的名字

#例:n!再乘别的数
def fact(n,*b):
    s=1
    for i in range(1,n+1):
        s*=i
    for item in b:
        s*=item
    return s
print(fact(2,3))
#6
print(fact(2,3,4))
#24

 

四、函数的返回值

(1)可以有返回值,也可以没有

直接不写return ...或者返回空值return

(2)可以有一个返回值,也可以有多个返回值

def fact(n,m=1):
    s=1
    for i in range(1,n+1):
        s*=i
    return s//m,n,m

print(fact(10,5))
#(725760,10,5),这种类型是元组类型

#将值分别赋给a,b,c
a,b,c=fact(10,5)
print(a,b,c)
#725760 10 5

五、局部变量与全局变量

1.局部变量和全局变量是不同的变量:

-局部变量是函数内部的占位符,与全局变量可能重名但不同

-函数运算结束后,局部变量被释放。

-可以使用global保留字在函数内部使用全局变量

-是函数内外,不是循环体内外

#例1:
n,s=10,100			    #n和s是全局变量
def fact(n):
    s=1				    #fact()函数中的n和s是局部变量
    for i in range(1,n+1):
        s*=i
    return s
print(fact(n),s)		    #n和s是全局变量,s还是100
#运行结果是3628800 100
#例2:
n,s=10,100			    #n和s是全局变量
def fact(n):
    global s			    #声明此处s是全局变量s
    s=1
    for i in range(1,n+1):
        s*=i
    return s					
print(fact(n),s)		    #此处全局变量s被函数修改
#运行结果是3628800 3628800

2.局部变量为组合数据类型且未创建,等同于全局变量

ls =["F","f"]		#通过使用[]真实创建了一个全局变量列表ls
def func(a):
    ls.append(a)	#此处ls是列表类型,未真实创建则等同于全局变量,调用的就是外部的ls
func("C")		#全局变量ls被修改
print(ls)
#运行结果是['F', 'f', 'C']
ls =["F","f"]
def func(a):
    ls=[]			#此处ls是列表类型,真实创建了,则ls是局部变量
    ls.append(a)
func("C")			#局部变量ls被修改,但不管全局变量的事
print(ls)
#运行结果是['F', 'f']

3.总结

基本数据类型,无论是否重名,局部变量与全局变量都不同

组合数据类型,如果局部变量未真实创建,则是全局变量;如果真实创建,则不是

 

六、lambda函数

lambda函数介绍;

(1)lamda函数是一种匿名函数,即没有名字的函数

(2)使用lamda函数保留字定义,函数名是返回结果

(3)lamda函数用于定义简单的、能够在一行内表示的函数

(4)<函数名>=lamda <参数> : <表达式>

f=lambda x,y : x+y
print(f(10,15))
#25
f=lambda : "lambda函数"
print(f())
#lambda函数

七、函数递归的理解

1.递归的定义:

(1)特征:

-链条:计算过程存在递归链条

-基例:存在一个或多个不需要再次递归的基例

(2)类似数学归纳法

-数学归纳法:证明当n取第一个值n(0)时命题成立。假设当n(k)时命题成立,证明当n=n(k+1)时命题也成立

-递归是数学归纳法思维的编程体现

 

2.函数递归的调用过程

递归的实现:

(1)函数+分支:

-递归本身是一个函数,需要函数定义方式描述

-函数内部,采用分支语句对输入参数进行判断

-基例和链条,分别编写对应代码

(2)过程:

-每执行一次递归,便分配一段新内存给不同的递归

-调用的是自身代码的多个副本

#n的递归:
def fact(n):
    if n==0:
        return 1    #注意这个n的意思:这个n是上一次函数传入的参数n-1
    else:
        return n*fact(n-1)
print(fact(4))
#24

3.函数递归实例解析

#例1:字符串反转:
#-切片:s[::-1]更简单
#-递归;
def rvs(s):
    if s=="":
        return s
    else:
        return rvs(s[1:])+s[0]
print(rvs("python"))
#nohtyp
#例2:斐波那契数列1,1,2,3,5,8,13,...
def f(n):
    if n==1 or n==2:
        return 1
    else:
        return f(n-1)+f(n-2)
for i in range(1,8):
    print(f(i))
#例3:汉诺塔:把n圆盘从原柱搬到目标柱,就要把n-1圆盘搬到目标柱
count=0
def hanoi(n,src,dst,mid):           #n圆盘的数量,src原柱,dst目标柱,mid中间柱
    global count
    if n==1:
        print("{}:{}->{}".format(1,src,dst))
        count+=1
    else:
        hanoi(n-1,src,mid,dst)
        print("{}:{}->{}".format(n,src,dst))
        count+=1
        hanoi(n-1,mid,dst,src)
hanoi(3,"A","C","B")
print("次数:",count)

猜你喜欢

转载自blog.csdn.net/sandalphon4869/article/details/88560046