6-函数

函数

函数的英文单词:function

在计算机中称之为函数
在显示生活中称之为功能

函数是能够实现特定功能的计算机代码而已,他是一种特定的代码组结构。

函数的作用

1.提升代码的重复利用率,避免重复开发相同代码

2.提高程序开发效率

3.便于程序维护

函数的定义

1.基本格式:

def  函数名():
    函数功能代码...
    函数功能代码...
    ...


调用函数: 函数名()

特征:函数定义之后不会自动执行,必须在调用函数后函数才会执行.

函数名的命名规则:和变量基本一样

1.推荐使用英文或者拼音,禁止使用中文
2.可以使用数字,但是不能用数字开头
3.不可以使用特殊字符,除了_
4.函数名严格区分大小写
5.函数名必须要有意义。
6.不能和系统已经存在的保留关键字冲突!

7.禁止使用和系统提供函数相同的函数名

2.带有参数的格式:

def 函数名(参数,参数...):
    函数功能代码...
    函数功能代码...
    ...
    

调用函数:函数名(参数,参数...)


形参:形式上的参数,声明函数时()中的参数是形参
实参:实际上的参数,调用函数时()中的参数是实参

注意:实参将值传递给形参的过程本质上就是简单的变量赋值仅此而已

3.带有默认值的参数

def 函数名(形参=默认值,形参=默认值...):
    函数功能代码...
    函数功能代码...
    ...

调用函数:
    函数名()  调用函数时所有形参采用默认值操作
    函数名(实参,实参...) 调用时形参使用实参的值而抛弃默认值

注意:在此情况下使用实参值覆盖原有形参的默认值,本质上就是变量的重新赋值操作

4.关键字参数

def 函数名(形参=默认值,形参=默认值...):
    函数功能代码...
    函数功能代码...
    ...

调用函数:函数名(形参=实参,形参=实参...)

关键字参数就是调用函数时,在实参前面指定形参的做法,为了防止参数按照位置传递出现的错误

5.收集参数

1.非关键字收集参数

def 函数名(*参数名):
    函数功能代码...
    函数功能代码...
    ...

调用函数:函数名(实参,实参...)   没有数量限制

特征:
1.非关键字收集参数,在形参前添加一个*即可
2.非关键字收集参数收集实参组成一个元组
3.非关键字收集参数,仅收集没有任何形参接受的非关键字实参
4.非关键字收集参数和普通的形参可以共存

2.关键字收集参数

def 函数名(**参数名):
    函数功能代码...
    函数功能代码...
    ...

调用函数: 函数名(形参=实参,形参=实参...) 没有数量限制

特征:
1.关键字收集参数,在形参前添加两个**即可
2.关键字收集参数,收集的结果组成一个字典,关键字成为字典的键,实参成为值
3.关键字收集参数,仅收集没有任何形参接受的关键字参数
4.关键字参数可以和普通的形参共存

多种参数混合

定义函数时尽量避免多种参数格式混合(普通参数/非关键字参数,关键字参数,非关键字收集参数,关键字收集参数)

1.普通参数(非关键字参数)和关键字参数必须在两种收集参数之前
2.非关键字收集参数,必须在关键字收集参数之前
3.如果多种参数在一起,必须注意进制参数多次赋值操作(相同赋值赋值之后,关键字参数在此赋值!)

关于返回值的问题

函数根据执行完毕是否可以得到一个结果,将函数分为2个类型:

执行过程函数:print()

    函数执行完毕之后,不会有任何结果可以被接受的函数。

具有返回值的函数:id(),type()

    函数执行完毕之后,会产生一个结果,可以被变量接受或者使用的函数

格式:

def 函数名(参数....):
    函数功能代码...
    函数功能代码...
    ...

    [return 语句]

return的特征:

1.具有return语句的函数称为具有返回值的函数
2.return可以为当前函数执行完毕返回一个结果,这样的函数调用可以被接受
3.return执行之后,函数则会终止,所有return之后的语句不会被执行
4.一个函数可以书写多个return语句,但是一般会放入分支结构当中。
5.一个函数如果需要返回多个数据,需要借助复合数据类型(list,tuple,set,dict)来操作即可!

函数文档

函数文档就是用来查看当前函数相关信息介绍的一个特定格式而已。

查看函数文档的方法:

help(函数名称)

    直接输出显示函数文档的内容字符串

函数名.__doc__ 

    直接输出显示函数文档的内容元字符串(转义字符不转义)

定义函数的文档:

def 函数名(参数...):
    '''
        在此处声明函数文档

    '''

    函数功能代码...
    函数功能代码...
    。。。

或者:

def 函数名(参数...):
    """
        在此处声明函数文档

    """

    函数功能代码...
    函数功能代码...
    。。。

注意:函数文档的作用是对函数进行说明,便于阅读和快速掌握函数的使用,通常函数文档需要具有以下信息:

函数的作用
函数的参数介绍(个数,数据类型)
函数的返回值(数据和类型)

变量的作用域

变量的作用域就是指变量的有效范围。

变量按照作用范围分为2类:

全局变量 

    在函数外部声明的变量就是全局变量(在函数内部需要global关键才可以使用)

局部变量

    在函数内部声明的变量就是局部变量

全局变量和局部变量的有效范围:

1.全局变量在函数外部可以正常使用
2.全局变量在函数内部也可以正常使用(需要global声明)
3.局部变量在函数内部可以正常使用
4.局部变量在函数外部不可以被访问

global关键字

将局部变量提升为全局变量

格式:

    def 函数名():
        #提升局部变量为全局变量
        global 变量名
        
        函数的其他功能代码...
        ...

注意:只有在函数内部使用global关键字对变量进行全局声明,该变量才是一个完整的哦全局变量,在函数内外可以进行任意获取修改删除等操作。

内部函数

在函数内部声明的函数就是内部函数。

特征:
1.内部函数的本质就是局部变量(函数就是一个变量)
2.内部函数在函数外部不可以直接调用
3.内部函数在函数内部调用必须在定义了内部函数之后才可以调用

闭包

想办法将局部变量引入到全局环境中可以使用,这就是闭包操作

闭包方法1:

def 函数名():

    局部变量1
    局部变量2
    ...

    def 内部函数1():
        pass

    def 内部函数2():
        pass
    ...

    return (局部变量1,局部变量2,...内部函数1,内部函数2....)

闭包方法2:

def 函数名():

    局部变量1
    局部变量2
    ...

    def 内部函数1():
        pass

    def 内部函数2():
        pass
    ...

    #获取/收集所有需要进行闭包操作的内部函数和变量
    def all():
        return (局部变量1,局部变量2,...内部函数1,内部函数2....)

    return all

闭包的优缺点:

优点:

    1.可以方便的进行函数式编程,组织程序代码
    2.使得局部变量和内部函数在外部可以访问

缺点:
    1.闭包操作会导致整个函数的内部环境,被长久保存,占用大量内存。

闭包环境查看:__closure__

用于查询当前闭包操作所使用的环境中的变量和内部函数等信息

nonlocal

nonlocal关键字的意义,不是局部变量,当然他也不是全局变量,通常用于内部函数中使用外部函数的局部变量。

#声明一个外部函数
def outer():

    #声明一个变量(肯定不是全局变量)
    x = 5
    
    #声明一个内部函数
    def inner():
        nonlocal x#声明x不是局部变量
        x += 9
        print(x)

    #调用函数
    inner()



#调用outer
outer()

注意:如果内部函数想使用全局变量,那么应该使用global声明变量(函数最外层的全局变量)
如果内部函数使用的是外部函数的局部变量,那么应该使用nonlocal声明(内部函数的外层,外部函数的局部变量)

lambda表达式

lambda表达式是一种简洁格式的函数。该表达式不是正常的函数结构,而是属于表达式的类型。

基本格式:

lambda 参数,参数...:函数功能代码

例如:lambda x,y:x + y     获取2个值的和的lambda函数

带分支格式:

lambda 参数,参数... :值1  if 条件表达式  else 值2

例如:lambda sex : '有胡子' if sex == 'man' else '没胡子'

调用函数格式:

lambda 参数,参数...:其他函数(...)

例如:lambda x:type(x)

lambda表达式的优缺点:

优点:

    书写简单不需要def 关键字
    不需要费脑子想函数名(匿名函数)
    看起来高大上!


缺点:
    
    lambda表达式功能受限,无法使用循环和多项分支
    复杂的操作,不适合lambda表达式

递归函数

在函数内调用当前函数本身的函数就是递归函数。

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

推荐阅读更多精彩内容