Python入门之函数

Python 函数

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

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

1、函数定义规则

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
  • 默认情况下,参数值和参数名称是按函数声明中定义的的顺序匹配起来的。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。

  语法:

def functionname( parameters ):
   "函数_文档字符串"
   function_suite
   return [expression]

  实例:

def print_item(items):
    """打印item到终端"""
    print(items)
    return

2、函数调用:

定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。

这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。

如下实例调用了print_item函数:

def print_item(items):
    """打印item到终端"""
    print(items)
    return
#直接调用或赋值后调用;2种调用方法都可以
print_item("chengd")
p = print_item
p("xrd")
执行结果:
chengd
xrd

3、函数地址:函数本身所在内存地址

def print_item(items):
    """打印item到终端"""
    print(items)
    return 100

print(print_item)
执行结果:
<function print_item at 0x00000000007FF048>

4、函数返回值:函数最后会有返回值,用于判断函数是否执行成功;默认不写return 返回None

#默认不写return
def print_item(items):
    """打印item到终端"""
    pass
    #print(items)
    #return 100
print(print_item("name"))
执行结果:
None
#指定return值
def print_item(items):
    """打印item到终端"""
    pass
    #print(items)
    return 100
print(print_item("name"))
执行结果:
100

5、函数参数

  • 形参和实参:
    • 定义函数时括号中参数就是形参;不指定具体值,仅仅表示调用函数时需要传入参数的顺序和个数
    • 调用函数时括号中传入的参数就是实参;代表传入函数的具体值;实参一一对应形参,如果数量不对则会报错
#形参a,b;表示调用函数需要2个参数a,b,第一个代表参数a,第二个代表参数b
def func(a,b):
    print(a)
    print(b)
#实参name,chengd;对应关系:形参a=实参"name",形参b=实参"chengd"
func("name","chengd")
执行结果:
name
chengd

#实参数量不对应形参数量则会报错
func("age")
执行结果:
Traceback (most recent call last):
  File "E:/s12/book/test.py", line 12, in <module>
    func("age")
TypeError: func() missing 1 required positional argument: 'b'

 

  • 默认参数:在创建函数时,形参指定具体值则为默认参数
    • 默认参数必须放在形参之后;
    • 调用函数时,实参按顺序对象形参,直至默认参数,否则将会报错;
    • 调用函数时,如果默认函数被重新指定值后,将会覆盖创建函数时指定的值;
#a表示形参;b表示默认参数,指定默认参数值为100
def func(a,b=100):
    print(a,b)


func(99)    #99代表实参
func(101,10)    #101代表实参,10代表重新被指定的默认参数值,覆盖看100
执行结果:
99 100
101 10

 

  • 指定参数:调用函数时,可以不按照形参和实参对应顺序传值
def func(a,b):
    print(a,b)


func(b=101,a=111)    #指定参数时,可以不按照形参实参对应关系传入值
执行结果:
111 101

 

  • 动态参数:可分为可变参数和关键字参数;
    • 可变参数:允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple;
def func_arg(*args):
    print(args,type(args))    #args代表传入参数整体

func_arg(1,2,3,4,5,6,)#调用函数查看args值及类型
执行结果: (1, 2, 3, 4, 5, 6) <class 'tuple'>

 

    • 关键字参数:允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict;
def func_kwarg(**kwargs):
    print(kwargs,type(kwargs))    #kwargs代表传入参数整体

func_kwarg(name="chengd",age=99,addr="Wuxi")    #调用函数查看kwargs值及类型;name/age/addr表示key,并且key不能加""否则报错;
执行结果:
{'age': 99, 'name': 'chengd', 'addr': 'Wuxi'} <class 'dict'>

 

    • 参数组合使用顺序:形参,默认参数,可变参数,关键字参数;顺序不能错误否则报错;
def func(a,b=2,*args,**kwargs):    #顺序是:形参,默认参数,可变参数,关键字参数
    print(a,b,args,kwargs)
    print(args,kwargs)
func(100,2001,2,3,name="chengd",age=99,addr="Wuxi")    
#实参值100,默认参数值2001覆盖了2;2,3是可变参数,其余是关键字参数
#Python解释器自动按照参数位置和参数名把对应的参数传进去
执行结果:
100 2001 (2, 3) {'name': 'chengd', 'addr': 'Wuxi', 'age': 99}
(2, 3) {'name': 'chengd', 'addr': 'Wuxi', 'age': 99}
#参数顺序错误情况大家可以自己测试下,这里不在举例

 

    • 对于动态参数是列表、元组、字典特殊情况:

      • Function(list,tuple,dict):函数调用时会把list/tuple/dict放在*args中当做单个元素处理

l = [1,2,3,4,5,6,7]
d = {'name': 'chengd', 'addr': 'Wuxi', 'age': 99}
t = (11,12,13)
def func_arg(*args):
    print(args,type(args))

func_arg(l,d,t)
执行结果:
([1, 2, 3, 4, 5, 6, 7], {'age': 99, 'addr': 'Wuxi', 'name': 'chengd'}, (11, 12, 13)) <class 'tuple'>    #列表,字典,元组当做一个元素处理

 

      • Function(*list|*tuple,**dict):函数动态参数会把*list|*tuple中的元素放在*args中处理;把**dict的元素放在**kwargs中处理

l = [1,2,3,4,5,6,7]
d = {'name': 'chengd', 'addr': 'Wuxi', 'age': 99}
t = (11,12,13)

def func_kwarg(*args,**kwargs):
    print(args,type(args))
    print(kwargs,type(kwargs))

func_kwarg(*l,*t,**d)
执行结果:
(1, 2, 3, 4, 5, 6, 7, 11, 12, 13) <class 'tuple'>
{'age': 99, 'name': 'chengd', 'addr': 'Wuxi'} <class 'dict'>

 

6、lambda匿名函数:

  • lambda只是一个表达式,函数体比def简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
  • lambda函数会将其表达式结果return

  语法:lambda *args expression

  实例:

sum = lambda a,b : a + b    #求2值相加之和的lambda表达式,lambda会将表达式结果return,可以通过print打印
print(sum(11,21))    
print(sum(110,121))

 

参考:http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001374738449338c8a122a7f2e047899fc162f4a7205ea3000

   

posted @ 2017-06-17 22:50  chengd  阅读(568)  评论(0)    收藏  举报