*args和**kwargs:
二者都用于定义函数参数,当不确定参数数量时吸收多余参数时使用,并且在顺序上*args必须排在**kawrgs前面。
*args:代表任意多个无名参数,返回元组。
**kwargs:代表任意多个无名关键字参数,返回字典。
#例
def test(someone,*args,**kwargs) :
print(someone,args,kwargs)
test(1,2,3,4,5,a='6',b='7')
#输出
# 1 (2,3,4,5) {'a'='6','b'='7'}
def test(someone,*args,**kwargs) :
print(someone,*args,kwargs)
test(1,2,3,4,5,a='6',b='7')
#输出
# 1 2 3 4 5 {'a'='6','b'='7'}
def test(someone,*args,**kwargs) :
print(someone,*args,*kwargs)
test(1,2,3,4,5,a='6',b='7')
#输出
# 1 2 3 4 5 a b
在函数中args和*args会有不同效果,args会以元组形式展示参数,而*args则以元组内的元素形式展示。kwargs和*kwargs也不同,**kwargs则报错。kwargs以字典形式展示参数,而*kwargs则展示字典的键名。具体看以上示例。
另外,传入的字典键名不能与函数定义的参数名相同(起名字过于随便,一开始随手写的例子里第一个参数一开始叫a,结果和传进去的字典键名一样导致报错,血的教训)。
修饰器:
@:修饰器(语法糖),在函数2定义前加上‘@函数1’,则执行函数2之前先执行函数1。即在不改变原函数的前提下,为原函数增加新功能。
@函数1
def 函数2():
……
#以上等同于
函数2=函数1(函数2)
#例:
def old(object):
def inner():
print('hello')
object()
return inner
pass
@old
def new():
print('world')
new()
#输出
hello
world
若是把老函数中内部定义的函数部分去掉,一样能输出‘hello’‘world’但是会报错。
def old_1(object):
print('hello')
object()
@old_1
def new_1():
print('world')
new_1()
zip:
接收可迭代对象,将其中的元素打包成元组,再返回以元组为元素的列表。
#例:
a = [1,2,3]
b = [4,5,6]
ab = zip(a,b)
print (ab)
print (list (ab) )
若是直接输出ab,则返回该数据所在的内存地址。
强制转换成列表类型(list(ab))才输出内容。
若要还原数据,则将zip和*一起使用。
#例:
a = [1,2,3]
b = [4,5,6]
ab = zip(a,b)
c,d = zip(*ab)
print(c)
print(d)