全局变量与局部变量
全局变量与局部变量两者的本质区别就是在于作用域,也就是按有效范围划分,变量分为全局变量和局部量:
▉▉全局变量:定义在函数外的变量,有效范围是整个python文件。
▉▉局部变量:定义在一个函数中的变量,有效范围限于该函数内部。
若有相同名字的全局变量与局部变量,则在函数内部会使用局部变量,而在函数外,因局部变量不存在,故使用全局变量。
def scope():#创建函数
var1=1
print(var1,var2)
var1=10
var2=21
scope()
print(var1,var2)
**run**
1 21
10 21
如果在函数内使用全局变量,需在函数内部用global关键字进行声明。
def scope():
global var1
var1=1
var2=2
print(var1,var2)
var1=10
var2=21
scope()
print(var1,var2)
**run**
1 2
1 21
多函数程序
'''实现函数之间的调用关系,func1:实现数据的相加操作,func2实现数据的求平均值操作'''
def func1(*args):
'''
:param args: 输入需要相加的数据
:return: 返回所有数据的和
'''
# print(args)
sum = 0
data_len = len(args)
# 这是求的数据的个数
for obj in args:
sum += obj
return sum,data_len
def func2(total,count):
'''
实现求多个数据的平均值
:param total: 这个形参是指所有数据的和
:param count: 这个形参是指数据的个数
:return: 均值
'''
avg = total/count
return avg
ret,data_len = func1(1,2,3,6,7,99,123,134)
print('所有数据的和',ret)
print('所有数据的个数',data_len)
print(ret,data_len)
avg = func2(ret,data_len)
print('所有数据的平均值',avg)
匿名函数
语法:lambda [arg1[, arg2, … argN]]: expression,参数是可选的,如果使用的参数话,参数通常也是表达式的一部分。
#携带参数的匿名函数
avg = lambda total,count:total/count
print(avg(12,3))
#携带默认参数的匿名函数
ret1=(lambda a,b,c=100:a+b+c)(1,2,0)
print(ret1)
#不定长参数
f = lambda *args:args
f1 = lambda **kwargs:kwargs
print(f(1,2,3,4,5,6))
print(f1(name='tony'))
#真正的匿名函数
ret=(lambda a,b:a+b)(1,2)
print(ret)
#匿名函数寻找三个数中的最大值最小值
print((lambda a,b,c:c if c >(a if a>b else b) else (a if a>b else b))(1,22,3))
递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。举个例子,我们来计算阶乘n! = 1 x 2 x 3 x … x n,用函数fact(n)表示,可以看出:
fact(n) = n! = 1 x 2 x 3 x … x (n-1) x n = (n-1)! x n = fact(n-1) x n。所以,fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。于是,fact(n)用递归的方式写出来就是:
def func_fact(n):
if n==1:
return 1
else:
out=n*func_fact(n-1)
return out
print(func_fact(4))
'''实现兔子生兔子'''
def rab(month):
'''
该函数实现的是递归函数的写法,返回兔子的个数,古典问题
:param month: 这是第几个月
:return: 兔子的总个数
'''
if month == 1:
return 1
if month == 2:
return 1
else:
count = rab(month-1)+rab(month-2)
return count
print(rab(1))
print(rab(2))
print(rab(3))
print(rab(4))
print(rab(5))
print(rab(6))