练习1
"""
# 将一个字符串转换成整型 -->不能用int进行类型转换!
'332' -->332
"""
# 思路:将数字字符串映射成整数-->列表
from functools import reduce
def fun(s):
# (1)将字符串数字和int数字映射
mapper = {str(i): i for i in range(10)}
# (1)获取每一位数
def Str_to_int(ch):
# 字典生成式
return mapper[ch]
# (2)迭代求和,一步一步逼近
def fun1(n1, n2):
return n1 * 10 + n2
# (3)调用两个功能函数-->完成的!
return reduce(fun1, map(Str_to_int, s))
# 模拟用户输入
num = fun('123456')
# 输出和判断类型!
print(type(num), num)
# 强调一下,对于reduce,如果列表仅仅有一个元素,则直接返回(不会调用函数)!
# 12783 -->12、[7,8,3] -->127、[83] -->1278、[3]
核心:将字符串各个拆解,映射成数字
思考:是否存在弊端--->如果是一位数字字符串呢?
说明:一个数字字符串时没有执行fun函数,应该是将其作为reduce的最终结果!
练习2
"""
1.利用map()函数,把用户输入的不规范的英文名字,变为首字母大写(Cap*函数),其他小写的规范名字
分析:过滤(*.istitle)
jAne -->Jane
JANE -->Jane
读懂题意!
"""
def fun(name):
name=name[0].upper()+name[1:].lower()
return name
list1 = ['adam', 'LISA', 'barT']
list2 = list(map(fun, L1))
print(L2)
练习3
"""
2.利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456
思路1:叠加(小数点换成0.)
思路2:除以10
"""
from functools import reduce
# 思路:以'.'作为拆解,分别处理
def func(s):
# (1)获取映射关系
str_int = {str(i): i for i in range(10)}
def get(char):
# 得到当前位的数字
return str_int[char]
def fun(x, y):
return x * 10 + y
# 核心:获取.的位置-->整数和小数分别计算!-->不确定是否有小数-->拆解!
index = s.find('.')
if index != -1:
# 说明表示是小数字符串!-->[start,end)
s1 = s[:index]
s2 = s[index+1:]
return reduce(fun, map(get, s1)) + reduce(fun, map(get, s2)) / (10 ** len(s2))
else:
# 如果传入的字符串没有".",整数计算!
return reduce(fun, map(get, s))
#print(func('123.456'))
print(func('123'))
分析:分割然后两个字符串分别处理,计算结果!
练习4:
"""
3.回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回文数
"""
# 样本(数据来源)
list1 = [123, 12321, 456654]
# 定义一个函数-->判断是不是回文数!
def fun(element):
# (1)获取当前数字的反转数!
def fun1(element):
a = 0
while element > 0:
b = element % 10
a = a * 10 + b
element = element // 10
return a
# (2)判断是不是回文数
return fun1(element) == element
print(list(filter(fun, list1)))