对于初学者来说,看到*args和**kargs就头大,到底它们有何用处,怎么使用?本文将和大家一起来扒一扒,希望对大家学习python有所帮助。
1.*args 实质就是将函数传入的参数,存储在元组类型的变量args当中
def fun_var_args(farg, *args): print "farg:", farg for value in args: print "other arg:", value fun_var_args(1, "two")
运行:
farg: 1
other arg: two
def fun_var_args(farg, *args): print "farg:", farg for value in args: print "other arg:", value fun_var_args(1, "two",3,4,5)
运行:
farg: 1
other arg: two
other arg: 3
other arg: 4
other arg: 5
2.第二种场景:
def fun_input_list(var1,var2,var3):
print var1,var2,var3 var_list=["second",3]
fun_input_list(1,*var_list)
运行:
1 second 3
def fun_input_list(var1,var2,var3):
print var1,var2,var3 var_list=["second",3,4,5]
fun_input_list(1,*var_list)
运行:(注意:运行有错误,故意的)
fun_input_list(1,*var_list)
TypeError: fun_input_list() takes exactly 3 arguments (5 given)
threading中使用*args
1.两个传参
# encoding: utf-8
from time import ctime,sleep
import threading # 定义自己类的功能
class MyThread(threading.Thread):
def __init__(self, func, args):
threading.Thread.__init__(self)
self.func = func
self.args = args
# 调用start自动执行的函数
def run(self):
self.func(*self.args)
def player(song_file,time):
for i in range(2):
print("start player %s . %s"%(song_file,ctime()) )
sleep(time) threads = [] t = MyThread(player,('You and me .mp3',7)) threads.append(t)
t.start()
t.join()
运行:
start player You and me .mp3 . Wed Jul 18 23:40:30 2018
start player You and me .mp3 . Wed Jul 18 23:40:30 2018
1.一个传参,注意args的传值('You and me .mp3',),这里是元祖类型。
# encoding: utf-8
from time import ctime,sleep
import threading # 定义自己类的功能
class MyThread(threading.Thread):
def __init__(self, func, args):
threading.Thread.__init__(self)
self.func = func
self.args = args
# 调用start自动执行的函数
def run(self):
self.func(*self.args)
def player(song_file):
for i in range(2):
print("start player %s ."%(song_file) ) threads = []
t = MyThread(player,('You and me .mp3',))
threads.append(t)
t.start()
t.join()
运行:
start player You and me .mp3 .
start player You and me .mp3 .
一个或者多个传参
# encoding: utf-8
from time import ctime,sleep
import threading # 定义自己类的功能
class MyThread1(threading.Thread): def __init__(self, func, args):
threading.Thread.__init__(self)
self.func = func
self.args = args def run(self):
self.func(*self.args) class MyThread2(threading.Thread): def __init__(self, func):
threading.Thread.__init__(self)
self.func = func def run(self):
self.func() def player1():
for i in range(2):
print"start player." def player2(song_file):
for i in range(2):
print("start player %s ."%(song_file) ) args = 'You and me .mp3'
threads = []
t1 = MyThread2(player1)
threads.append(t1)
t2 = MyThread1(player2,(args,))
threads.append(t2)
print threads
for t in threads:
t.setDaemon(True)
t.start()
for t in threads:
t.join()
运行:
[<MyThread2(Thread-1, initial)>, <MyThread1(Thread-2, initial)>]
start player.
start player.
start player You and me .mp3 .
start player You and me .mp3 .
3.**kargs 实质就是将函数的参数和值,存储在字典类型的kargs变量中
def fun_var_kargs(farg,**kargs):
print "firsr value %s"% farg
for key in kargs.keys():
print key,
print kargs[key], fun_var_kargs(1,var1="second",var2=35,var3="third")
运行:注意字典是二分法读取的,所以先var1="second",然后var3="third",最后var2=35
firsr value 1
var1 second var3 third var2 35
注:print key + ":" + kargs[key],这个为什么不能用
def fun_var_kargs(farg,**kargs):
print "firsr value %s"% farg
for key in kargs.keys():
print key + ":" + kargs[key], fun_var_kargs(1,var1="second",var2=35,var3="third")
运行:
print key + ":" + kargs[key],
TypeError: cannot concatenate 'str' and 'int' objects
firsr value 1
var1:second var3:third
4.**kargs的第二种使用场景
def fun_input_dic(var1,var2,var3):
print var1,var2,var3 dic_input={"var2":2,"var3":"third"}
fun_input_dic(1,**dic_input)
运行:
1 2 third
注意*dic_input的运行结果,那就跟*dic_input用法一样了。
def fun_input_dic(var1,var2,var3):
print var1,var2,var3 dic_input={"var2":2,"var3":"third"}
fun_input_dic(1,*dic_input)
运行:
1 var3 var2