16、函数

一、简介

image

在 Python 中,函数是一等对象。编程语言理论家把“一等对象”定义为满足下述条件的程序实体:

  1. 在运行时创建
  2. 能赋值给变量或数据结构中的元素
  3. 能作为参数传给函数
  4. 能作为函数的返回结果

在 Python 中,所有函数都是一等对象,是面向对象程序设计最基本的单元

二、什么叫函数

1、定义

函数就是把完成特定功能的一段代码封装起来。给该功能起一个名字(函数名)

在一个完整的项目,某些特定的功能如果被返回使用,那么我们就可以把这些代码封装成函数,当我们要去使用的时候直接调用函数即可

2、优点

  1. 函数能提高应用的模块性,
  2. 方便管理和维护,便于复用

Python提供了许多内建函数,比如print() input()。但也可以自己创建函数,这被叫做用户自定义函数。

三、函数的使用

3.1、定义函数

1、语法格式

def 函数名( 形参列表… ):
    #函数体
    return [expression]

2、语法结构图

image

3、说明

  1. def 是定义函数的关键字。
  2. 函数名是这个函数的符号(引用),调用这个函数的时候我们需要函数名。
  3. 函数名后的圆括号是必须的。
  4. 形参列表表示我们可以定义多个形参,必须放在()中间,接受函数调用时传递过来的参数。形参不是必须的,根据需要决定是否需要定义形参
  5. 圆括号后面必须有一个分号:
  6. 函数体缩进四格,封装功能代码块,
  7. return [表达式] 结束函数,不是必须的,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
  8. 当一个文件定义多个函数的时候,函数与代码之间空两行

4、举个栗子

  1. 定义无参数无返回值的函数
    def show():
        "函数_文档字符串"
        print("自定义函数")
        print("我是函数内的代码2")
    
  2. 定义有参函数,无返回值的,形参在函数内部可以作为普通变量使用
    def add(a, b):
        #空四格
        print(a + b)
    
  3. 定义无参数有返回值的函数
    def get_name():
        name = '隔壁老王'
        return name
    
  4. 定义有参数有返回值的函数
    def add(n1, n2):
        num = n1 + n2
        return num
    

5、函数命名规则

  1. 可以由字母,下划线,和数字组成
  2. 数字不能开头
  3. 不能与关键字重名
  4. 函数名一般以动词开头
  5. 多个单词小写使用下划线拼接:get_name,set_name,is_delete

6、函数返回值

  1. 无返回值
    • 不写retrun
    • 仅retrun 不带返回值
    • 使用retrun 返回 None类型(返回对象)
  2. 返回一个对象
  3. 返回多个对象,其实就是返回一个元组,本质是还是一个对象

3.2、函数调用与引用

1、说明

定义函数的目的是为了让函数做一些事情。但是函数如果仅仅定义不会自己去执行。

时刻记住一句话,函数只有被调用才能被执行!

所以想要函数执行,必须显示的去调用函数。

在使用函数的时候,一定要保证声明在前,调用在后!

2、语法格式

函数名(实参)

3、举个栗子

  1. 调用无参函数
    def show():
        print("自定义函数")
        print("我是函数内的代码2")
    show()
    
  2. 调用有参的函数
    def add(a, b):
        print(a + b)
    add(1, 2)
    
  3. 调用有参的函数并返回数据
    def add(n1, n2):
        num = n1 + n2
        return num
    number = add(1,2)
    print(number)
    
  4. 在函数调用时也可以使用*语法,来分解参数的集合
    def func(a,b,c,d):  
        print a,b,c,d  
    func(*(1,2,3,4))  
    func(1,*(2,3),**{'d':4})  
    func(1,c=3,*(2,),**{'d':4}) 
    

4、注意事项

  1. 函数的引用
    所谓的函数的引用其实就是将一个函数对象赋值给变量,一个函数个可以赋值给多个不同变量
  2. 栗子1
    def func():
        print('函数引用')
    func1 = func
    func2 = func
    func3 = func
    # 实际就是想相当于func()
    func1()
    func2()
    func3()
    

四、 参数详解

1、说明

除了支持正常的参数外,Python函数还支持数量可变的参数。这些参数有主要有三种类别

完整的语法

def fun(position_arg, keyword_args,defalut_args, *tuple_args, **dict_kw_args):
    pass

简要说明:

  1. position_arg

    位置参数(必须参数)。必须参数必须以对应的关系一个一个传递进入函数,函数调用时传递的实参必须和函数定义时的形参一一对应,不能多也不能少,顺序也得一致

  2. keyword_args

    关键字参数。指的是调用的时候可以使用参数名的方式传入,特点是传入的时候可以不需要按着顺序出传入

  3. defalut_args

    默认值参数 ,非必传参数 声明了默认值的参数

  4. *tuple_args

    可变长度参数,特点,只能接收未命名的参数,把这些参数先封装到一个列表或元组中

  5. **dict_kw_args

    可变长度参数,特点是将参数放入字典中

2、 默认参数值

2.1、说明

这允许用户为函数的参数定义一些默认值。这种情况下,可以以更少的参数来调用该函数,而函数调用时未提供的参数,Python会使用默认提供的值作为这些参数值

2.2、举个栗子

  1. 栗子1
    def show_args(arg, agr1,def_arg=1, def_arg2=2):
        return "arg={}, def_arg={}, def_arg2={}".format(arg, def_arg, def_arg2)
    

2.3、调用方式(三种)

  1. 只提供非缺省位置参数值
    def show_args(arg, def_arg=1, def_arg2=2):
          return "arg={}, def_arg={}, def_arg2={}".format(arg, def_arg, def_arg2)
     show_args("普通参数")
      #指定参数名称 
     show_args(arg="普通参数")
    
  2. 提供的值覆盖一些默认的参数值,包括非缺省位置参数
    def show_args(arg, def_arg=1, def_arg2=2):
          return "arg={}, def_arg={}, def_arg2={}".format(arg, def_arg, def_arg2)
    show_args("普通参数", "默认参数1")
    
  3. 为所有参数提供值,可以用这些值覆盖默认参数值
    def show_args(arg, def_arg=1, def_arg2=2):
          return "arg={}, def_arg={}, def_arg2={}".format(arg, def_arg, def_arg2)
    show_args(arg="普通参数", "默认参数1", "默认参数2")
    

2.4、注意事项

  1. 必选参数在前,默认参数在后
  2. 有默认值的参数在调用的时候是非必要的

3、关键字参数(kwarg)

3.1、说明

关键字参数是实参里面的概念,以“kwarg=value”的形式使用关键字参数也可以调用函数。其中kwarg指函数定义中使用的参数名称,在调用函数的时候声明某个参数是属于某个关键字的。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
举个栗子

  1. 栗子1
    def f(name,age):
       print(name,age)
    f(name="小明",18)
    

4、默认值参数

4.1、说明

默认参数是在函数声明的时候,可以给某个参数指定默认值,这样的参数叫做默认值参数。如果在调用函数的时候,默认参数没有接收到对应的实参,那么就会将默认值赋值给这个参数

4.2、举个栗子

  1. 栗子1
    def f(name,age,sex="男"):
        print(name,age,sex)
    f(name="小明",18)
    

5、不定长参数(*args)

5.1、说明

通常情况下, 定义函数的时候, 我们只能定义有限的形参个数, 实参个数通常情况下也要和形参来定义.

如果我们想传递任意多个参数给函数, 只能把这些参数先封装到一个列表或元组中, 然后再传进去. 比较麻烦.

python 提供了可变参数, 可以接受任意多个参数, 然后函数内部会自动的把这些参数封装在一个元组中, 供函数内部使用,注意*args只能接受位置参数

5.2、举个栗子

  1. 栗子1
    def fun(*args):
        print(args)
    fun("小明",18,"male")
    
  2. 栗子2
    def fun(*args):
        return args
    fun("小明",18,"male")
    

5.3、注意事项

  1. 函数的形参中最多只能定义一个可变参数, 定义多个可变参数会出现语法错误.
  2. 可变参数一般作为形参中的最后一个参数.
  3. 如果可变参数不是最后一参数, 则给可变参数后的参数赋值的时候只能使用关键字参数赋值

6、不定长参数( **kwargs)

6.1、说明

但是上面的args只能接收未命名的参数,那假如有类似于关键字参数的不定长参数该怎么办呢?python里面使用(变量名)来接收不定长的命名变量参数。同样,python里面也约定俗成使用kwargs接收不定长命名参数。**kwargs接收了不定长参数之后,将这些参数放到一个字典里面,可以通过key获取到相应的参数值

6.2、举个栗子

  1. 栗子1
     def f(**kwargs):
         print(kwargs)
     f(name="小明",age=18,sex="male")
    

五、综合

1、说明

假如一个函数使用了上面所有种类的参数,那该怎么办?为了不产生歧义,python里面规定了假如有多种参数混合的情况下,遵循如下的顺序使用规则

def fun(必须参数,默认参数,*args,**kwargs):
    pass

2、举个栗子

  1. 栗子1
    def f(*args,**kwargs):
         print(args)
         for i in kwargs:
             print("%s:%s"%(i,kwargs[i]))
     f(*[100,200,300],**{"a":'abc',"b":31231})
    

3、注意事项

函数在执行过程中只要遇到return语句,就会停止执行并返回结果,也可以理解为 return 语句代表着函数的结束 如果未在函数中指定return,那这个函数的返回值为None,return多个对象,解释器会把这多个对象组装成一个元组作为一个一个整体结果输出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容