上亠我们对比了 数学函数 与编程 函数 的相同点
程序里面的函数也有它自己的特殊性
- 参数的默认值
def hello(name, loud=False):
if loud:
print('HELLO, %s!' % name.upper())
else:
print('Hello, %s' % name)
- 这里我们定义了一个函数,有两个参数,其中第二个参数为 loud 它有一个默认值。
- 函数的作用是输入名字,如果 loud 为true则输出大写的名字,否则原谅输出名字
hello("name")
hello("name", False )
hello("name",True)
Hello, name
Hello, name
HELLO, NAME!
一旦定义 了一个有默认值的参数 那么 这个参数是可以传值,也可以不传的
实际上这些参数在使用层面就变成 一个“动态”参数形式
如果函数没有默认值我们尝试不传参数会怎么样?
def fff(a):
pass
fff ()
function()
TypeError: function() missing 1 required positional argument: 'a'
函数 fff中定义了一个参数,因为在调用 的时候必需要传参数
fff(11)
如果你想偷懒把所有 的参数给一个默认值i当然是可以的。
def fff (a=1):
pass
fff()
- 第一个参数没有默认值,
- 第二个参数没有默认值,
- 这个函数可以定义出来 是不能被调用的
def function(a=1, b):
pass
function ()
function(1)
function(1,2)
应该如何定义这种可变参数呢?
def parrot(voltage, state ='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")
同时存在可以传也可以不传的参数大家应该参照上面 的规范去定义
- 必须传的参数写在前面
- 非必传的参数写在后面
调用 的方式就有很多了。大家可以慢慢体会这样做的目的。
parrot(1000) # 1 positional argument
parrot(voltage=1000) # 1 keyword argument
parrot(voltage=1000000, action='VOOOOOM') # 2 keyword arguments
parrot(action='VOOOOOM', voltage=1000000) # 2 keyword arguments
parrot('a million', 'bereft of life', 'jump') # 3 positional arguments
parrot('a thousand', state='pushing up the daisies') # 1 positional, 1 keyword
如果理解函数的定义与调用这些知识再去看其他工具提供的写法就不会迷糊了
我们可以看一下Java语言是如何实现类似的功能的,相比之下Pyhon还算是比较 灵活的,不过各有千秋。 Java 使用数组去接收动态参数,
class Parameter {
public static void main(String[] args) {
dynamicMethod("111");
dynamicMethod("222", "aaa","bbbb");
dynamicMethod("333", "aaa", "bbbb", "cccccccc");
}
private static void dynamicMethod(String s, String ... args) {
System.out.println("----------");
System.out.println(s);
if (args != null) {
for (String arg : args) {
System.out.print(arg + " ") ;
}
System.out.println();
}
}
}
----------
111
----------
222
aaa bbbb
----------
333
aaa bbbb cccccccc