Python菜鸟编程第七课之函数拓展

Python菜鸟编程第七课之函数拓展

1.递归

在一个函数体的内部,调用函数本身,就被称为递归函数。

demo1:

#运用递归,输出斐波那契数列的第N项
def fibo(n):
    if n == 1:
        return 1
    elif n == 2:
        return 1
    else:
        return fibo(n - 1) + fibo(n - 2)
print(fibo(10))
运行结果:
55

2.匿名函数(lambda)

  • 匿名函数的关键字为lambda,冒号前面是行参 冒号后面是返回值

格式:

lambda para1,para2,..paraN:expression using paras

demo1:

f = lambda x, y, z: x + y + z
print(type(f))
print(f(3, 4, 5))
运行结果:
<class 'function'>
12

demo2:

f = lambda x='a', y='b', z='c': x + y + z
print(type(f))
print(f('zj'))
运行结果:
<class 'function'>
zjbc

3.高阶函数

高阶函数:把一个函数名,以实参的形式传递给这个函数的形参。

demo1:

def add(a, b, func):
    return func(a) + func(b)
result = add(-9, 1, abs)
print(result)
运行结果:
10

demo2:

过滤列表中以c开头或者以ty结尾的元素

l1 = ['Zhejiang', 'University', 'city', 'college']
def start_sr(sr):
    return sr.startswith('c')
def end_sr(sr):
    return sr.endswith('ty')
def filter_test(func, para):
    ret = []
    for i in para:
        if not func(i):
            ret.append(i)
    return ret
print(filter_test(end_sr, l1))
print(filter_test(start_sr, l1))
print(filter_test(lambda x:x.startswith('c'),l1))
运行结果:
['Zhejiang', 'college']
['Zhejiang', 'University']
['Zhejiang', 'University']

4.filter过滤函数

语法:

filter(function,sequence)

function:可以是自定义的函数,也可是匿名函数。

sequence:列表,元组,字符串

功能:

​ 过滤掉序列中不符合函数条件的元素。当序列中需要保留的元素可以用某些函数描述,就应该想到filter函数。

demo:

l1 = ['Zhejiang', 'University', 'city', 'college']
'''
def start_sr(sr):
    return sr.startswith('c')
l2=filter(start_sr,l1)
'''
l2=filter(lambda x:not x.startswith('c'),l1)
print(type(l2))
print(list(l2))
运行结果:
<class 'filter'>
['Zhejiang', 'University']

5.map 映射

功能:求一个序列或者多个序列进行函数映射后的值。

格式:

map(function,iterable1,iterable2)

function的参数可以不止一个

iterable1,iterable2就是传入function的参数

demo1:

l1 = [1, 2, 3, 4, 5]
y = [2, 3, 4, 5, 6]
res = map(lambda x: x+1, l1)
print(list(res))
运行结果:
[2, 3, 4, 5, 6]

demo2:

l1 = [1, 2, 3, 4, 5]
def add(num):
    num += 1
    return num
def func(func, l2):
    for i in range(len(l2)):
        l2[i] = func(l2[i])
    return l2
print(func(add, l1))
运行结果:
[2, 3, 4, 5, 6]

6.reduce 函数

功能:

  • 对一个序列进行压缩运算,得到一个value值。

  • python2中,reduce()是内置函数,而现在,python3中,他被移植到functools模块中。

格式:

reduce(function,iterable,[initial])

function是必须要传入两个参数的函数,iterable:元组或者列表,[initial]初始值。

流程:iterable中第一第二个元素先进行函数运算,返回新的结果,之后再用新的结果跟第三个元素进行运算…直到最后一个元素。

demo:

from functools import reduce
y=[6,12,5,3,4]
z=reduce(lambda x,y:x+y,y)#两个参数x,y,冒号后面的x+y是返回值,y是取值范围.
print(z)
运行结果:
#((((6+12)+5)+3)+4),从内到外运算。
30

demo2:


运行结果:

7.apply

功能:pandas中,应用对象是pandas中的DataFrame或者Series.对pandas中groupby之后的聚合对象应用aaply。

demo:

import numpy as np
import pandas as pd
a=np.random.randint(low=0,high=4,size=(2,4))
print(a)
data=pd.DataFrame(a)
print(data)
asq=data.apply(lambda x:x*10)
print(asq)
运行结果:
[[0 3 1 2]
 [2 1 3 1]]
   0  1  2  3
0  0  3  1  2
1  2  1  3  1
    0   1   2   3
0   0  30  10  20
1  20  10  30  10

8.zip

功能:将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,返回这些元组构成的对象。当长度不一样的时候,以长度短的为准。

tip:利用*号操作符,与zip相反,进行解压。

格式:

zip(iterable1,iterable2,...)

iterable:两个或者多个可迭代序列(字符串,列表,元组,字典)

在Python中,返回的是一个对象,如果要得到一个对象,

demo1:

a=[1,2,3]
b=[4,5,6]
c=[4,5,6,7,8]
ziptest1=zip(a,b)
ziptest2=zip(b,c)
print(type(ziptest1))
print(list(ziptest1))
#for i in ziptest1:
#     print(i,end=' ')
print(list(ziptest2))#b长度小于c,取长度短的
ziptest3=zip(*ziptest1)#解压
print(list(ziptest3))
运行结果:
<class 'zip'>
[(1, 4), (2, 5), (3, 6)]
[(4, 4), (5, 5), (6, 6)]
[]

demo2:

#当传入的参数是字典时,只会取出键值,忽略value值
a={1:11,2:22}
b={3:33,4:44}
zip1=zip(a,b)
print(list(zip1))
运行结果:
[(1, 3), (2, 4)]

9.练习题

1.取出1000以内所有回文数

方法一:使用map函数

l1=[str(i) for i in range(1001)]
l2=list(map(lambda x:x[::-1],l1))
l3=[]
for i in range(len(l2)):
    if l2[i]==l1[i]:
        l3.append(l2[i])
print(l3)
运行结果:
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '11', '22', '33', '44', '55', '66', '77', '88', '99', '101', '111', '121', '131', '141', '151', '161', '171', '181', '191', '202', '212', '222', '232', '242', '252', '262', '272', '282', '292', '303', '313', '323', '333', '343', '353', '363', '373', '383', '393', '404', '414', '424', '434', '444', '454', '464', '474', '484', '494', '505', '515', '525', '535', '545', '555', '565', '575', '585', '595', '606', '616', '626', '636', '646', '656', '666', '676', '686', '696', '707', '717', '727', '737', '747', '757', '767', '777', '787', '797', '808', '818', '828', '838', '848', '858', '868', '878', '888', '898', '909', '919', '929', '939', '949', '959', '969', '979', '989', '999']

方法二:使用filter函数

l1=[str(i) for i in range(1001)]
def palindrome(l1):
    if l1==l1[::-1]:
        return True
l4=list(filter(lambda x:palindrome(x),l1))
print(l4)
#其实也可以一句话就输出
#print(list(filter(lambda x:str(x)==str(x)[::-1],range(0,1001)))).
运行结果:
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '11', '22', '33', '44', '55', '66', '77', '88', '99', '101', '111', '121', '131', '141', '151', '161', '171', '181', '191', '202', '212', '222', '232', '242', '252', '262', '272', '282', '292', '303', '313', '323', '333', '343', '353', '363', '373', '383', '393', '404', '414', '424', '434', '444', '454', '464', '474', '484', '494', '505', '515', '525', '535', '545', '555', '565', '575', '585', '595', '606', '616', '626', '636', '646', '656', '666', '676', '686', '696', '707', '717', '727', '737', '747', '757', '767', '777', '787', '797', '808', '818', '828', '838', '848', '858', '868', '878', '888', '898', '909', '919', '929', '939', '949', '959', '969', '979', '989', '999']

博主QQ:1031748759,欢迎批评指正!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值