Python 函数

Python函数概述

几乎每种编程语言都有函数,Python中函数也是非常重要的内容。通俗讲Python中函数是一段代码,并给这段代码起个名字,通过名字来使用这段代码(调用)。

为什么需要函数呢?

看个例子,当我们程序中多个地方都要使用功能相同的一段代码时怎么处理呢?是每个使用这段代码的地方都复制一份吗?如图:

图:代码复制与复用

例子简单给出两种方法:

每个用到的地方都复制一份;

把这段代码放到一个地方,使用时都执行这段代码,这段代码执行完毕,继续执行其他处理。

如果把代码复制多份:

1、增加了代码量(占用更多的内存);

2、如果需要修改代码,比如把 a > b 改成 a

方法二改善了这种情况,方法二的缺点是增加代码的跳转,对于流水线执行的指令来讲,会降低效率,这种降低大多数情况可以忽略不计,整体而言优点大于缺点。采用函数就可以实现方法二的效果。

采用函数的好处:代码模块化设计,提高可读性;提高代码复用率;提高开发效率;使代码便于维护,降低出错率等等。

Python 函数分类:Python函数可分为,Python内建函数、开发者自己编写的函数、其他开发者编写的函数。另外,Python中对象的方法其实也是函数。

学习Python函数主要需要了解:定义函数(创建对象),使用函数(调用)两方面内容。

使用函数称为函数调用,调用函数需要遵循函数的使用规则。如之前使用过的函数:

print("Hello Python")

r = len([1, 2, 3])

a = [1, 2, 3]

a.append(4)

print(),len(), a.append() 都是函数,上面都是函数调用。

Python函数的几个要素:函数名、函数参数、函数返回值。

Python 函数定义

Python使用关键字 def 定义函数,ŸPython自定义函数语法:

1、def 必须写(大小写一致)

2、函数名要有,用户自定义,命名规则同变量(标识符命名规则),通常建议:小写字母+下下划线,如: goods_add()

3、() 必须有,英文

4、: 必须有,英文

5、参数列表:可选

6、"函数文档字符串":可选,如有需要缩进

7、语句块:至少一条语句,可以使用pass,需要缩进

代码示例:

PythonŸ调用函数:

调用语法:

[变量] = 函数名([实参列表])

变量 =:可选,需要接收函数返回值时,否则 变量 = 均不需要。

函数名:必须有,需要和定义时一致包括大小写。

():必须要有,英文。

实参列表:可选,这个情况多些,后续说明。

示例:

print("Hello Python")

r = len([1, 2, 3])

a = [1, 2, 3]

a.append(4)

示例2:

函数创建、调用说明:

1、定义是函数创建对象(可执行对象,callable()),并不执行

2、调用时执行,从调用处跳转到函数代码

3、函数执行到最后一条语句则返回调用处,继续执行下一条语句,或者执行到return 语句结束执行,返回调用处,继续执行下一条语句。

return 语句

函数返回语句,只要执行到return语句,函数即结束运行,返回调用处。

return 语句语法:

return [表达式]

表达式:可选,有表示函数返回的值(对象),可以是 None,没有时等同None。

示例:

带参数的函数定义举例:

几点说明:

定义函数时,需要确定函数名和参数个数

参数可以没有(根据需要确定)

如果有必要,可以检查参数的合法性(后续讲解)

函数必须先定义,再使用

Python函数声明和定义可以看作一回事

函数体内部可以使用 return

return 可以返回值,有可以不返回值

return 可以随时出现函数体中,执行return即返回,后续语句不再执行

函数执行完毕也没有return语句时,自动 return None

函数可以同时返回多个值,但其实就是一个元组。

Python函数参数

Ÿ形参与实参的概念:

函数定义时,参数列表中的参数为形式参数

函数调用时,给定的参数为实参

图-形参实参

Python函数参数传递:

传递方式有,位置传参、序列传参;

关键字传参、字典关键字。

Ÿ位置传参:

调用函数时,给定的实参个数和位置均需和定义时的形参相符。

Ÿ位置传参(序列传参:元组传参,*())

元组元素个数和参数个数相同

对应位置上的元素类型和函数参数类型相同

Ÿ位置传参(序列传参:列表传参,*[])

Ÿ位置传参(序列传参:字符串传参,*字符串)

Ÿ关键字参数

关键字传参是从调用角度来说的,调用函数时以名字给形参传递实际的对象值

调用时实参和形参按名字匹配,不按位置匹配。

代码示例

测试以下调用:

#位置传参

print_str(1, 2, 3)

#关键字传参

print_str(b = 2, c = 3, a = 1)

print_str(c = 3, a = 1, b = 2)

print_str(1, c = 3, b = 2)

#正确?

print_str(c = 3, a = 1)

Traceback (most recent call last):

File "

", line 1, in

print_str(c = 3, a = 1)

TypeError: print_str() missing 1 required positional argument: 'b'

print_str(a=1, 2, 3)

File "", line 1

SyntaxError: positional argument follows keyword argument

print_str(1, c = 3, 2)

SyntaxError: positional argument follows keyword argument

Ÿ关键字参数(通过字典进行传参 **字典)

Ÿ位置参数、关键字参数小结

函数位置传参和序列传参可以混合使用,个数,类型

print_str(100, *[200, 300]) # 正确

print_str(*[100, 200], 300) # 正确

print_str(*[100], *[200], *[300]) # 正确

print_str(*[100], 200, *[300]) # 正确

print_str(*[100], 200, *[300]) # 正确

函数位置传参和关键字参数传参可以混合使用

print_str(100, c = 300, b = 200) # 正确

print_str(c = 300, b = 200, 100) # 错误

函数位置传参和字典传参可以混合使用

print_str(100, **{"c" : 300, "b" : 200})

print_str(**{"c" : 300, "b" : 200}, a=100)

在实参能唯一匹配到相应形参的情况下可以任意组合

函数的缺省参数

缺省参数语法:

注:

1、函数参数可以不采用缺省参数,如之前的例子,也可以有多个(可以全部都是)。

2、缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数。

示例:

图:缺省参数示例

示例2:

图:一旦出现缺省,后面都要缺省

图:一旦出现缺省,后面都要缺省

参数个数可变函数:

如之前学过的print函数,函数的参数个数是可以变化的,我们自定义的函数也可以很简单的实现函数参数个数可变。

1、*() 即 *元组 方式:

以元组方式实现函数参数个数可变。

2、**{} 即 **字典 方式:

以字典的方式实现参数个数可变函数。

3、参数可变(混合式):

采用元组,字典混合使用,实现参数个数可变函数。

命名关键字参数

图:问题

上例,函数期望要求kw输入中有 school和address两个关键字参数,但是实际调用时,不给的这两参数函数也会调用,这不是期望的。如何解决这个问题呢?命名关键字参数可以解决这个问题。

*号之后的参数,name1,name2就是命名关键字参数,函数调用时不指定 name1,name2就报错。

注:命名关键字参数和位置参数不同

示例:

函数小结:

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

2、默认参数一定要用不可变对象

3、要注意定义可变参数和关键字参数的语法

*args是可变参数,args接收的是一个元组

**kw是关键字参数,kw接收的是一个字典

4、调用函数时如何传入可变参数和关键字参数:

可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))

关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})

def 语句实时运行

def 语句实际上是可执行的,当他运行时候,他创建一个新的函数对象,并将其绑定到一个变量名。

def 语句可以出现在其他任何语句出现的地方。

函数嵌套:

Python函数可以嵌套,实时运行另外一个例子。

函数变量

可以把函数名赋值给变量,通过变量调用函数。

一切皆对象!

函数做实参

可以把函数名赋值给变量,通过变量调用函数位置传参。

函数做返回值:

函数可以作为函数的返回值。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180227A0KGJ300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券