一般情况下,我们使用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用法