函数是什么
函数就是锤子,就是建好的工具.
函数分为内置函数 和自定义函数.
定义一个函数
def 函数名(参数1,参数2,参数3,...):
'''注释'''
函数体
return 返回的值
函数需要先定义在调用
定义阶段 def foo():
print('from foo')
bar()
def bar():
print('from bar')
#调用阶段 foo()
无参:应用场景仅仅只是执行一些操作,比如与用户交互,打印
有参:需要根据外部传进来的参数,才能执行相应的逻辑,比如统计长度,求最大值最小值
空函数:设计代码结构
#定义阶段 def test_tag(tag,n): #有参数 print(tag*n) def test_msg(): #无参数 print('hello world') #调用阶段 test_tag('*',12) test_msg() test_tag('*',12) ''' ************ hello world ************ ''' 结论: 定义时无参,意味着调用时也无需传入参数 定义时有参,意味着调用时则必须传入参数
空函数
def ls(dirname): ''' :param dirname: :return: ''' pass
函数的调用
函数的调用:函数名加括号 1 先找到名字 2 根据名字调用代码
函数返回值
无return->None return 1个值->返回1个值 return 逗号分隔多个值使用元组
函数调用的三种形式语句形式:foo()
表达式形式:3*len('hello')
当中另外一个函数的参数:range(len('hello'))
形参与实参
个人认为 形参就是函数def是那一行 def foo(x,y,z).如果最开始就把形参写入默认值 那么我们就说他是 默认参数 实参
关键字参数的标准是 :实参是 key, value形式
位置参数:按照从左到右的顺序定义的参数
位置形参:必选参数
位置实参:按照位置给形参传值
可变长参数:
可变长指的是实参值的个数不固定
而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,为了解决这个问题 位置*args,关键字**kwargs
def fun(a, *args):
... print "a is ", a
...print "args is ", args
>>> fun(11,12,34,43)
a is 11
args is (12, 34, 43)
拆数列、传位置参数意味着fun(*l)与fun(1,2,3)是等效的,因为l = [1,2,3]
命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参(k=v)的形式传递
1 对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查。 2 3 仍以person()函数为例,我们希望检查是否有city和job参数: 4 5 def person(name, age, **kw): 6 if 'city' in kw: 7 # 有city参数 8 pass 9 if 'job' in kw: 10 # 有job参数 11 pass 12 print('name:', name, 'age:', age, 'other:', kw) 13 但是调用者仍可以传入不受限制的关键字参数: 14 15 >>> person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456) 16 如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下: 17 18 def person(name, age, *, city, job): 19 print(name, age, city, job) 20 和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。 21 22 调用方式如下: 23 24 >>> person('Jack', 24, city='Beijing', job='Engineer') 25 Jack 24 Beijing Engineer 26 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了: 27 28 def person(name, age, *args, city, job): 29 print(name, age, args, city, job) 30 命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错: 31 32 >>> person('Jack', 24, 'Beijing', 'Engineer') 33 Traceback (most recent call last): 34 File "<stdin>", line 1, in <module> 35 TypeError: person() takes 2 positional arguments but 4 were given 36 由于调用时缺少参数名city和job,Python解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数。 37 38 命名关键字参数可以有缺省值,从而简化调用: 39 40 def person(name, age, *, city='Beijing', job): 41 print(name, age, city, job) 42 由于命名关键字参数city具有默认值,调用时,可不传入city参数: 43 44 >>> person('Jack', 24, job='Engineer') 45 Jack 24 Beijing Engineer 46 使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个*作为特殊分隔符。如果缺少*,Python解释器将无法识别位置参数和命名关键字参数: 47 48 def person(name, age, city, job): 49 # 缺少 *,city和job被视为位置参数 50 pass