>>> def foo():
def bar():
print ‘bar() is called‘
print ‘foo() is called‘
bar()
>>> foo()
foo() is called
bar() is called
>>> bar()
Traceback (most recent call last):
File "", line 1, in
bar()
NameError: name ‘bar‘ is not defined
因为bar()的作用域在foo()里面,在外面不能引用bar。
5、传递函数
1、其他变量可做函数的别名,因为对象的引用
所有对象都是通过引用来传递的,函数也不例外,当对一个变量赋值时,实际上是将相同对象的引用赋值给了这个变量。如果对象是函数的话,这个对象的所有别名都是可调用的。
def foo():
print ‘foo‘
bar = foo #函数对象的引用
bar() #函数对象的调用
#输出foo
注意:foo:函数对象的引用;foo():函数对象的调用
2、函数作为参数传入其他函数来调用
时刻要记住:函数对象、引用与调用的区别,这几个关键字眼。
def foo():
print ‘foo‘
def bar(argfunc):
print ‘in bar()‘
argfunc()
bar(foo) #把函数作为参数传入其他函数来调用
#输出:
#in bar()
#foo
局部变量argfunc就相当于函数对象foo的别名
在如下:
#内建函数int()/float()/long()转换、实现函数的传递与调用
def convert(argfunc,seq):
return [argfunc(obj) for obj in seq]
lis = [123,15.23,-6.2e5,99999999L]
print convert(int, lis) #[123, 15, -620000, 99999999]
print convert(float,lis)#[123.0, 15.23, -620000.0, 99999999.0]
print convert(long, lis)#[123L, 15L, -620000L, 99999999L]
6、Formal Arguments
1、位置参数
以函数定义的准确顺序来传递,如果没有任何默认参数的下,传入参数个数也要一致。
常见错误如下:
takes no arguments (1 given)
takes exactly 2 arguments (1 given)等等
2、默认参数
def foo(arg,default1 = ‘Python‘,default2 = ‘Django‘):
pass
每一个默认参数后面都紧跟一个默认值的赋值语句,如果在函数调用时没有给出值,则使用默认的值。
默认参数最好写在最后
3、关键字参数
def foo(arg,obj1=‘good‘,obj2=10):
return arg,obj1,obj2
print foo(arg=‘Begin‘) #(‘Begin‘, ‘good‘, 10)
print foo(‘Begin‘) #(‘Begin‘, ‘good‘, 10)
print foo(‘Begin‘,‘Python‘) #(‘Begin‘, ‘Python‘, 10)
#print foo(arg=‘Begin‘,100) #出错
print foo(arg=‘Begin‘,obj2=100) #(‘Begin‘, ‘good‘, 100)
print foo(obj2=100,arg=‘Begin‘,obj1=‘Ok‘) #(‘Begin‘, ‘Ok‘, 100)
7、可变长度的参数
1、变长参数与非变长参数
"""在参数名之前使用一个星号,就是让函数接受任意多的位置参数"""
def multiply(*args):
total = 1
for arg in args:
total+=arg
return total
print multiply() #1
print multiply(1,2) #4
print multiply(4,5,6) #16
"""python在参数名之前使用2个星号来支持任意多的关键字参数"""
def multiply2(**kwargs):
for key,value in kwargs.items():
print ‘%s=>%s‘ %(key,value)
multiply2()
multiply2(name=‘begin‘) #name=>begin
multiply2(name=‘begin‘,age=‘22‘,tel=110)
#顺序
def complex_function(a,b=None,*args,**kwarg):
pass
#测试
def add(a,b,c):
return a+b+c
print add(a=10,b=10,c=10)
args=(2,3)
print add(1,*args)#6
kwargs={‘b‘:100,‘c‘:200}
print add(100,**kwargs)#400
print add(a=100,**kwargs)#400
#print add(a=100,*args) #TypeError: add() got multiple values for keyword argument ‘a‘
print add(1,2,c=3)#6
print add(1,2,b=3)# add() got multiple values for keyword argument ‘b‘
三元表达式
为真时的结果 if 判定条件 else 为假时的结果
if 5>3 else 0
是先输出结果,再判定条件
输出1,如果5大于3,否则输出0