Python 3 学习笔记 -- def 函数

一、def 函数基础知识

def 函数的定义

在 python 中,def 函数是用来定义一个 function() 的。

基本使用

def function_name():
    expressions

示例

下面我们定义了一个 function() 实现打印 a 的值。

def function():
    a=1+2
    print(a)

当我们运行的时候,输出框是不会输出任何信息的,为什么?

当我们定义了一个 function(),并不意味着我们要调用它,所以我们需要运行这个 function(),一个简单的办法就是在 input 框中输入 function()。


运行 function()

自调用

如果想要在执行脚本的时候执行一些代码,如单元测试,可以在脚本最后加上单元测试代码。但是该脚本做为一个模块对外提供功能的时候单元测试代码也会执行,这些往往都不是我们想要的,我们可以把这些代码加入到脚本最后。

if __name__ == '__main__':
    #code_here

如果执行该脚本的时候,该 if 判断语句将会是 True,那么内部的代码将会执行。 如果外部调用该脚本,if 判断语句则为 False,内部代码将不会执行。

利用自调用函数运行如上的 function() 进行测试。


自调用函数

函数参数

基本使用

当我们想要调用一个函数并往函数中传递变量,那么这些变量就是函数的参数。

def function_name(parameters):
    expressions

parameters 的位置就是函数的参数,在调用的时候传入即可。

示例

def func(a, b):
    c = a+b
    print('the c is ', c)

if __name__=='__main__':
    func(2,4)

在这里定义的一个函数 func,其参数就是两个数值 a,b,函数的功能就是把两个参数加起来。运行脚本后,在 main 函数中调用函数 func, 如果不指定参数 func(), 那么将会出错。

输出 func(2, 4),输出 the c is 6

运行结果

the c is  6

函数的默认参数

基本使用

我们在定义函数时有时候有些参数在大部分情况下是相同的,只不过为了提高函数的适用性,提供了一些备选的参数, 为了方便函数调用,我们可以将这些参数设置为默认参数,那么该参数在函数调用过程中可以不需要明确给出。

def function_name(para_1,..., para_n=defau_n, ..., para_m=defau_m):
    expressions

函数声明只需要在需要默认参数的地方用 = 号给定即可, 但是要注意所有的默认参数都不能出现在非默认参数的前面

示例

在这里定义了一个 sale_mac 函数,参数为 Mac 的属性,但除了 price 之外,像 color, brandis_touch_bar 都是有默认值的。

def sale_mac(price, color='silver', brand='macbook pro', is_touch_bar=True):
    print('price:', str(price)+"\n",
          'color:', color+"\n",
          'brand:', brand+"\n",
          'is_touch_bar:', is_touch_bar)

if __name__=='__main__':
    sale_mac(12000, 'silver', 'macbook pro', True)

运行结果

price: 12000
color: silver
brand: macbook pro
is_touch_bar: True

如果我们调用函数 sale_car(12000), 那么与 sale_mac(12000, 'silver', 'macbook pro', True)是一样的效果。

当然也可以在函数调用过程中传入特定的参数用来修改默认参数。通过默认参数可以减轻我们函数调用的复杂度。

if __name__=='__main__':
    sale_mac(12000, 'gray', 'macbook air', True)

运行结果

price: 12000
color: gray
brand: macbook air
is_touch_bar: True

二、def 函数进阶

可变参数

顾名思义,函数的可变参数表示传入的参数可以变化的,1 个到任意个。当然可以将这些参数封装成一个 list 或者 tuple 传入,但不够 pythonic

使用可变参数可以很好解决该问题,注意可变参数在函数定义不能出现在特定参数默认参数前面,因为可变参数会吞噬掉这些参数。

示例

def report(name, *grades):
    total_grade = 0
    for grade in grades:
        total_grade += grade
    print(name, 'total grade is ', total_grade)

if __name__=='__main__':
    report('report', 1,2,3,4,5)

定义一个函数,传入固定参数 name,可变参数 *grades,表明该参数是一个可变参数,这是一个可迭代的对象。

运行结果

report total grade is  15

关键字参数

关键字参数可以传入 0 个或者任意个含参数名的参数,这些参数名在函数定义中并没有出现,这些参数在函数内部自动封装成一个字典 (dict)。

示例

定义了一个函数,传入一个参数 name, 和关键字参数 kw,使用了 ** 修饰。表明该参数是关键字参数,通常来讲关键字参数是放在函数参数列表的最后。

def portrait(name, **kw):
    print('name is', name)
    for k,v in kw.items():
        print(k, v)

if __name__=='__main__':
    portrait('Mike', age=24, country='China', education='bachelor')

运行结果

name is Mike
age 24
country China
education bachelor

通过可变参数和关键字参数,任何函数都可以用 universal_func(*args, **kw) 表达。

参数组合

在 Python 中定义函数,可以用必选参数、默认参数、可变参数和关键字参数,这 4 种参数都可以一起使用,或者只用其中某些,但是参数定义的顺序必须是

必选参数 > 默认参数 > 可变参数 > 关键字参数。

示例

def func(a, b, c=0, *args, **kw):
    print ('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

if __name__=='__main__':
    func(1,2)
    func(1,2,c=3)
    func(1,2,3,'4','5','6')
    func(1,2,3,'4','5','6', d='7',e='8')

运行结果

a = 1 b = 2 c = 0 args = () kw = {}
a = 1 b = 2 c = 3 args = () kw = {}
a = 1 b = 2 c = 3 args = ('4', '5', '6') kw = {}
a = 1 b = 2 c = 3 args = ('4', '5', '6') kw = {'d': '7', 'e': '8'}

你还可以通过 tuple 和 dict 调用该函数

if __name__=='__main__':
    args = (1, 2, 3, 4)
    kw = {'x': 99}
    func(*args, **kw)

运行结果

a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}

总结

Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。

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

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,731评论 2 9
  • 当同一个功能、同一套算法等在多个地方重复使用,就要考虑把其抽成一个函数,在需要的地方调用即可。这样可以提高代码的复...
    TensorFlow开发者阅读 616评论 1 0
  • 第5章 函数和函数式编程 5.1 引言函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数...
    VIVAFT阅读 943评论 0 5
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,730评论 0 8
  • 老婆这段时间一直心里压抑,不想上班,总觉得跟老板不合,不愿意面对老板,面对工作,回家之后也不愿意面对我,一直与孩子...
    赛亚米业阅读 135评论 0 0