您的位置:首页 > 编程语言 > Python开发

python基础之函数式编程、匿名函数、内置函数

2017-04-13 14:43 381 查看

一 函数式编程

不修改外部状态。

模仿数学里得函数进行编程。

用函数编程写出得代码相当精简。

可读性比较差。

例子:

y=2*x+1

x=1
def test(x):
return 2*x+1
test(x)


一 匿名函数

匿名函数就是不需要显式的指定函数。

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lamba表达式中封装有限的逻辑进去。

注:匿名函数引用计数为0,lambda经常和内置函数一起使用

  lambda/filter/map/reduce这些都是函数式编程的风格。

语法:
lambda函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression


先来个简单得:

#这段代码
def calc(n):
return n**n
print(calc(10))

#换成匿名函数
calc = lambda n:n**n
print(calc(10))


换个高级点得:

salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':250
}

def get_value(k):
return salaries[k]

#换成匿名函数:
lambda k:salaries[k]
f=lambda k:salaries[k] #匿名函数也可以赋值一个名字,但是这便违反了匿名的初衷
print(f)
print(f('egon'))

print(max(salaries))
print(max(salaries,key=get_value))
print(max(salaries,key=lambda k:salaries[k]))
print(min(salaries,key=lambda k:salaries[k]))


二 内置函数

classmethod
staticmethod
property

delattr
hasattr
getattr
setattr

issubclass
super


其他内置函数

练习题:

作业一、

1、用map来处理字符串列表啊,把列表中所有人都变成sb,比方alex_sb

  name=['alex','wupeiqi','yuanhao']

m=map(lambda name:name+'_sb',name)
print(list(m))


2、用map来处理下述l,然后用list得到一个新的列表,列表中每个人的名字都是sb结尾

  l=[{'name':'alex'},{'name':'y'}]

print(list(map(lambda i:{'name':i['name']+"sb"},l)))


作业二:

1、用filter来处理,得到股票价格大于20的股票名字

shares={
'IBM':36.6,
'Lenovo':23.2,
'oldboy':21.2,
'ocean':10.2,
}

res=filter(lambda x:shares[x]>20,shares)
print(list(res))
或者
for i in res:
print(i)


作业三:

如下,每个小字典的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来得出一个包含数字的迭代器,数字指的是:购买每支股票的总价格

res=map(lambda x:x['shares']*x['price'],portfolio)
print(list(res))
或者
for i in res:
print(i)


2、基于1的结果,用reduce来计算,购买这些股票总共花了多少钱

l1=[]
res=map(lambda x:x['shares']*x['price'],portfolio)
print(list(res))
或者
for i in res:
l1.append(i)

res=reduce(lambda x,y:x+y,l1)
print(res)


3、用filter过滤出,单价大于100的股票有哪些

res=filter(lambda x:x["price"]>100,portfolio)
for i in res:
print(i)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: