python学习18:高阶函数


1.高阶函数

高阶函数

  • 实参是一个函数
  • 函数的返回值也是一个函数
def fun(x,y,f):
    return f(x),f(y)
print(fun(-10,34,abs))

在这里插入图片描述

2.内置高阶函数

2.1.map()

map():接收两个参数 一个是函数 一个是序列
map将传入的函数依次作用到序列的每个元素 并且把结果作为新的序列返回

对一个序列[-1,3,-4,-5]的每一个元素求绝对值

print(list(map(abs,[-1,3,-4,-5])))

在这里插入图片描述
对序列的每个元素求阶乘

import random
def f(x):
    """对x求阶乘"""
    res = 1
    for i in range(1,x+1):
        res = res * i
    return res
li = [random.randint(2,7) for i in range(10)]
print(list(map(f,li)))

在这里插入图片描述

2.2.reduce()

reduce():把一个函数作用在一个序列上,这个函数必须接收两个参数。
reduce把结果继续和序列的下一个元素做累积计算,reduce(f,[1,2,3,4]) = f(f(f(1,2),3),4)。

  • python2:reduce是内置函数
  • python3.x:from functools import reduce
from functools import reduce

def multi(x,y):
    return x*y
print(reduce(multi,range(1,10)))

def add(x,y):
    return x+y
print(reduce(add,range(1,101))

在这里插入图片描述

2.3.filter()

filter过滤函数

  • filter()把传入的函数依次作用于,序列的每个元素 然后根据返回值是True或者False,决定保留还是丢弃该元素。
def isodd(num):
    if num % 2 == 0:
        return True
    else:
        return False

print(list(filter(isodd,range(100))))

在这里插入图片描述

2.4.匿名函数lambda()

在这里插入图片描述

from functools import reduce
print(reduce(lambda x,y:x+y,range(100)))

在这里插入图片描述

print(list(map(lambda x:x**2,range(5))))

在这里插入图片描述

print(list(filter(lambda x:x%2==0,range(100))))

在这里插入图片描述

2.5…内置函数sort
# 改变原有的list
li = [4, 5, 6, 7, 2, 1, 3, 8, 9, 10]
li.sort()
print(li)

在这里插入图片描述

# 不改变原来的list
li = [4, 5, 6, 7, 2, 1, 3, 8, 9, 10]
li1 = li[:]
li1.sort()
print(li1)
print(li)

在这里插入图片描述

# 不改变原来的list
li = [4, 5, 6, 7, 2, 1, 3, 8, 9, 10]
li2 = sorted(li)
print(li2)
print(li)

在这里插入图片描述

# sorted中添加函数
li3 = [4, -5, -6, 7, 2, -1, 3, -8, 9, -10]
li4 = sorted(li3, key=abs)
print(li4)
print(li3)

在这里插入图片描述

# 给字符串排序
s = ['daas', 'dasas', 'FEDFerw', 'fsadER']
print(s)
print(sorted(s))
print(sorted(s, key=str.lower))
print(sorted(s, key=str.upper))

在这里插入图片描述

# 指定位置排序
students =[('john','A',15),
     ('jane','B',12),
     ('dave','B',10)]
print(sorted(students,key=lambda student:students[2]))

在这里插入图片描述

info = [
    # 商品名称 商品数量 商品价格
    ('apple1', 200, 100),
    ('apple2', 40, 32),
    ('apple3', 20, 10),
    ('apple4', 20, 15),
]
# 按照商品数量进行排序
def sorted_by_count(x):
    return x[1]

print(sorted(info, key=sorted_by_count))

# 按照商品价格进行排序
def sorted_by_price(x):
    return x[2]
print(sorted(info, key=sorted_by_price))

# 先按照商品数量进行排序 如果商品数量一致
# 则按照商品价格进行排序
def sorted_by_count_price(x):
    return x[1], x[2]

print(sorted(info, key=sorted_by_count_price))

在这里插入图片描述

nums = [3,2,8,0,1]
print(sorted(nums,))

在这里插入图片描述

练习

test–1

将一个字符串转换成整型

  • ‘12345’—12345
from functools import reduce

def str2int(s):
    def char2int(ch):
        c = {str(x): x for x in range(10)}
        return c[ch]
    def fun(n1, n2):
        return n1 * 10 + n2
    return reduce(fun, map(char2int, s))

num = str2int('24312412')
print(num,type(num))

在这里插入图片描述

li = ['123','456']
li.reverse()
print(li)

reverse() 函数

  • 该方法没有返回值,但是会对列表的元素进行反向排序。

在这里插入图片描述
test–2

回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数。

from functools import reduce
def is_palindrome(n):
    l = list(str(n)) #['1','0' ]
    l.reverse() # ['0','1'] #
    # 1*10+0 = 10
    num = reduce(lambda x,y:int(x) * 10 + int(y),l)
    return num == n
output = filter(is_palindrome,range(1,1000))
print('1~1000:',list(output))

在这里插入图片描述
test–3

利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。

capitalize()方法语法:

  • str.capitalize()
  • capitalize()将字符串的第一个字母变成大写,其他字母变小写。
def normalize(name):
    return list(map(lambda x:x.capitalize(),name))

L = ['adam','LISA','TOM']
print(normalize(L))

在这里插入图片描述
test–4

利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456。

from functools import reduce


def str2float(s):
    ch = {str(x): x for x in range(10)}
    # 先将字符串分割
    l = s.split('.')
    # 将整数部分
    n1 = reduce(lambda x, y: x * 10 + y, map(lambda x: ch[x], l[0]))
    # 将小数部分
    n2 = reduce(lambda x, y: x * 10 + y, map(lambda x: ch[x], l[1]))
    n2 *= 0.1 ** len(l[1])  # a *=1 a = a*1  n2 = n2 * 0.1**4
    return n1 + n2


num = str2float('1234.4567')
print(num, type(num))

在这里插入图片描述
test–5

(2018-携程-春招题)题目需求:
给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;

  • 输入:第一行是数组长度
  • 输出:调整后数组的内容;
n = int(input())

li = [int(input()) for i in range(n)]

def move_zone(item):
    if item == 0:
        return 2
    else:
        return 1
for i in sorted(li,key=move_zone):
    print(i)

在这里插入图片描述
test–6

有一个整数列表(10个元素),要求调整元素的顺序
把奇数放在前面 偶数放在后面

li = [int(input()) for i in range(10)]

def move_zone(item):
    if item % 2==0:
        return 2
    else:
        return 1
for i in sorted(li,key=move_zone):
    print(i)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值