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.'