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']