python函数式编程之高阶函数

本文深入探讨Python中的高阶函数,包括map、reduce、filter和sorted等的使用技巧及应用场景,同时介绍了匿名函数、闭包和装饰器的概念与实践案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. map

map(function,sequence[,sequence,...]) ->list

*对sequence序列中的每一个元素item依次执行function(item)函数操作,返回值是个列表

##用map函数将字符串中的每个数字转化成int型

  

2. reduce

reduce(function,sequence[,initial]) ->value

*对于序列中每个元素迭代调用function函数,function必须要有两个函数

reduce(lambda x,y:x+y,[1,2,3,4,5])-->((((1+2)+3)+4)+5)

##用reduce求阶乘

def cheng(x,y):

return x * y

def jiecheng(max):

print reduce(cheng,range(1,max))

 

3. filter

filter(function or None,sequence) -> list,tuple,or string

*function返回值为bool类型

##给定一个正整数,计算有多少对质数的和等于这个正整数,并输出结果。

n = input("Num:")

def is_prime(x):

if x==1:

return False

        else:

            for i in range(2,x):

if x%i == 0:

    return False

else:

                    return True

   prime_list = filter(is_prime, range(1, n))

   count = 0

   #for i in prime_list:

   #       for j in prime_list:

   #               if i+j==n and i<=j:

   #                       count += 1

   #print count

 

   #for i in prime_list:

   #       if is_prime(n-i) and i<=n-i:

   #               print (i, n-i)

   #               count += 1

   #print count

 

   a = [(i, n-i) for i in prime_list if is_prime(n-i) and i<=n-i]

   print a

   print len(a)

 

4. sorted

   sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

   cmp=用于比较的函数

   *返回一个排序后的新列表,原列表不变,可作用于任意可迭代对象

   *li.sort()作用于列表本身,只能用于列表排序

   li = [1, 23, 43, 5, 65]

   print sorted(li)

   print li

  

   li.sort()

   print li

   ##sorted逆序排序

   li = [1, 23, 43, 5, 65]

   sorted(li, reverse=True)

   ##忽略大小写进行排序

   name = ['alice', 'Bob', 'harry', 'Jenny', 'jack']

   def ignore_case(s1,s2):

       s1 = s1.lower()

       s2 = s2.lower()

   return cmp(s1, s2)

   sorted(name, ignore_case)

   ##找出货物中价格最低的和数量最多的

   goods = [

         ["apple", 2.00, 10],

         ["computer", 4000.00, 4],

         ["banana", 1.00, 40]

   ]

   sorted(goods, key=lambda x: x[1])[0][0]

   sorted(goods, key=lambda x: x[2])[-1][0]

   **x = ["apple", 2.00, 10]  ["computer", 4000.00, 4]  ["banana", 1.00, 40]

 

5. 匿名函数

#lambda参数名:函数返回值

   def mypower(x):

return x**2

   map(lambda x:x**2, [1,2,3,4,5])

   #参数名:支持可变参数, **kwargs......

   mypower = lambda x,y=2:x**y

   print mypower

   print mypower(3)

 

6. 函数作为返回值

def cacl_sum(*args):

  all_sum = 0

for i in args:

  all_sum += 1

return all_sum

   cacl_sum(1,2,3,4,5)

 

7. 闭包(closure--函数嵌套函数

def lazy_sum(*args):

def cacl_sum():

  all_sum = 0

for i in args:

all_sum += i

  return all_sum

  return cacl_sum

   f = lazy_sum(1,2,3,4,5)

   print f()

   *当调用闭包lazy_sum时,每次调用都返回一个新的函数

 

8. 装饰器--基于闭包

**装饰器传参,可在装饰器外再加一层函数

   #coding:utf-8

   def addInfo(a):

     def addInfo1(fun):

         def wrapper():

             print "######欢迎使用ATM[%s]系统!######" %(a)

                fun()

                print "######欢迎下次使用!######\n\n"

            return wrapper

        return addInfo1

   #语法糖

   @addInfo("登陆")

   def login():

        print "登陆......."

   @addInfo("查询")

   def index():

        print "查询......."

   @addInfo("转账")

   def transferMoney():

        print "转账......"

   @addInfo("存储")

   def saveMoney():

        print "存钱......"

   login()

   index()

   transferMoney()

   saveMoney()

  

   #通过装饰器计算函数执行时间

   #coding:utf-8

   import time

   def Timer(fun):       #login

        def wrapper(*args, **kwargs):          ##可传任意参数的万能装饰器

         start_time = time.time()

            fun(*args, **kwargs)

            end_time = time.time()

            count = end_time - start_time

            print "[%s]函数运行了[%s]时间。。。" %(fun.__name__,count)

        return wrapper

   @Timer

   #add =Timer(add)

   def login():

        print "login......"

   login()


   #time.time()       ##获取时间戳

   #time.ctime()      ##获取时间日期

   ##编写Logger装饰器,实现被装饰函数运行后打印日志信息,日志格式为:

某时间   【某函数】函数运行时间为【多长时间】;

   ##被装饰的函数可以接收任意多个参数;

   ##装饰器可以传参数,并打印所传参数,格式为:装饰器所传参数为:XXX

   #coding:utf-8

   import time

   def Logger(*args1, **kwargs1):

        def log1(fun):

         def wrapper(*args, **kwargs):

             t = time.ctime()

                start_time = time.time()

                fun(*args, **kwargs)

                end_time = time.time()

                T = end_time - start_time

                print "%s\t[%s]函数运行时间为[%s]" %(t, fun.__name__, T)

                print "装饰器所传参数为:[%s,%s]" %(args1, kwargs1)

            return wrapper

        return log1

   @Logger("i'm args", name = "sumin")

   #login = Logger(login)

   #               login --->wrapper

   def login(user,passwd):

        print "login......"

   print "%s登陆成功!" %(user)

   login("user1", "123")

 

9. json = javascript object

   import urllib2    #bs4

   import json

   ##查询ip的所在地

   #coding:utf-8

   import urllib2    ##获取网页信息

   import json       ##数据类型转换

 

   ip = raw_input("查询的IP:")

   a =urllib2.urlopen("http://ip.taobao.com/service/getIpInfo.php?ip=%s" %(ip))

   res = a.read()

 

   dict_res = json.loads(res)

 

   print "查询结果显示:", dict_res['data']['ip'], dict_res['data']['country'], dict_res['data']['city']

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值