当前位置: 代码迷 >> 综合 >> python3学习(1):函数的可变位置参数和可变关键字参数* 和** 学习心得
  详细解决方案

python3学习(1):函数的可变位置参数和可变关键字参数* 和** 学习心得

热度:61   发布时间:2023-12-17 10:13:57.0
## 函数详解 ## 函数是结构化编程对代码的最基本的封装,为了复用,减少冗余代码。 ## 函数包括 1.内建函数,2.库函数,  ## *add0 -- add2) 是不可变参数 def add0(x,y): ## 定义一个简单函数并给出两个位置形参,按照位置顺序传入实参,位置参数和关键字参数是调用不同,对于同样的函数f(x,y),  ## 如果调用是f(2,8),则是位置参数,按照位置顺序将实参传给形参,如果调用是 f(y=8,x=2)则是关键字参数,可以不按顺序将实参传给形参。  # 位置参数必须在关键字参数之前传参。  result = x+y  return result
## a00 = add0() # 语法错误,x y 为位置参数,不能接受0个实参,函数调用时传入的参数要和定义的参数的个数相匹配(可变参数例外) a01 = add0(4,5) ## 调用函数add,并按位置顺序传入两个实参。 a02 = add0('a', 'b') ### 字符串 a03 = add0(x=3,y=8) ## 作为关键字参数调用 a04 = add0(y=3,x=2) ## add0(y=3,2) 语法错误,位置参数必须在关键字参数之前传入。位置参数是按位置对应的。 print('1: ',' a01=',a01,' a02=',a02,' a03=',a03,' a04=',a04)
print('2: ',callable(add0)) ## 判断函数add是否可调用  def add1(x=9,y=11): ### 默认参数值,x y z 虽然有缺省值,但是都是位置参数,  return x+y a11= add1() ## 取默认值 a12= add1(6)  ### 6传给x,其他取默认值。 a13 = add1(6,y=7) ## 但是 add1(x=6,7)错误、因为7会传给x,add1(y=9,6)错误,x为位置参数,应该先给x传参数 a14 = add1(y=5,x=9) ##指定了参数名称,与顺序无关。 a15 = add1(y=22)### 22传给y,其他取默认值。 print('3: ',' a11=',a11,' a12=',a12,' a13=',a13,' a14=',a14,' a15=',a15) ###  #def add2(x=4,y): ## 错误,y应该放在x的前面,不能把无缺省值(默认值)的参数y放在有缺省值的参数x后面。应该是def add2(y,x=4)  def add2(x,y=8): # 定义一个函数,两个位置参数,缺省值要向后放,只能在函数定义时加缺省值。比如def f(x=3,y)是错误的  return x+y a21 = add2(3,5) ## 按顺序将两个实参传给形参 a22 = add2(9) ## 先将9传给xy取默认值 a23 = add2(y=7, x=5) # 函数调用为关键字参数,可以不按顺序传参 a24 = add2(3,y=6) ## x作为位置参数,y作为关键字参数,并进行传参 print('4: ',' a21=',a21,' a22=',a22,' a23=',a23,' a24=',a24)def add3(nums): ## 可传入一个可迭代对象,迭代元素求和。集合/range,迭代器 都可以  sum = 0  for x in nums:  sum += xreturn sum
a31 = add3([1,2,3,5,9]) ## 传入的实参是序列 a32= add3((2,5,9,6,4,8)) ### 传入是实参是 元组 a33 = add3(range(1,11)) ### 传入的实参是 1-10的数字 print('5: ',' a31=',a31,' a32=',a32,' a33=',a33)### add4 是可变位置参数 def add4(*nums): ## *表示该形参为可变参数,可以接受任意个实参,包括0个。主要是列表和tuple,不用字典。  sum = 0  print(type(nums)) ## 此处不可加 *  for x in nums:  sum += xprint(sum)return sum
a41 = add4(1,5,9,6,7,2,3) ### 位置关键字参数不能传递任意多个实参。收集多个实参为一个tuple ##a18 = add4([1,5,7,1,],[2,5,3,9])  print('6: ',' a41=',a41)#,' a18=',a18)  ### 函数add5 是可变的关键字参数。 def add5(**kwargs): ##可变的关键字参数,形参前使用**符号,可以表示接收多个关键字参数,收集的实参名称和值组成一个字典。  for k,v in kwargs.items():  print('{} = {}'.format(k,v))return kwargs a51 = add5(host='127.0.0.1', port='8080', username = 'Rocky',password='magedu')
print('7:','a51= ',a51)## 可变参数混合使用 def add6(x,y,**kwargs):## 可变参数混合使用  print(x,y)  ##,*kwargs 不写  for k,v in kwargs.items():  print('{} = {}'.format(k,v))return kwargs a61 = add6('www','megadu')
print('8: ','a61=:',a61)def add7(x,*args,**kwargs): ## 可变参数,可变关键字参数混合使用  print(x)print(args)for k,v in kwargs.items():  print('{}={}'.format(k,v))return kwargs a71= add7('Rocky')
print('9:','a71=',a71)def add8(x,y,*args,**kwargs): ## 多种参数混合使用,但是add8(7,9,y=5,x=8,a=1,b='python')语法错误。因为79已经给了x y  print(x) #### 输出普通参数 x的值  print(y)  ## 输出普通参数 y的值  print(args)  ## 输出 可变普通参数 args 的值  print(kwargs)  ## 输出可变关键字参数 kwargs 的值 a81 = add8(3,5,7,9,10,11,15,a=1,b='python')
a82 = add8(3,5)
a83 = add8(3,5,7)
a84 = add8(3,5,a=1,b='python')
print('10: ','a81=: ',a81,'a82=: ',a82,'a83=: ',a83,'a84=: ',a84)def add9(*args,x=6,y=6,**kwargs): ## x y 由位置参数变为 keyword-only 参数(只能是关键字参数),x  y必须按关键字传参,可给缺省值。  ## keyword-only概念: 如果在一个星号参数之后出现的普通参数,实际上已经不是普通参数,而是变为keyword-only 参数。  print(x)  ## 输出关键字参数 x的值  print(y)  ## 输出关键字参数 x的值  print(args)  ## 输出可变参数 args的值,是一个元组  print(kwargs)  ## 输出可变关键字参数 kwargs的值,是一个字典。 a91 = add9(7,9,3,5,a=1,b='python') ## 前面的数字传给args并生成一个元组,x y 取默认值。 a92 = add9(7,9,y=5,x=3,a=1,b='python') ## x y 按关键字传参。 print('10:', 'a91= ',a91)def add10(*args,x): ##定义一个函数,包括一个可变普通参数和一个keyword-only参数 def add(*kwargs,x) 语法错误,因为kwargs会取走所有值。  print(x)print(args)
a101 = add10(x=8) ## 关键字参数 x 必须按关键字参数赋值,可变普通参数可以为空 a102 = add10(2,4,5,x=1) ## 前面的数字传给可变普通参数后生成一个元组, ## a103 = add10(x=4,3,5,6) 语法错误,不能先给x传参,要先传给普通参数,再传给关键字参数。 a104 = add10(3,2,1,x=9)
print('11: ','a101=',a101,'a102=',a102,'a104=',a104)#def add53(x,w,**kwargs,*args): 此法错误,*参数应该在**参数之前。  def add11(*,x,y): ## keyword-only 参数的另一种形式。*表示后面的x y keyword-only 参数  print(x,y) ## 输出两个关键字参数的值。 a111 = add11(x=5,y=6) ## * 之后,普通形参变成了必须给出 keyword-only 参数,必须按关键字参数调用 ### a112 = add11(3,4)  a113 = add11(2,x=8,y=6) 语法错误 print('12: ','a111=',a111)def add12(*args,x=5):## 定义一个函数,有一个可变位置形参和一个位置形参。只有可变的形参才可以给0个实参,  # 其他的参数必须给实参。有缺省值的情况下例外  print(x) # 输出位置形参的值  print(args) ## 输出可变位置形参的值 a121 = add12() ## 输出x5args为空括号,等价于 add11(x=5) a122 = add12(8) ## 调用函数时,输出x5,可变位置参数args为元组 (8,) a123 = add12(x=9)## 输出x9args为空括号 a124 = add12(1,2,3,x=10) ## 输出x10args为元组(1,2,3) print('13','a121=',a121,'a122=',a122,'a123=',a123,'a124=',a124) ## 可以不用print命令,以上调用直接输出。  def add13(y,*args,x=8): # 定义一个函数,给出一个普通形参,一个可变普通形参,一个关键字参数且含缺省值。  print('x={},y={}'.format(x,y))print(args)
##a131 = add13() #语法错误,因为形参没有传值 a132 = add13(5)
#a133 = add13(x=6) #语法错误,因为形参没有传值 a134 = add13(1,2,3,x=10)
#a135 = add13(1,2,y=8,x=17) #语法错误,因为普通形参y有多个传值  def add14(x,y,z=3,*args,m=4,n,**kwargs):  print(x,y,z,m,n)print(args)print(kwargs)
a141 = add14(1,2,n=4)
# a142 = add14(1,2,10,11,x=7,n=89) ## 错误,x 被重复赋值

  相关解决方案