Python的学习之旅———函数

函数是什么

函数就是锤子,就是建好的工具.

函数分为内置函数 和自定义函数.

定义一个函数

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
原文地址:https://www.cnblogs.com/surehunter/p/7561193.html