7. 函数的参数

[TOC]

函数

为什么要定义函数

  1. 代码冗余
  2. 不方便管理,维护性差
  3. 组织结构差

函数分类

内置函数

https://docs.python.org/3/library/functions.html#abs

自定义函数

def func_1():
    #func_1 function
    pass

print(func_1.__doc__)
用于显示函数注释

函数也分有参函数和无参函数,
定义时有参数,就需要传入参数;
定义时没有参数,就不需要传入参数
这其中还涉及到默认参数等,在下文的参数中详解

返回值/返回函数

函数的返回值可以是任何类型

当函数没有return ,返回的是None

这也是有些函数运行之后,会在解释器中返回一个NONE的原因

函数返回值

#return
def bar (x,y):
    return 1,2,3

单个函数只能执行一次return,return就类似一个break一样,给出一个结果并且结束程序
上面函数的返回值为一个元组(1,2,3)

python在默认使用“,”的时候,会构建一个元组

当你需要逐个获取返回值的时候

a,b,c = bar(x,y)
>>>
a=1
b=2
c=3

以上就是一种获取返回结果的方法,这种情况用于接收多个由函数生成的值。

范例:

a,*_,b = 'thisisastring'
a = t
b = g

返回函数

有时候在函数定义完之后,发现并不需要立即传参进行计算,而是在后面的代码中,根据需要再进行计算。
这时候就可以不返回计算的结果,而是返回计算的函数:

def lazy_max():
    def max(a,b):
        if a>b:
            print(a)
        elif a<b:
            print(b)
        else:
            print(a,'=',b)
    return max

print(lazy_max()(1,5))

相关参数和变量都保存在返回的函数中,这种称为闭包(closure)

闭包

之前在装饰器的笔记里写到过闭包,但是那时候的理解还在猜测阶段,没有一个清晰的定义。
所以在这里重新声明一下:
闭包就是把相关参数和变量都保存在返回的函数中,当一个函数返回一个函数后,其内部的局部变量还被新函数引用,返回的函数也没有立即执行,直到调用了()才执行

在python中,被定义过的函数名(如果不需要传参)后直接跟上()就能将函数运行起来。甚至在这个函数名被赋值给其他的变量后,获得赋值的变量也同样有这种特性

>>> def func():
...     print('hello babe')
...
>>> z = func
>>> z()
hello babe

函数的参数介绍

在函数定义阶段,括号内定义的参数,就是形参
在函数调用阶段,括号内定义的参数,就是实参

一定要注意函数的两个阶段,定义阶段不运行,不会给出结果,也不做任何操作。

其实以上的定义也并不完全准确。真正的形参和实参有更加准确的描述,上述描述在例如x=23这种情况下就不适用,因为赋值的时候并不涉及到函数。

位置参数

这个概念比较粗糙,其实大部分存在的参数,我们都可以考虑叫他位置参数(由于在python中按位置传参的确很方便,也很普遍)。在有参函数中,如果不指定特定的关键字,甚至有默认的关键字参数,在不添加关键字的时候,默认按照位置参数来进行传参。

根据位置传值,必须在关键字参数前面!!!并且只能使用一种方式对同个参数进行传值,必须进行传值,需要准确传值,参数不能多也不能少。

按位置传值

比方说:

def power(x,n):
    s = 1
    while n>0:
        n=n-1
        s = s*x
    return s

这是一个修改后的power()函数,可以计算任意的n次方
这其中有两个参数,power(x,n),这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给x,n

默认参数

power(5)
TypeError: power() missing 1 required positional argument: 'n'

报错:缺少一个参数
默认参数:调用时,无需传值

def power(x, n=2):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

以上代码,我们在定义阶段就默认定义n=2,从而在真的使用该函数的时候。当我们默认使用单个参数的时候:

>>>power(5)
25

定义函数的时候,我们使用默认参数来定义一些,变动比较小的参数,可以在传参的时候节省力气。
定义规则:当函数有多个参数的时候,把变化大的参数放在前面,变化小的参数放在后面

可变参数

*args``**kw

def calc(number):
    sum = 0
    for n in number:
        sum = sum+ n*n
    return sum

在使用上面的函数的时候,我们传入的num因为需要被迭代,所以num的类型必须是list或者tuple

例如calc([1,2,4,5,3,8])

如果使用可变参数,调用的方式就会简单很多:calc(1,2,5,43,8)

所以我们可以修改函数定义参数为可变参数

def calc(*numbers):
    pass

这里比较需要注意的就是,位置参数和可变参数的混用。

def calc(x,y = 1,*numbers):
    pass

calc(1,2,4,5,7,8,6,3,8,2,4,5)
可以发现,x,y原本是默认值,被传参之后,取得了1,2,而剩下的数字,被作为一个元组,合并进了numbers

>>> def calc(x,y = 1,*numbers):
...     print(x)
...     print(y)
...     print(numbers)
...
>>> calc(1,2,4,5,78,8,6,3,5)
1
2
(4, 5, 78, 8, 6, 3, 5)

著名鲁派清口导师egon曾经说过:‘*’后面的可变参数,在使用的时候,就把其中的元素打散了看。

从实参的角度进行测试

>>> def bar(x,y,z):
...     print(x)
...     print(y)
...     print(z)
...
>>> bar(*(1,2,3,4))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bar() takes 3 positional arguments but 4 were given

上述我们已经使用了*args,会把后面的按位置传值的参数整合成一个tuple
而**kwargs,就是把后面的关键字传值的参数整合成一个dict

>>> def bar(x,y,z):
...     print(x)
...     print(y)
...     print(z)
...
>>> bar(*(1,2,3,4))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: bar() takes 3 positional arguments but 4 were given



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

推荐阅读更多精彩内容