匿名函数
匿名函数就是不需要显示的函数
# 这么写貌似和下面普通的函数没啥区别
f1 = lambda x: x**2
print(f1(10)) # 100
def f(x):
return x**2
print(f(10)) # 100
匿名函数奇淫用法
# 用max()方法计算下面工资最高的人
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
a = max(salaries, key=lambda x: salaries[x])
print(a) # alex
f = lambda x: salaries[x] < 10000 # 判断工资小于10000
print(f("egon")) # True
map()
map可以根据提供的函数对指定序列做映射,它接受一个函数f和一个list,并通过把函数f以此作用在list上的每个元素,然后返回一个新的list,map函数的入参也可以是多个.注意这个函数一定要有返回值.一定要有返回值.一定要有返回值.
map(func,*iterable)
def f(x):
return x**2
l =[1, 2, 3]
b = map(f, l)
print(list(b)) # [1, 4, 9]
# 此时的b是一个map 对象,他本身有__iter__和__next__方法,所以它是一个迭代器
a = map(lambda x: x**2, l)
print(list(a)) # [1, 4, 9]
filter()
filter函数接受一个函数f和一个list,这个函数f的作用是对每个元素进行判断,返回True或者False,这样可以过滤掉一些不符合条件的元素,然后返回符合条件的list.
# filter
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
#通过filter函数输出工资大于10000的人名
c = filter(lambda m:salaries[m] > 100000,salaries)
print(list(c)) # ['alex']
reduce()
reduce函数的用法和map很类似,也是一个函数f和一个list,但是函数的入口参数一定要是两个,reduce也是对每个元素进行反复调用,最后返回最终的值,而map是返回一个list.在python3里面reduce已经从全局函数里面移除了,需要用的话要from functools import reduce
from functools import reduce
l=[1, 2, 3]
b = reduce(lambda x,y: x+y,l)
print(b) # 6
max()和min()
max()返回一个可迭代对象的最大值,如果比较的是字典,默认会比较字典的key,如果制定关键字key,则比较关键key,返回仍是字典的key。
# max,找出工资最高的那个人
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
res = max(salaries, key=lambda x: salaries[x])
print(res)
sorted()
对一个可迭代对象进行排序,默认升序,返回一个新列表。
# sorted
l = [1, 3, 2, 5 ]
s= sorted(l)
print(s) # [1, 2, 3, 5]
根据字典的value进行排序,输出字典的key
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
# 通过key/函数进行排序
s = sorted(salaries,key=lambda x: salaries[x],reverse=True)
print(s) # 按value从大到小排序,输出key
# ['alex', 'wupeiqi', 'egon', 'yuanhao']
enumerate()
python中enumerate方法,返回一个enumerate类型。参数一般是一个可迭代对象。
enumerate(sequence, [start=0]) #不写start,默认从0开始
for i in enumerate(["a", "b", "c", "d", "e"],2):
print(i)
# (2, 'a')
# (3, 'b')
# (4, 'c')
# (5, 'd')
# (6, 'e')
zip()
zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表
# zip
l =[1, 2, 3, 4, 5]
s = "hello"
t = zip(l,s)
print(list(t)) # [(1, 'h'), (2, 'e'), (3, 'l'), (4, 'l'), (5, 'o')]
zip()奇淫之构建字典
# zip构建字典
l =[1, 2, 3, 4, 5]
s = "hello"
d = dict(list(t))
print(d) # {1: 'h', 2: 'e', 3: 'l', 4: 'l', 5: 'o'}
homework
# #用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb
name=['alex','wupeiqi','yuanhao']
# s = map(lambda x: x+"_sb", name)
# print(list(s)) # ['alex_sb', 'wupeiqi_sb', 'yuanhao_sb']
#用map来处理下述l,然后用list得到一个新的列表,列表中每个人的名字都是sb结尾
l=[{'name':'alex'},{'name':'y'}]
# s = map(lambda x: "_".join([x["name"],"sb"]), l)
# print(list(s)) # ['alex_sb', 'y_sb']
# =====================作业二
#用filter来处理,得到股票价格大于20的股票名字
shares={
'IBM':36.6,
'Lenovo':23.2,
'oldboy':21.2,
'ocean':10.2,
}
# name = filter(lambda x:shares[x] > 20 ,shares)
# print(list(name)) # ['Lenovo', 'IBM', 'oldboy']
# =====================作业三
#如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
]
# 1:map来得出一个包含数字的迭代器,数字指的是:购买每支股票的总价格
nums = map(lambda x: x["price"] * x["shares"], portfolio)
# print(list(nums)) # [9110.0, 27161.0, 4218.0, 1111.25, 735.7500000000001, 8673.75]
# 2:基于1的结果,用reduce来计算,购买这些股票总共花了多少钱
from functools import reduce
total_price = reduce(lambda x,y:x+y,nums)
print(total_price) # 51009.75
# 3:用filter过滤出,单价大于100的股票有哪些
high_shares = filter(lambda x:x["price"] > 100, portfolio)
# print(list(high_shares)) # [{'shares': 50, 'price': 543.22, 'name': 'AAPL'}, {'shares': 75, 'price': 115.65, 'name': 'ACME'}]
n = map(lambda x:x["name"] ,high_shares)
print(list(n)) # ['AAPL', 'ACME']
函数递归
递归在内存中保留在栈中
递归必须有一个明确的结束条件
每次进入深一层递归,规模相比上次应该有所减少
递归效率不高,递归过深容易导致栈溢出
# 递归
def age(n):
if n == 1:
return 10
else:
return age(n-1) + 2
print(age(5)) # 18
# age(5) = age(4) + 2
# age(4) = age(3) + 2
# age(3) = age(2) + 2
# age(2) = age(1) + 2
# age(1) = 10
# age5 = ((((age(1) + 2) + 2) + 2) +2)
递归应用,二分法找数据
# 二分法找数据
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def search(num,data):
print(data)
if len(data) > 1:
mid_index = int(len(data)/2)
mid_value = data[mid_index]
if mid_value ==num:
print("find it")
return 0
elif mid_value > num:
data = data[:mid_index]
return search(num,data)
else:
data = data[mid_index:]
return search(num,data)
else:
if data[0] == num:
print("find it ")
else:
print("num not find")
search(19,data) # num not find
# [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
# [18, 20, 21, 22, 23, 30, 32, 33, 35]
# [18, 20, 21, 22]
# [18, 20]
# [18]
# num not find
二分法查找数据解法二:
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def search1(num,data):
min1 = 0
max1 = len(data)-1
if num in data:
while True:
center = int((min1+max1)/2)
if data[center]>num:
max1 = center
elif data[center]<num:
min1 = center
elif data[center]==num:
print("find it--"+str(num))
return 0
else:
print("没有该数字")
search1(3,data)
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 37]
# python二分法
def search(data,num):
min_index = 0
max_index = len(data)-1
while min_index <= max_index:
middle_index = int((max_index+min_index) / 2)
print(data[min_index:max_index],"->",min_index,middle_index,max_index)
if data[middle_index] > num:
max_index = middle_index-1
elif data[middle_index] < num:
min_index = middle_index+1
elif data[middle_index] == num:
print("you find it")
return
print("找不到")
return
search(data,24)