pythonlambdalist
new_donor_data=dict(map(lambdax:(x,[y*2foryindonor_data[x]]),donor_data.keys()))
B. python中map(lambda x: x % mydict, mylist)是什么意思
我估计你的 mylist 是一个list,里面存的是格式化字符串,而 mydict 则是一个记录格式化字符串中所需要用到的参数信息,比如类似于下面的代码
mylist=["mynameis%(name)s","andmyageis%(age)d"]
mydict={'name':'Tom','age':13}
result=map(lambdax:x%mydict,mylist)
forsinresult:
prints
就可以得到下面的打印
my name is Tom
and my age is 13
另外一种可能,就是 mylist 里存的是整数,而 mydict 是一个整数,这样了话,map语句是将 mylist 里每一个整数对 mydict 进行取余操作,这个有点不太合理,没必要对一个整数命名成 mydict。
C. Python 中的 lambda 和lambda 有什么区别
Python的lambda里只能写一行啦、不能有statement只能有expression啦,这些还是小问题,真正的问题是Python对Closure的实现根本是有缺陷的。闭包的实现都是错误的,哪来的真正的匿名函数?
比如在Python2里这样的代码是没法运行的,
def counter():
count = 0
def inner():
count += 1
return count
return inner
c = counter()
print c()
Python告诉你一个UnboundLocalError,count为什么会unbound呢,因为closure没有正确地实现。什么是closure呢,closure是一个二元组:lambda(别管是有名字的还是没名字的),和这个lambda定义时的environment。而这个environment包含了lambda中的自由变量(比如这里的count),这样才把这个lambda‘封闭’起来了,所以叫闭包。
我所理解的‘真正的’的lambda是说:完整地支持higher-order function,即函数可以作为函数的参数,也可以作为函数的返回值,那怕引入了mutation。为了达到这一点,语言的实现需要正确地实现closure和lexical scope。而mutation和lexical scope是两个正交的概念,Python因为有mutation而没有完整实现lexical scope进而没有完整地支持first-order function,这就叫broken lambda。Python3里新加的nonlocal关键字就是为了解决closure的历史问题。
然而同样的代码在Racket/Scala/OCaml里却可以跑地欢快:
(define (counter)
(define count 0)
(define (inner)
(begin (set! count (add1 count))
count))
inner)
(define c (counter))
(c) ;1
(c) ;2
(c) ;3
def counter(): () => Int = {
var count = 0
def inner() = {
count += 1
count
}
inner
}
val c = counter()
println(c())
println(c())
println(c())
let counter () =
let count = ref 0 in
let inner () =
count := !count + 1;
!count
in inner
;;
let c = counter();;
print_int(c());
print_int(c());
print_int(c());
真正的lambda就是正确而完整地实现了lexical scope和closure的lambda。这就是python的lambda和‘真正的’的lambda的区别。
当然Python并不是函数式语言,Python也从来没有自我标榜是函数式语言,当年lambda都是一个Lisp程序员给Python加的,而且据说当时Guido是强烈反对的……
BTW,lambda这个名字确实没什么神秘的
===
Update:
经灵剑提醒,由于Racket和Python中对于list comprehension的实现不同,list comprehension的例子是不太恰当的。Racket中的list comprehension经过宏展开后是递归的函数调用的形式,而类似的python代码可能是这样的:
map(lambda i: lambda n: i+n, range(10))[3](4)
这个时候Python的行为和Racket是一样的。但对于list comprehension而言,Python并不是函数式语言(again),同Haskell、Scala、Racket这些的实现是不同的,在comprehension的过程中并没有创建出各自包含i的闭包。
原:
比如这个Python代码:
fs = [(lambda n: i + n) for i in range(10)]
fs[3](4)
fs[3](4)应该是几呢?Python告诉你是13 = = 因为每一个lambda都share了相同的i。
同样的代码再看看Racket里呢:
(define fs
(for/list ([i (range 10)])
(λ (n) (+ i n))))
((fourth fs) 4)
Racket里正确地告诉你结果是7。
D. python中lambda和itemgetter的区别
operator.itemgetter函数 operator模块提供itemgetter函数用于获取象哪些维数据参数些序号(即需要获取数据象序号)面看例 a = [一,二,三] >>> b=operator.itemgetter(一) //定义函数b获取象第一域值 >>> b(a) 二 >>> b=operator.itemgetter(一,0) //定义函数b获取象第一域第0值 >>> b(a) (二, 一) 要注意operator.itemgetter函数获取值定义函数通该函数作用象才能获取值 sorted函数 Python内置排序函数sortedlist或者iterator进行排序官中国文档见:中国docs.python.org/二/library/functions.html?highlight=sorted#sorted该函数原型: sorted(iterable[, cmp[, key[, reverse]]]) 参数解释: (一)iterable指定要排序list或者iterable用说; (二)cmp函数指定排序进行比较函数指定函数或者lambda函数: students类象list没员三域用sorted进行比较自定cmp函数例要通比较第三数据员排序代码写: students = [('john', 'A', 一5), ('jane', 'B', 一二), ('dave', 'B', 一0)] sorted(students, key=lambda student : student[二]) (三)key函数指定取待排序元素哪项进行排序函数用面例说明代码: sorted(students, key=lambda student : student[二]) key指定lambda函数功能元素student第三域(即:student[二])sorted排序students所元素第三域进行排序 面operator.itemgetter函数用该函数实现例要通student第三域排序写: sorted(students, key=operator.itemgetter(二)) sorted函数进行级排序例要根据第二域第三域进行排序写: sorted(students, key=operator.itemgetter(一,二)) 即先跟句第二域排序再根据第三域排序 (四)reverse参数用说bool变量表示升序降序排列默认false(升序排列)定义True按降序排
E. python中使用lambda实现标准化
lambda函数一般是在函数式编程中使用的。通举个栗子,对于这样一个list L,求L中大于3的元素集合L = [1, 2, 3, 4, 5]对于过程式编程,通常会这么写L3 = []for i in L:if i 3:L3.append(i)而对于函数式变成,只需要给filter函数一个判断函数就行了def greater_than_3(x):return x 3L3 = filter(greater_than_3, L)由于这个判断函数非常简单,用lambda来实现就非常简洁、易懂L3 = filter(lambda x: x 3, L)这是个很简单的例子,可以看出lambda的好处。lambda函数更常用在map和rece两个函数中。当然,lambda函数也不见得都好,它也可以被用得很复杂,比如这个问题的答案,可以用python这样一句解决,这个lambda函数看起来那的确是挺辛苦的。
F. python中rece和lambda的一个小问题
rece(function, sequence, starting_value)
对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用。
lambda 允许你快速定义单行的最小函数,例如:
a=lambda x: x^2
a(3) 则返回整数9.
回头来看你的函数,lambda定义了一函数关于 x,y的关系式, 返回x*y+1的值,rece中的sequence是一个list,顺序取出x=0,y=0,第一次返回x=0,y=0,(x,y)=1,然后第二再取值,x=x,出错了,list中的x没有定义。
G. python的lambda形式的理解
lambda 创建一个匿名函数。冒号前面是传入参数,后面是一个处理传入参数的单行表达式。
调用lambda函数返回表达式的结果。
list的sort 同于内建函数sorted。它有三个参数cmp,key,reverse,均有默认值。
cmp是一个比较器,自定义比较器的话传入两个参数x,y,返回值限制为1(x>y), 0(x=y), -1(x<y)。默认是常规比较,数字比较,字符串比较等等。
key是对序列元素处理(比如问题中序列元素仍是序列,就可以再对序列取索引值),也就是sort的比较器实际接收到值是key处理后的结果(问题中实际参与比较的是1,2,3,4)。
reverse默认是False,意思是从小到大排序,传入True,就从大到小排。
H. Python lambda怎么写
tim@crunchbang:~$python
Python2.7.3(default,Mar142014,11:57:14)
[GCC4.7.2]onlinux2
Type"help","right","credits"or"license"formoreinformation.
>>>wordsList=['cat','elephant','rat','rat','cat']
>>>result=map(lambdax:(x,1),wordsList)
>>>result
[('cat',1),('elephant',1),('rat',1),('rat',1),('cat',1)]
>>>
I. python lambda怎么找到含有某个字的所有项
importre
count=0
foriindic:
forjindic[i]:
ifre.search(r'snRNA',j):
count+=1
printj
printcount