Python 函数

函数(functions)是指可重复使用的代码片段。可以给这个代码片段起一个名字,通过这个名字可以在程序的任意位置使用该代码片段的功能。 函数在维基百科上的解释如下

函数这个数学名词是莱布尼兹在 1694 年开始使用的,用来描述跟曲线相关的一个量,如曲线的斜率或者曲线上的某一点。莱布尼兹所指的函数现在被称作可导函数,数学家之外的普通人一般接触到的函数即属此类。对于可导函数可以讨论它的极限和导数,此两者描述了函数输出值的变化同输入值变化的关系,是微积分学的基础。中文的“函数”一词由清朝数学家李善兰译出。其《代数学》书中解释:“凡此变量中函(包含)彼变量者,则此为彼之函数”。

函数事实上更像是一个帮助我们来完成各种功能的工具,大多数时候我们无需知道函数的实现细节,只需要给定输入获取输出的结果即可。就想我们现在使用的手机大多数人都不了解手机是如何制造出来的,但是这并不影响我们的使用,我们只是将它当做一个工具来使用。同样我们也可以将函数看做是一个来实现相关功能的工具,只是这个工具有时需要我们自己来实现而已。本章主要来学习如何使用 python 来实现这个称谓函数的工具。

函数的定义

在 python 中函数的定义格式如下

def 函数名称(参数列表):
   函数体

如上所示在 python 中定义一个函数需要使 def 语句,一次写出函数名称、括号、括号中的参数列表和冒号,然后使用缩进块编写函数体。

无参数函数

定义一个不含参数的函数,在 def 语句的括号内直接留空即可,如下所示

def say_hello():
   print('Hello world')

调用以上函数,系统将打印 Hello World 。

在编写程序的过程中,往往在未想好如何实现一个函数时,需要先写出函数的名称(API)来使程序能够正常运行,然后再进一步 完善函数的功能,此时我们可以使用 pass 语句来定义一个空函数。

def nop():
   pass

pass 语句仅仅是一个占位符,实际上他并未完成任何的工作,但是缺少了 pass 语句程序将报错。

函数名的命名规则要符合 Python 中的命名要求。一般用小写字母和单下划线、数字等组成。

含有参数的函数

在大多数情况下,我们定义一个函数式想要函数依据我们的输入执行相应的动作或输出相应的结果,这里的数据既我们称为函数的参数,在 python 中可以使用以下格式来定义一个含有参数的函数

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

def max(a, b):
   if a > b:        
        return a    
    else
       return b
       
       
print(max(1, 3))
print(max(5, 2))

在以上代码中定义了一个 max 函数含有 a 和 b 两个参数,并返回 a 和 b 中比较大的一个。

在以上代码中我们还进行了函数调用 max(1, 3) 和 max(5, 2) 即函数的调用,调用函数可直接使用函数名称、括号,在括号内写入向函数中输入的参数「若为无参数函数,括号内为空」。

默认参数函数

某些情况下,你可能想要省略一部分的参数输入,此时你可以使用默认参数。在函数定义时可以通过给参数赋值来为参数提供一个默认值。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

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

在以上示例中我们定义了一个乘方函数,我们设置了 n 的默认参数为2,表示此函数默认计算的是 x 的平方。从函数的调用中我们可以看书,当我们需要计算一个数的平方时在调用函数时可以直接省略 n 的值。在我们需要计算的其他次方时又可以通过输入 n 的值来获取正确的结果。

注意,在顶一个含有默认参数的函数时需要注意一下事项:

  1. 必选参数在前,默认参数在后,否则Python的解释器会报错
  2. 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数可以设置为默认参数。

可变参数函数

在 python 中我们还可以定义可变参数函数,即函数可以输入任意数量的参数。在函数参数的前面增加一个 * 即可将该参数变为可变参数。 我们来看一个计算输入整数的和的函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def sum(*num):
   sum = 0
   for n in num:
       sum += n    
    return sumprint(sum(1, 2, 3, 4, 5))
print(sum(1, 3, 4))

在以上代码中 sum 函数的参数可以是任意个,在函数内部 num 是一个元组,我们可以像访问元组一样访问 num,同时我们也可以向 sum 函数传入一个元组或列表

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def sum(*num):
   sum = 0
   for n in num:
       sum += n    
    return sumlist = [1, 2, 3, 4, 5]
print(sum(*list))

关键字参数函数

可变参数允许你传入 0 个或任意个参数,这些可变参数在函数调用时自动组装为一个元组。而关键字参数允许你传入 0 个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个字典。在函数参数的前面增加一个 ** 即可将该参数转变为关键字参数。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def person(name, age, **kw):
   print('name:', name, 'age:', age, 'other:', kw)
   
person('keinYe', 25)
person('keinYe', 25, city='shenzhen')

以上代码运行结果如下

name: keinYe age: 25 other: {}
name: keinYe age: 25 other: {'city': 'shenzhen'}

函数返回值

在 python 中使用 return 语句来返回一个值,return 语句可以用来返回一个变量(变量可以是字典、元组、列表等等),但是在大多数函数中我们无需返回数据,比如在前面的实例中我们均未返回任何数据,也没有 return 语句,实际上此时 python 解释器增加了一个默认的 return 语句但是并未返回任何数值。

函数要有返回值,也必须有返回值。在无需明确返回数据时,我们可以省略 return 语句。

全局变量和局部变量

把那个只在函数体内(某个范围内)起作用的变量称之为局部变量。在函数体外部定义的变量称之为全局变量。我们可以通过以下示例来说明全局变量和局部变量。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

x = 3

def test():
   x = 5
   print('x =', x)test()
print('x =', x)

以上代码运行结果如下

x = 5
x = 3

可以看出在函数内部的变量 x 的值并未影响到函数外部的变量 x,前一个 x 输出的是函数内部的变量 x;后一个 x 输出的是函数外面的变量 x。两个变量彼此没有互相影响,虽然都是 x。从这里看出,两个 x 各自在各自的领域内起到作用。

如要在函数内部访问函数外部的全局变量可以使用关键字 global。我们将上面的代码进行如下修改

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

x = 3

def test():
   global x
   x = 5
   print('x =', x)test()
print('x =', x)

以上代码运行结果如下:

x = 5
x = 3

从输出结果可以看出,在函数体内部对变量 x 进行赋值,函数体外部的变量 x 的值也发生了改变。

在程序的编写过程中要慎用全局变量,过多使用容易造成变量混乱。

原文发布于微信公众号 - keinYe(keinYe_zh)

原文发表时间:2018-12-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券