Python函数强化练习(动态参数/不定长参数、关键字参数、变量作用域)
本文:函数的强化练习,同时拓展动态参数/不定长参数、关键字参数、变量作用域
题目:写一个函数,检查传入列表的长度,如果大于2,那么只保留前两个长度的内容,并将新内容返回
#步骤1: L=[1,2,3,4] if len(L)>2: new_list=L[0:2] print(new_list) #步骤 2: def check_list(): L=[1,2,3,4] if len(L)>2: new_list=L[0:2] print(new_list) return new_list #L=[1,2,3,4] check_list() #步骤 3: def check_list(L): #L=[1,2,3,4] if len(L)>2: new_list=L[0:2] #print(new_list) return new_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 in args: 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) #输出--和为: 10
add_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 #全局变量 def add(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