python进阶系列学习(一)

map函数

map函数是python的内置的高阶函数,接受两个参数,第一个就是函数f,另一个就是列表list,作用就是f函数作用于list的每一个元素,这里需要注意的一点是map()函数作用于一个list时,会返回一个新的list,并不会改变原有的list

在做课后习题时
题目:
假设用户输入的英文名字不规范,没有按照首字母大写,后续字母小写的规则,请利用map()函数,把一个list(包含若干不规范的英文名字)变成一个包含规范英文名字的list:

输入:[‘adam’, ‘LISA’, ‘barT’]
输出:[‘Adam’, ‘Lisa’, ‘Bart’]

出现一个问题:

 def f(s):
...     s[0]=s[0].upper()
...     return s
...
>>> f('xuanxuan')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
TypeError: 'str' object does not support item assignment

原因就是,字符串是不可变对象,不要试图通过下标索引赋值的方式去改变原来字符串的值!
解决办法:

def format_name(s):
    s1=s[0].upper()+s[1:].lower()
    return s1
print map(format_name, ['adam', 'LISA', 'barT'])

也就是说map()函数的返回值是一个新的list,该返回值是由函数f作用于list的每一个元素得到的

reduce函数

reduce()函数也是python内置的高阶函数,和map函数一样,也是需要接收两个参数,第一个参数就是要作用的函数f,另一个参数就是list,只不过和map函数不同的是,该函数f必须的接收两个参数!其实reduce函数有点类似于对每一个元素反复的使用f,前后相关,且有累计效应~
题目:

Python内置了求和函数sum(),但没有求积的函数,请利用recude()来求积:

输入:[2, 4, 5, 7, 12]
输出:2*4*5*7*12的结果

def prod(x, y):
    return x*y

print reduce(prod, [2, 4, 5, 7, 12])
filter函数

filter函数也是python内置的高阶函数,也是接收两个参数,第一个参数是函数f,另一个参数是list,参数中的filter函数返回的是一个Ture 或者False类型的,当把该
函数作用于list中的每一个元素时,保留值为True的元素,去掉不满足条件的,将满足条件的元素,以一个新的list返回~

该filter函数可以用于返回一个数组中字符串为空,或者元素为None的元素:
这时候filter中参数f的功能就是得写一个函数,他可以判断该元素不是None且不是空的字符

>>> def is_not_empty(s):
...     return s and len(s.strip())>0
...
>>>

接下来就可以使用filter函数去掉数组中不满足条件的元素,返回一个新的list

>>> print(filter(is_not_empty,['','as','   ha','  ',None]))

结果为:

['as', '   ha']   #输出的结果

这里需要补充一个知识点strip()函数
s.strip(rm) 可以用于去除s字符串中开头和结尾的rm序列(如果有的话),rm为空时,默认删除空白符,包括‘\n’,’\r’,’\t’, 例如:

>>> s='  0sd1  '
>>> s.strip()
'0sd1'
>>>

题目:
请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

解法一(我自己写的):

import math

def is_sqr(x):
    return math.sqrt(x) in range(1,51)

print filter(is_sqr, range(1, 101))

解法二(别人的解法,更好):

import math
def is_sqr(x):
    r=int(math.sqrt(x))
    return r*r==x
print(filter(is_sqr,range(1,101)))

看到了一篇讲map,reduce filter函数最形象的博客:
https://blog.csdn.net/u011197534/article/details/53747316

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值