zoukankan      html  css  js  c++  java
  • python函数收集不确定数量的值

    python写函数的时候,有时候会不确定到底传入多少值。

    首先是,*args,单星号参数收集参数:

     1 #!usr/bin/python
     2 #-*-coding:utf-8-*-
     3 
     4 #定义一个简单的参数收集的函数;
     5 def functionx(x,*args):
     6     print(x) #打印收集到的变量x
     7 
     8     results = x #将变量x赋值给results
     9     print(args) #打印收集到的不确定数量的变量args
    10 
    11     #循环读取args,必须是可读取的嘛,因为args是可迭代的数据类型tuple
    12     for i in args:
    13         results += i #将代码results = x获得的值与循环得到的i相加再赋值给results
    14     return results #函数的返回值
    15 
    16 test = functionx(1,2,3,4,5,6,7,8,9) #将1-9之间所有的数作为参数传递给functionx
    17 print(test) #打印是否符合预期.

    上例可以看出,值1传递给了x,值2,3,4,5,6,7,8,9作为元组传递给了args。再来一个:

    1 #定义函数并只让*args作为参数;
    2 def foo(*args): 
    3     print(args) #在函数体内打印
    4     print(type(args)) #在函数体内打印数据类型
    5 
    6 foo(1,2,3) #调用函数传值1,2,3。输出:第一个print,(1, 2, 3);第二个print,<class 'tuple'>
    7 foo('baidu','google','facebook') #再次调用函数传值。输出:第一个print,('baidu', 'google', 'facebook');第二个print,<class 'tuple'>

    第三是*args只有一个值的情况,打印的时候还是以元组分解符()封闭,但是print出来的是(x,)这种形式,其中x是值,后面的逗号是元组在只有一个值的时候表示元组的方式(我的理解)。

    1 def foo(x,*args):
    2     print("x: ", x)
    3     print("Args: ", args)
    4 
    5 foo(1,2) #传入1,2,1会对应x,而2则会对应*args,那么输出是Args:  (2,)

    最后一种是空tuple的情况,也就是在传值的过程中,*args收集不到值。 

    1 def foo(x,*args):
    2     print("x: ", x)
    3     print("args: ", args)
    4 
    5 foo(1); #调用函数,第一个print输出1,第二个print输出:args:  ()

    再有一种是**kargs,双星号参数收集:

    1 def foo(**kargs):
    2     print("Kargs: ", kargs);
    3 
    4 foo(a=1,b=2,c=3); #调用函数,第一个print输出:Kargs:  {'a': 1, 'b': 2, 'c': 3};第二个print输出:<class 'dict'>

    一个综合例子:

    1 def functionx(x,y,z,*args,**kargs):
    2     print(x)
    3     print(y)
    4     print(z)
    5 
    6     print(args)
    7     print(kargs)
    8 
    9 functionx(1,2,3,4,name='baidu');

    输出结果如下:

    1
    2
    3
    (4,)
    {'name': 'baidu'}

    ----------------------------------------------总结----------------------------------------------

    1,*args收集到的参数是tuple类型,可以为空;

    2,**kargs收集到的参数是dict类型,可以为空,但是传值的时候要注意一定是类似:a='a', b='b'这样子的形式。其他的方式会报错。

    写在最后,另外一种函数的传值方式。有点类似逆向传值:

    1 def add(x,y):
    2     return x+y
    3 
    4 print(add(2,3)) #输出5
    5 
    6 bars = (2,3) #定义元组bars
    7 print(type(bars)) #输出:<class 'tuple'>
    8 print(add(*bars)); #输出5

    先把要传入的值放到一个元组bars中,然后调用函数add并传入元组,add(*bars)这样子的方式,把值传入到函数内。这有点类似参数收集的逆过程,但是要求元组中的个数要求和函数的参数个数一致。要不然会报错。

    再来一个例子加深印象:

    1 def book(reader,bookname):
    2     print("%s is reading book %s" %(reader,bookname))
    3 
    4 book(reader='Eric',bookname='Easy for PHP') #正常函数调用方式
    5 
    6 bars = {'reader':'Mary', 'bookname':'Easy for python'}
    7 book(**bars) #逆向调用方式
  • 相关阅读:
    Git的安装与配置
    JDBCTemplate
    消费金融大数据风控架构
    架构设计之道
    面向服务架构SOA
    java集合List解析
    web应用安全
    微服务的交互模式
    服务化管理和治理框架的技术选型
    分库分表就能无限扩容么?
  • 原文地址:https://www.cnblogs.com/mafu/p/13507734.html
Copyright © 2011-2022 走看看