06--Python 函数与参数

@Author : Roger TX (425144880@qq.com)
@Link : https://github.com/paotong999

一、函数的理解

计算机语言的函数,其实和数学中的函数理解差不多

举个例子:
1.求圆的面积:S = πr2,这个计算公式按照数学的函数写法就是:f(x) = πx2
2.求数列的和:S = 1 + 2 + 3 + ... ,这个计算公式按照数学的函数写法就是:f(x) = ∑nn=1

在Python中,函数有以下特性

  • 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
  • 函数能提高应用的模块性,和代码的重复利用率。
  • Python提供了许多内建函数,但也可以自己创建函数,这被叫做用户自定义函数。

二、函数定义

定义一个由自己想要功能的函数,一般需要遵循以下规则:

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

实例

#!/usr/bin/python3

def area(width, height):
    return width * height
 
def print_welcome(name):
    print("Welcome", name)

print_welcome("Runoob")
print(area(4, 5))

三、函数调用

一个函数被定义后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。
Python内置了很多有用的函数,我们也可以直接调用,例如print()

要调用一个函数,需要知道函数的名称和参数。

比如求绝对值的函数abs,只有一个参数,可以在交互式命令行通过help(abs)查看abs函数的帮助信息。

实例

调用abs函数:

>>> abs(100)
100
>>> abs(-20)
20

四、函数的返回值

  • return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。
  • 函数执行完毕也没有return语句时,自动return None。
  • 不带参数值的return语句返回None。
  • 函数可以同时返回多个值,但其实就是一个tuple。

五、函数的参数

参数的定义

  • 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。
  • 对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的逻辑被封装起来,调用者无需了解。
  • 参数的分类:必须参数(位置参数)、默认参数、可变参数、关键字参数、命名关键字参数。

必需参数(位置参数)

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

def hello(name, age):
    print ('hello %s %s' %(name,age))

hello('tx',2)

默认参数

用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值。
注意
1、所有位置参数必须出现在默认参数前,包括函数定义和调用

def hello(name, age=2):
    print ('hello n%s a%s' %(name,age))

hello('tx')

可变参数

可变参数,顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。

def test_args(first, *args):  
   print ('Required argument: ', first)
   print ('args: ', args)
   for v in args:
      print ('Optional argument: ', v)
  
test_args(1, 2, 3, 4)  

如果已经有一个list或者tuple,要调用一个可变参数可以使用以下方式

nums = [1, 2, 3]
test_args(nums[0], nums[1], nums[2])
test_args(*nums)

关键字参数

可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
传入函数的关键字参数的参数名,不能同已有的参数名相同。

def func(**kw):
    print ('a=%s,b=%s,c=%s' %(kw['a'],kw['b'],kw['c']))

func(a=1, b=2, c=3)
dict = {'a':1, 'b':2, 'c':3}
func(**dict)

命名关键字参数

和关键字参数**kargs不同,命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数。
采用命名关键字参数可以限制函数传入的关键字参数,定义如下:

def testArg(city,name,*,age,job)

可以这样调用他

testArg('beijin','wfp',age='25',job='hoker')
testArg('beijin','wfp',addr='shanghai',age='25',job='hoker')

但是不能这样调用他

testArg('beijin','wfp','25',job='hoker')

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了

testArg(city,name,*args,age,job):

注意
1、命名关键字参数调用时,必须通过“键-值”形式加以指定。
2、命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。
3、命名关键字参数可以有缺省值。
4、命名关键字参数之间不存在先后顺序的**

def func(name, age, *args, sex=1, job):
    print (name, age, sex, args, job)

func('tx', 25, 'music', 'sport', job='it', sex=3)

参数的混合使用

基本原则是:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应遵循)

def func(name, age, *args, sex=1, **kw):
    print (name, age, sex, args, kw)

func('tx', 25, 'music', 'sport', sex=3, a=1, b=2)
def func(name, age, sex=1, *args, **kw):
    print (name, age, sex, args, kw)

func('tx', 25, 2, 'music', 'sport', a=1, b=2)

总结

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

推荐阅读更多精彩内容

  • 第5章 函数和函数式编程 5.1 引言函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数...
    VIVAFT阅读 955评论 0 5
  • 一、位置参数 例如我们写一个计算x²的函数: 对于power(x)函数,参数x就是一个位置参数。当我们调用powe...
    劉光軍_MVP阅读 267评论 0 1
  • Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参...
    luckybabying阅读 234评论 0 0
  • 1.函数参数 1.1 位置参数 我们先写一个计算x2的函数: 对于power(x)函数,参数x就是一个位置参数。当...
    时间之友阅读 372评论 0 2
  • 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正...
    Aedda阅读 281评论 0 1