函数的返回值
函数可以返回0个或多个结果
return保留字用来传递返回值(不是确定必须要有的保留字,后面可以加0,也可以不使用return)
函数可以有返回值,也可以没有,可以有return,也可以没有。
return可以传递0个返回值,也可以传递任意多个返回值。
示例代码如下:
def fact(n,m=1):
s=1
for i in range(1,n+1):
s*=i
return n//m,n,m,s
print(fact(10,5))
运行界面如图:
当输出多个返回值的时候,值以元组的形式进行输出,以逗号进行分割。
当然我们也可以使用几个变量,将他们之间用逗号进行分割,并且获得返回值,这样子达到的输出效果,这些输出值都进行分割了。
示例代码如下:
def fact(n,m=1):
s=1
for i in range(1,n+1):
s*=i
return n//m,n,m,s
a,b,c,d=fact(10,5)
print(a,b,c,d)
运行界面如下:
与此同时,介绍两个return返回值的多个相关示例如下:
示例一:取代旧字符
代码示例如下:
def old(word):
if "山寨" in word:
words=word.replace('山寨','**')
return words
print(old("这是山寨版的"))
运行界面如下:
示例二:获取游戏新位置
示例代码如下:
def old(x,y,step):
nx=x+step
ny=y+step
return nx,ny
print(old(100,100,60))
运行界面如下:
局部变量和全局变量:
有一段程序中间有一个函数定义,其中使用的变量叫全局变量,而在函数定义的函数体中使用的变量叫局部变量。
区别在于局部是函数内部使用的变量,而函数外部整个程序使用的变量叫全局变量。
函数外部无法访问局部变量,同时,不同函数内部可以包含同名的局部变量,这些局部变量的关系类似于不同目录下同名文件的关系,它们互相独立,互不影响。
(1)代码示例如下:
def test_one():
number=10
print(number)
test_one()
print(number)
运行界面如下:
故函数外部无法访问局部变量。
(2)代码示例如下:
def test_one():
number=10
print(number)
def test_two():
number=20
print(number)
test_one()
test_two()
运行界面如下:
故不同函数内部可以包含同名的局部变量
全局变量可以在程序的任意位置被访问。同时全局变量在函数内部只能被访问,而无法直接修改。
(3)代码示例如下:
number=10
def test_one():
print(number)
number+=1 #此为局部变量,但是局部变量并没有声明number,故有错误。
test_one()
print(number)
运行界面如下:
<语句块1>
def <函数名>(<参数>):
<函数体>
return <返回值>
<语句块2>
即如上所示,整个程序而言使用的即为全局变量,在函数内部出现的变量即为局部变量。
示例代码如下:
n,s=10,100 #n,s为全局变量
def fact(n): #fact()函数中的n和s为局部变量
s=1 #fact函数中的s=1为局部变量,与s=100的全局变量不同。
for i in range(1,n+1):
s*=i
return s # 此时返回的s为局部变量,即所求的阶乘。s=362800
print(fact(n),s) #此时的n,s为全局变量,用当前的全局变量n来调用函数,同时打印出当前全局变量s的值
运行界面如图所示:
局部变量和全局变量有两个规则。
规则1:局部变量和全局变量是不同变量
局部变量是函数内部的占位符,与全局变量可能重名但不同。
函数运算结束后,局部变量被释放(这个变量将不再存在,只是用于函数内部运算的)
可以使用global保留字在函数内部使用全局变量
global保留字用来在函数内部中 声明这个变量,它是全局变量而不是局部变量。
代码示例如下:
n,s=10,100 #n,s为全局变量
def fact(n):
global s #fact()中使用global保留字,表示此时的s为全局变量,即为100,且在函数体内的s都为全局变量
for i in range(1,n+1):
s*=i
return s # 此时返回的s为全局变量,即所求的阶乘。
print(fact(n),s) #此时的n,s为全局变量,用当前的全局变量n来调用函数,同时打印出当前全局变量s的值,而当前的全局变量被函数修改。
运行界面如下:
规则2:局部变量为组合数据类型的时候,且未在函数内部创建,等同于全局变量。
在外部创建代码示例如下:
ls=['F','f'] #通过使用[]真实创建了一个全局变量列表ls
def func(a):
ls.append(a) #此处ls是列表类型,未真实创建,则等同于全局变量
return
func("C") #调用这段函数,全局变量ls被修改。
print(ls)
运行界面如下:
同时在内部进行创建,代码示例如下:
ls=['F','f'] #通过使用[]真实创建了一个全局变量列表ls
def func(a):
ls=[ ] #此处ls是列表类型,真实创建,则ls是局部变量
ls.append(a) #有真实创建的局部变量,所以此处ls为局部变量
return
func("C") #调用这段函数,局部变量ls被修改。
print(ls)
运行界面如下:
通过以上可知,当组合数据类型没有在函数体内真实创建时为全局变量,真实创建后为局部变量。
在以上代码编写过程中,我们发现一个函数为append。
append()函数,用于在列表末尾添加新的对象
语法格式如下:
list.append(o)
参数
list:列表对象
o:添加到列表末尾的对象
append()函数无返回值,但是会修改原本的列表。
示例代码如下:‘
ls=['r','g','f',]
def func(a):
ls.append(a)
func('y')
print(ls)
运行界面如下:
组合数据类型在python中是通过指针来体现的
如果函数中如果没有真实创建组合数据类型,它使用的变量是使用的指针(指的是外部的全局变量)修改指针对应的内容就修改了全局变量。
总结如下:
基本数据类型无论是否重名,局部变量与全局变量不同。
可以通过global保留字在函数内部声明全局变量
组合数据类型(列表与字典)如果局部变量未真实创建,则是全局变量。
程序中搜索变量时所遵循的原则为依次按照先搜索局部作用域(局部变量的形参生效的区域)、嵌套作用域(嵌套定义中的外层函数声明的变量生效的区域)、全局作用域(全局变量生效的区域)、内置作用域(内置模块声明的变量生效的区域)