函数是组织好的,可以被重复使用的,用来实现单一或相关功能的代码块。在本节学习Python中函数的定义、使用,以及用map 方法生成序列。

定义函数

函数function,通常接收输入参数,并有返回值。

它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。

def add(x, y):
    """Add two numbers"""
    a = x + y
    return a

函数通常有一下几个特征:

  • 使用 def 关键词来定义一个函数。
  • def 后面是函数的名称,括号中是函数的参数,不同的参数用 , 隔开, def foo(): 的形式是必须要有的,参数可以为空;
  • 使用缩进来划分函数的内容;
  • docstring""" 包含的字符串,用来解释函数的用途,可省略;
  • return 返回特定的值,如果省略,返回 None

使用函数

使用函数时,只需要将参数换成特定的值传给函数。

Python 并没有限定参数的类型,因此可以使用不同的参数类型:

def add(x, y):
    """Add two numbers"""
    a = x + y
    return a

print(add(2, 3))
print(add('foo', 'bar'))

# 运行结果:
# 5
# foobar

在这个例子中,如果传入的两个参数不可以相加,那么 Python 会将报错:

print(add(2, "foo"))

#报错

如果传入的参数数目与实际不符合,也会报错:

print(add(1, 2, 3))

#报错

传入参数时,Python 提供了两种选项,第一种是上面使用的按照位置传入参数,另一种则是使用关键词模式,显式地指定参数的值:

print(add(x=2, y=3))
print(add(y="foo", x="bar"))

# 运行结果:
# 5
# barfoo

可以混合这两种模式:

print(add(2, y=3))

# 运行结果:
# 5

设定参数默认值

可以在函数定义的时候给参数设定默认值,例如:

def quad(x, a=1, b=0, c=0):
    return a*x**2 + b*x + c

a、b、c三个参数都是有默认值的。

可以省略有默认值的参数:

print(quad(2.0))

# 运行结果:4.0

可以修改参数的默认值:

print(quad(2.0, b=3))
# 运行结果: 10.0

print(quad(2.0, 2, c=4))
# 运行结果: 12.0
#这里混合了位置和指定两种参数传入方式,第二个 2 是传给 a 的。

注意,在使用混合语法时,要注意不能给同一个值赋值多次,否则会报错,例如:

print(quad(2.0, 2, a=2))
# 报错

接收不定长参数

使用如下方法,可以使函数接受不定数目的参数:

def add(x, *args):
    total = x
    for arg in args:
        total += arg
    return total

这里,*args 表示参数数目不定,可以看成一个元组,把第一个参数后面的参数当作元组中的元素。

print(add(1, 2, 3, 4))
print(add(1, 2))

# 运行结果:
# 10
# 3

这样定义的函数不能使用关键词传入参数,要使用关键词,可以这样:

def add(x, **kwargs):
    total = x
    for arg, value in kwargs.items():
        print("adding %s=%s"%(arg,value))
        total += value
    return total

这里, **kwargs 表示参数数目不定,相当于一个字典,键和值对应于键值对。

print(add(10, y=11, z=12, w=13))

# 运行结果:
# adding w=13
# adding y=11
# adding z=12
# 46

再看这个例子,可以接收任意数目的位置参数和键值对参数:

def foo(*args, **kwargs):
    print(args, kwargs)

foo(2, 3, x='bar', z=10)

# 运行结果: (2, 3) {'x': 'bar', 'z': 10}

不过要按顺序传入参数,先传入位置参数 args ,再传入关键词参数 kwargs

返回多个值

函数可以返回多个值:

def divid(a, b):
    """
    除法
    :param a: number 被除数
    :param b: number 除数
    :return: 商和余数
    """
    quotient = a // b
    remainder = a % b
    return quotient, remainder

quotient, remainder = divid(7,4)
print(quotient, remainder)

#运行结果: 1 3

事实上,Python 将返回的两个值变成了元组:

print(divid(7,4))
# 返回值 (1, 3)

因为这个元组中有两个值,所以可以使用

quotient, remainder = divid(7,4)

给两个值赋值。

列表也有相似的功能:

a, b, c = [1, 2, 3]
print(a, b, c)

#运行结果:1 2 3

事实上,不仅仅返回值可以用元组表示,也可以将参数用元组以这种方式传入:

def divid(a, b):
    """
    除法
    :param a: number 被除数
    :param b: number 除数
    :return: 商和余数
    """
    quotient = a // b
    remainder = a % b
    return quotient, remainder

z = (7,4)
print(divid(*z))

#运行结果: (1, 3)

这里的*必不可少。

事实上,还可以通过字典传入参数来执行函数:

def divid(a, b):
    """
    除法
    :param a: number 被除数
    :param b: number 除数
    :return: 商和余数
    """
    quotient = a // b
    remainder = a % b
    return quotient, remainder

z = {'a':7,'b':4}
print(divid(**z))

#运行结果: (1, 3)

map 方法生成序列

其用法为:

map(aFun, aSeq)

将函数 aFun 应用到序列 aSeq 上的每一个元素上,返回一个列表,不管这个序列原来是什么类型。

事实上,根据函数参数的多少,map 可以接受多组序列,将其对应的元素作为参数传入函数:

def divid(a, b):
    """
    除法
    :param a: number 被除数
    :param b: number 除数
    :return: 商和余数
    """
    quotient = a // b
    remainder = a % b
    return quotient, remainder

a = (10, 6, 7)
b = [2, 5, 3]
print(list(map(divid,a,b)))

#运行结果: [(5, 0), (1, 1), (2, 1)]

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/RePython10.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 06 月 12 日
如果觉得我的文章对你有用,请随意赞赏