8-Functon_args_kwargs

Basic function

def hello_func(greeting="none"):
    return "{} function!".format(greeting)
print(hello_func.__str__)
<method-wrapper '__str__' of function object at 0x7f9e500b0158>
  • keep your code dry

不要重复编写代码,如果代码可以复用,就尽量写成函数,以便于后期的维护和修改

  • return 也可以返回字符串
print(hello_func("hello").upper())
HELLO FUNCTION!
  • 函数内部的变量不会影响到函数外面的变量

变量作用范围

def hello_func(greeting="none",name= "you"):
    return "{}, {}!".format(greeting,name)
hello_func("hello","dale")
'hello, dale!'

args and kwargs

对于*args和**kwargs在函数中我们可以称之为参数组。但并不是必须写成*args和**kwargs。只有变量前的*(星号)才是必须的. 你也可以写成*var和**vars。*args和**kwargs只是个通俗的命名约定。

可以将不定数量的参数传递给某个函数。这里的不定的意思是:预先并不知道,函数使用者会传递多少个参数给你, 所以在这个场景下使用这两个关键字。

  • *args的功能: 接收N个位置参数,转换成元组tuple形式

  • **kwargs: 接收N个关键字参数,转换成字典dict形式

  • 位置参数一定要在关键字参数之前,也就是(*args,**kwargs)

*args

*args是用来发送一个非键值对、可变数量的参数列表给一个函数作为参数。

  • 普通参数和位置参数
def fun1(x,*args):
    print("普通变量:{}".format(x))
    for arg in args:
        print("位置参数变量:{}".format(arg))
fun1(1,2,3,4,5)
普通变量:1
位置参数变量:2
位置参数变量:3
位置参数变量:4
位置参数变量:5
def fun2(*args,x):
    print("普通变量:{}".format(x))
    for arg in args:
        print("位置参数变量:{}".format(arg))
list=(2,3,4,5)
fun2(*list,x=1)
普通变量:1
位置参数变量:2
位置参数变量:3
位置参数变量:4
位置参数变量:5

**kwargs

接收N个关键字参数,然后打包成字典dict形式。
通过这个关键字参数,我们也可以创建一个字典。

def fun3(name,**kwargs):
    print(name)
    print(kwargs)
    for key,val in kwargs.items():
        print("{}:{}".format(key,val))
fun3("dale",age=19,sex="M")
dale
{'age': 19, 'sex': 'M'}
age:19
sex:M

args and kwargs

  • 普通参数,位置参数,关键字参数
def fun4(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)
fun4(1,2,3,age=19,sex='F')
1
(2, 3)
{'age': 19, 'sex': 'F'}
  • 如果把位置参数放到了关键词参数之前,则会出现如下错误
fun4(age=19,sex='F',1,2,3)
  File "<ipython-input-9-baa33be3a28b>", line 1
    fun4(age=19,sex='F',1,2,3)
                       ^
SyntaxError: positional argument follows keyword argument
  • uppack

upack 指的是在传入的参数变量前面加* 或者 **。这些符号的含义是将dict和list类型的参变量unpack成一个个独立的变量,然后利用args和kwargs的打包功能重新打包成list或者dict,传到函数内部。

def student_info(*args, **kwargs):
    print(args)
    print(kwargs)
courses= ["math","art"]
info = {"name":"dale","age":22}
  • 如果不将dict和list类型的变量先解包,而直接打包传递给函数,则系统会认为传入的是几个独立的个体而二次打包,形成我们不想要的结果。
student_info(courses,info)
print("-----------")
student_info(*courses,**info)
(['math', 'art'], {'name': 'dale', 'age': 22})
{}
-----------
('math', 'art')
{'name': 'dale', 'age': 22}

引用

本文主要参考下列视频及文章内容,翻译、整理并亲测代码后形成此文,感谢下面作者的无私奉献!

补充

  • format中以参数对传入

这种形式更加便于代码的阅读,可读性高

"my name is {name} and i am {age} years old.".format(name = "dale",age = "25") # for parameter dict, this is a more readable way
'my name is dale and i am 25 years old.'
person = {"name":"dale","age":"25"}

相当于unpack了person字典,然后以参数对的形式传递参数(类似上面的这样形式)

"my name is {name} and i am {age} years old.".format(**person) # **dict, uppack a dict, 变成上面的这种形式
'my name is dale and i am 25 years old.'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值