1、*args
# 位置参数,计算x2的函数 def power(x): return x * x p = power(5) print(p) # 把power(x)修改为power(x, n),用来计算xn def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s p1 = power(5, 2) p2 = power(5, 3) print(p1) print(p2) # 默认参数 # 使用默认参数有什么好处?最大的好处是能降低调用函数的难度。 def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s # 关键字参数有什么用? # 它可以扩展函数的功能。比如,在person函数里, # 我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。 # 试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外, # 其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。 # *args是可变参数,args接收的是一个tuple # 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple, # 再通过*args传入:func(*(1, 2, 3)); def hello(greeting, *args): if (len(args)==0): print('%s!' % greeting) else: print('%s, %s!' % (greeting, ', '.join(args))) hello('Hi') hello('Hi', 'Sarah') hello('Hello', 'Michael', 'Bob', 'Adam') names = ('Bart', 'Lisa') hello('Hello', *names)
2、**kw
# Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。 # 默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误! # 要注意定义可变参数和关键字参数的语法: # *args是可变参数,args接收的是一个tuple; # **kw是关键字参数,kw接收的是一个dict。 # 以及调用函数时如何传入可变参数和关键字参数的语法: # 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple, # 再通过*args传入:func(*(1, 2, 3)); # 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict, # 再通过**kw传入:func(**{'a': 1, 'b': 2})。 # 使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。 # 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。 # 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。 def print_scores(**kw): print(' Name Socre') print('..........') for name, score in kw.items(): print('%10s %d' %(name, score)) print() print_scores(Adam = 99, Lisa=88, Bart=77) data ={ 'Adam Lee': 99, 'Lisa S': 88, 'F.Bart': 77 } print_scores(**data) def print_info(name, *, gender, city='Beijing', age): print('Personal Info') print('-------------') print('Name:%s' % name) print('Gender:%s' % gender) print('City: %s' % city) print('age:%s' % age) print() print_info('Bob', gender='male', age=20) print_info('Lisa',gender='female', city='Shanghai', age=18)