06.函数与模块
1、动态参数
*args
顾名思义,动态参数就是传入的参数的个数是动态的,可以是1个、2个到任意个,还可以是0个。在不需要的时候,你完全可以忽略动态函数,不用给它传递任何值。
Python的动态参数有两种,分别是*args
和**kwargs
,这里面的关键是一个和两个星号的区别,而不是args
和kwargs
在名字上的区别,实际上你可以使用*any
或**whatever
的方式。但就如self一样,默认大家都使用*args
和**kwargs
。
注意:动态参数,必须放在所有的位置参数和默认参数后面!
def func(*args): for i in args: i += i return i print(func(1,2,3))
#调用时将实参打包成一个元组的形式传入,参数为列表将列表作为一个参数传入,如果需要将列表中的元素一个一个传入调用函数时需要加*,例如a是列表,func(*a)就可将列表中的元素作为实参传入
#注意:调用时只能有一个参数加*,且只能放到最后面func(123, 'hello', ['a', 'b', 'c'], *{'name': 'kobe', 'age': 41})
**
将字典中的数据按照键值对的形式将value作为实际参数传给函数
**kwargs
def fun(a, **kwargs): print "a is ", a print "We expect kwargs 'b' and 'c' in this function" print "b is ", kwargs['b'] print "c is ", kwargs['c'] fun(1, b=3,c=5)
a is 1 We expect kwargs 'b' and 'c' in this function b is 3 c is 5
2、用模块管理函数
#test1.py def test(): print('test1')
#test2.py def test(): print('test2')
#test3.py 在此py文件中引用test1.py和test2.py的函数方法 import test1 as t1 import test2 as t2 t1.test() t2.test()
注意:
from test1 import test from test2 import test test() #按此方法引用test函数,之后的会覆盖掉前面的,实际引用的是test2.py中的test函数
3、如果我们导入的模块除了定义函数之外还中有可以执行代码,那么Python解释器在导入这个模块时就会执行这些代码,事实上我们可能并不希望如此,因此如果我们在模块中编写了执行代码,最好是将这些执行代码放入如下所示的条件中,这样的话除非直接运行该模块,if条件下的这些代码是不会执行的,因为只有直接执行的模块的名字才是"__main__"。
#a.py def foo(): pass def bar(): pass # __name__是Python中一个隐含的变量它代表了模块的名字 # 只有被Python解释器直接执行的模块的名字才是__main__ if __name__ == '__main__': print('call foo()') foo() print('call bar()') bar()
#b.py import b #此返回结果并不会执行a.py中的可执行程序
4、练习题