本文:函数的强化练习,同时拓展动态参数/不定长参数、关键字参数、变量作用域
题目:写一个函数,检查传入列表的长度,如果大于2,那么只保留前两个长度的内容,并将新内容返回
#步骤1:
L=[1,2,3,4]if len(L)>2:
new_list=L[0:2]print(new_list)#步骤 2:
defcheck_list():
L=[1,2,3,4]if len(L)>2:
new_list=L[0:2]print(new_list)returnnew_list#L=[1,2,3,4]
check_list()#步骤 3:
defcheck_list(L):#L=[1,2,3,4]
if len(L)>2:
new_list=L[0:2]#print(new_list)
returnnew_list
L=[1,2,3,4] #将写死的函数参数化
new_list=check_list(L) #函数调用后存值
print(new_list)
【一】动态参数/不定长参数
1、符号:*args ---argument 可以接收无穷多参数,必须加“*”号
2、属性:1)不限制参数长度和个数 2)在函数内部是做为元组来传递,可以通过遍历获取单个元素
3、例子:
#动态参数/不定长参数 *args
def make_sandwich(*args):
all=''
for item inargs:
all+=item
all+='、'
print('你的三明治包含了:'+all)
make_sandwich("牛肉",'火腿','培根','吐司')
make_sandwich()
【二】关键字参数
1、符号:**kwargs ---key word argument ,必须加“**”号
2、属性:1)实参调用需要指定参数与参数值 2)在函数内部是做为字典来传递
3、例子:
【动态参数 or 关键字参数的细节使用】
#例子1:(动态参数接收参数数量无穷)
def add_all_num(*L):
sum=0
for item in L:
sum+=item
print('和为:',sum) #输出--和为: 10add_all_num(1,2,3,4)
-----------------------------------------------------------------------------------
#例子2:(动态参数已全部接收无法再赋值给a)
def add_all_num(*L,a):
sum=0
for item in L:
sum+=item
print('和为:',sum)
print('a的值',a) #TypeError: add_all_num() missing 1 required keyword-only argument: 'a'
add_all_num(1,2,3,4)
-----------------------------------------------------------------------------------
#例子3:(位置参数a指定被赋值输出)
def add_all_num(*L,a):
sum=0
for item in L: #遍历的是L
sum+=item
print('和为:',sum) #输出--和为: 6
print('a的值',a) #输出--a的值 4
add_all_num(1,2,3,a=4)
-----------------------------------------------------------------------------------
#例子4:(a优先赋值,其余给L)
def add_all_num(a,*L):
sum=0
for item in L: #遍历的是L
sum+=item
print('和为:',sum) # 输出--和为: 9
print('a的值',a) # 输出--a的值 1
add_all_num(1,2,3,4)
-----------------------------------------------------------------------------------
#例子5:(位置参数不可重复赋值,只接收一次)
def add_all_num(a,*L):
sum=0
for item in L:
sum+=item
print('和为:',sum)
print('a的值',a) #TypeError: add_all_num() got multiple values for argument 'a'
add_all_num(1,2,3,4,a=9) #a已经赋值过不可以再赋值,只能接收一次
-----------------------------------------------------------------------------------
#例子6:(实参调用可以覆盖掉形参/位置参数的默认值)
def add_all_num(a=9,*L): #实参可以指定覆盖位置参数中的参数
sum=0
for item in L:
sum+=item
print('和为:',sum) # 输出--和为: 9
print('a的值',a) # 输出--a的值 1
add_all_num(1,2,3,4,)
-----------------------------------------------------------------------------------
#例子7:(关键字参数的使用)
def add_all_num(a,*L,**kwargs):
sum=0
for item in L: #遍历的是L
sum+=item
print('和为:',sum) # 输出--和为: 2
print('a的值',a) # 输出--a的值 1
print('kwargs',kwargs) #输出--kwargs {'x': 3, 'y': 4}
add_all_num(1,2,x=3,y=4)
-----------------------------------------------------------------------------------
【三】变量作用域
1、分类:全局变量、局部变量
2、属性:1)作用范围不一样
2)全局:在模块里都能调用;局部:只能用于函数内
3)当“全局”和“局部”同时存在,优先调用“局部”;当“局部变量”没有时,优先使用全局
4)global关键字
3、例子:
#例子1:
a=1 #全局变量
defadd(b):global a #声明a是个全局变量
a=10 #赋值运算
print(a+b) #20
add(10)print(a) #10
#-----------------------------------------------------
#例子2:a=1 #全局变量
def add(b):
global a #声明a是个全局变量
a=b+5 #赋值运算
print(a+b) # 25
add(10)
print(a) #15