Python的lambda表达式学习日记

(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

闲话:

 老是没看懂lambda是个啥东西,每次都要去百度。
 干脆自己写一个以后看自己哒。

引入:
def F(x):
  return x*x
f = lambda x: x * x

def G(x, y):
  return x+y
g = lambda x, y: x + y

print( g(f(3), 4) )  #输出13
print( G(F(3), 4) )  #输出13

 应该有个简单的印象了吧~
 lambda表达式就是简化函数的。但是仅当函数只有一行的时候
 这一行能做多少事情,就看个人能力了~

栗子:

lambda x: x*x
此表达式相当于有一个函数,它的参数是x,然后返回值是x*x
lambda x, y: x+y
此表达式相当于有一个函数,它的参数是x, y,然后返回值是x+y

一段代码:
def quadratic(a, b, c):
  return lambda x: a*x*x + b*x + c

f = quadratic(1, -1, 2)
#三种形式答案一样
print( f(5) )
print( quadratic(1, -1, 2)(5) )
print( (lambda x: 1*x*x + -1*x + 2)(5) )

这里 f 就是一个函数: f(x) = a*x^2 + b*x + c
quadratic返回的是一个lambda表达式,后面跟着的括号里的内容就是参数!

又一段代码:
countries = []
file = open("country_zw.csv","r",encoding='UTF-8')
for line in file:
  line = line.strip()  #去掉空格
  ar = line.split(',')  #分割
  name = ar[1]
  capt = ar[3]
  popu = int(ar[4])
  countries.append( (name, capt, popu) )

countries.sort(key = lambda country:country[2])  #排序参数

for country in countries:
  print(country)
提一下:

python3 取消了cmp 参数,参考:https://www.zhihu.com/question/30389643?sort=created

#元组内(e1, e2, e3)的优先级排列为: e1 > e2 > e3
sorted(s, key=lambda x: (x.isdigit(),x.isdigit() and int(x) % 2 == 0,x.isupper(),x)
#input: 'asdf234GDSdsf23'
#output: 'addffssDGS33224'

python的sort()和sorted()用法解释

Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。

也就是说sort()方法只有list能使用。

sort()和sorted()默认从小到大排序,也就是小的优先级比较大

key参数
从python2.4开始,list.sort()和sorted()函数增加了key参数来指定一个函数,此函数将在每个元素比较前被调用。

>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

>>> student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

同样的技术对拥有命名属性的复杂对象也适用,例如:

>>> class Student:
        def __init__(self, name, grade, age):
                self.name = name
                self.grade = grade
                self.age = age
        def __repr__(self):
                return repr((self.name, self.grade, self.age))
>>> student_objects = [
        Student('john', 'A', 15),
        Student('jane', 'B', 12),
        Student('dave', 'B', 10),
]
>>> sorted(student_objects, key=lambda student: student.age)   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

Operator 模块函数
python提供了一些方便的函数来使得访问方法更加容易和快速。
operator模块有itemgetter,attrgetter,从2.6开始还增加了methodcaller方法。
使用这些方法,上面的操作将变得更加简洁和快速:

>>> from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

operator模块还允许多级的排序,例如,先以grade,然后再以age来排序:

>>> sorted(student_tuples, key=itemgetter(2), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(student_objects, key=attrgetter('age'), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

排序的稳定性和复杂排序
从python2.2开始,排序被保证为稳定的。意思是说多个元素如果有相同的key,则排序前后他们的先后顺序不变。
你可以构建多个步骤来进行更复杂的排序,例如对student数据先以grade降序排列,然后再以age升序排列。

>>> s = sorted(student_objects, key=attrgetter('age'))     # sort on secondary key
>>> sorted(s, key=attrgetter('grade'), reverse=True)       # now sort on primary key, descending
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值