似水_流年

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、函数概念

函数是组织好的、可重复使用的,用来实现单一或相关功能的代码段

函数能提高应用的模块性和代码的重复利用率。Python提供了许多内建函数,也可以自己创建函数,这被叫做用户自定义函数

函数分类:内置函数、自定义函数

不使用函数的问题:组织结构不清晰、代码冗余、无法统一管理且维护难度大

 

二、定义函数

函数代码块以def关键词开头,后接函数标识符名称和圆括号()

任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数

定义函数的三种形式:无参(只执行一些操作)、有参(根据传进的参数执行相应的逻辑)、空函数(设计代码结构)

函数的第一行语句可以选择性的使用文档字符串用于存放函数说明

函数内容以冒号起始,并且缩进

return[表达式]结束函数,选择性的返回一个值给调用方。不带表达式的return相当于返回None

函数在定义阶段,只检测语法,不执行代码

语法:

def 函数名(参数列表):

    函数体

实例:

def hello():
    print('Hello World!')

hello()

 

三、 return语句

return [表达式] 语句用于退出函数,选择性的向调用方返回一个表达式。不带参数值的return语句返回None

一个函数没有return时则返回None,等同于return None

return跟一个值则返回该值,值没有数据类型限制

return跟多个值则返回一个元组

什么时候需要有返回值:

调用函数,经过一系列的操作,最后要拿到一个明确的结果,则必须要有返回值

通常有参函数需要有返回值,输入参数经过计算得到一个最终的结果

什么时候不需要有返回值:

调用函数,仅仅只是执行一系列的操作,最后不需要得到什么结果,则无需有返回值

通常无参函数不需要有返回值

实例:

def my_sum (arg1,arg2):
    total = arg1 + arg2
    return total

res = my_sum(10,20)
print(res)

 

四、函数调用的形式

1、语句形式,例:foo()

2、表达式形式,例:res=len('hello')

3、当做另一个函数的参数,例:range(len('hello'))

 

五、 函数的参数

函数的参数分两种:

  形参:函数中的参数

  实参:提供给函数调用的值

参数定义顺序:

  位置参数,默认参数,*args,命名关键字参数,**kwargs

参数赋值方式:

1、  位置参数:按照从左到右的顺序定义的参数,调用时的数量必须和声明时的一样

def foo(x,y):
    print(x)
    print(y)

foo(1,2)

2、  关键字参数:按照“参数名=参数值”的形式定义,参数的顺序可以与声明时不一致。需要注意的是:关键字实参必须在位置实参右边,对同一个形参不能重复传值

def foo(x,y):
    print(x)
    print(y)

foo(y=2,x=1)

3、  默认参数:调用函数时,如果没有传递参数,则会使用默认参数。需要注意的是:默认参数必须在位置形参右边,通常应该定义成不可变类型

def foo(name,age,sex='male'):                   #在定义阶段就已经为形参赋值了
    print(name,age,sex)

foo('zhangsan',age=18)
foo('lisi',age=20)
foo('wangwu',21,sex='female')                   #也可以为默认参数赋值

4、  可变长参数:针对实参在定义时长度不固定的情况,应该从形参的角度找到可以接收可变长实参的方案,这就是可变长参数(形参)。针对位置参数使用*args,关键字参数使用**kwargs

def foo(x,y,*args):                             #加了*号的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组
    print(x)
    print(y)
    print(args)

foo(1,2,3,4,5,6)

#执行结果如下:
1
2
(3, 4, 5, 6)
def foo(x,y,**kwargs):                          #加了**的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空字典
    print(x)
    print(y)
    print(kwargs)

foo(x=1,y=2,z=3,a=4,b=5,c=6)
 
#执行结果如下:
1
2
{'z': 3, 'a': 4, 'b': 5, 'c': 6}

扩展用法:

def foo(x,y,*args):
    print(x)
    print(y)
    print(args)

foo(1,2,*(3,4,5,6))                             #实际是:*args = *(3,4,5,6),结果为args = 3,4,5,6。可以简单拆开打回原形

#执行结果如下
1
2
(3, 4, 5, 6)
def foo(x,y,**kwargs):
    print(x)
    print(y)
    print(kwargs)

foo(x=1,y=2,**{'z':3,'a':4,'b':5,'c':6})

#执行结果如下:
1
2
{'z': 3, 'a': 4, 'b': 5, 'c': 6}

5、  命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传值

def foo(*args,y):
    print(args)
    print(y)

foo(1,2,3,4,5,y=6)

 

六、 函数对象

函数是第一类对象,即函数可以当做数据传递

1、  可以被赋值

def foo():
    print('Hello World!')

f = foo
f()

2、  可以当做参数传入

def foo():
    print('Hello World!')

def wrapper(func):
    func()

wrapper(foo)

3、  可以当做函数的返回值

def foo():
    print('Hello World!')

def wrapper(func):
    return func

res = wrapper(foo)
print(res)

4、  可以当做容器类型的元素

def foo():
    print('Hello World!')

dict = {
    'func':foo
}

dict['func']()
posted on 2017-07-20 09:48  似水_流年  阅读(192)  评论(0编辑  收藏  举报