一般情况下,我们使用map函数同时获取多个相同类型的变量:

a, b, c = map(int, input().split())
print(c, b, a)

输入10 20 30,结果为30 20 10

这时候就会觉得map函数很好用,可以把3行代码变成1行

但是map函数的用法远不止如此,只用在输入有点大材小用了,能不能和format方法一起用在输出?

例如获取圆的半径r,输出周长面积体积,将计算放在自定义函数来调用:

一般方法:

import math
def c(r):
    l = 2 * math.pi * r
    s = math.pi * r ** 2
    v = 4 / 3 * math.pi * r ** 3
    return l, s, v
r = float(input())
l, s, v = c(r) # 将函数的3个返回值分别赋值给3个变量
print("圆周长为:{:.4f},圆面积为{:.4f},圆球体积为{:.4f}".format(l, s, v))

使用map函数:

import math
def c(r):
    l = 2 * math.pi * r
    s = math.pi * r ** 2
    v = 4 / 3 * math.pi * r ** 3
    return l, s, v
r = float(input())
print("圆周长为:{:.4f},圆面积为{:.4f},圆球体积为{:.4f}".format(map(float, c(r)))) #使用map函数直接将3个返回值输出

我想用map函数将多个返回值格式化输出,但是这个代码会报错:

TypeError: unsupported format string passed to map.__format__

这个问题是format传递参数的特点,默认情况下我应当放入3个参数进去,但是程序只获取到了1个map函数返回的迭代器,所以会报错

在调用函数时,还可以用*分配参数,所以最后一行应当改成:

print("圆周长为:{:.4f},圆面积为{:.4f},圆球体积为{:.4f}".format(*map(float, c(r))))

我用*将map的所有返回值组成了一个元组,这样,我想放入format的参数全都从map返回的元组中获取

* 也可以用在函数的定义时,表示收集参数,加了*的变量名会存放所有未命名的变量参数,当不确定参数数量的时候可以用:

def f(list1, *list2):
    print(list1)
    return list2, list1 
list1 = [1, 2, ['a','b'], 6]
print(f(*list1))

这段代码的结果为:

1
((2, ['a', 'b'], 6), 1)

如果我只想往format里传递列表,可以通过列表索引设置参数:

a = [20, 30, 50]
print("a = {0[0]}, b = {0[1]}".format(a))

结果为a = 20, b = 30 ,其中第一个0指定了位置,[ ]内设置了索引

format的问题解决了,该讲一讲map函数了

菜鸟教程对于map函数的解释:

描述:

map() 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

语法:

map() 函数语法:

map(function, iterable, ...)

参数:

  • function -- 函数

  • iterable -- 一个或多个序列

返回值:

Python 2.x 返回列表。

Python 3.x 返回迭代器。

简单来讲,就是把map第二个参数中所有的值依次用第一个参数的函数处理,处理结束后返回一个元组,例如:

def x(a):
    return a ** 2 + 1
list1 = [1, 7, 5, 9, 10]
print("{},{},{},{}".format(*map(x, list1)))

结果为:2,50,26,82 ,将list1中所有的值依次放入函数x中处理,注意这里返回的元组应当有5个值,但是我只输出了前4个,这是上文提到的format用法

个性签名就是没有个性签名