基本比较
列表生成式:[ ]
生成器:generator ()
匿名函数:λ:lambda
列表生成式
列表生成式就是生成一个特定列表的表达式,基本语法:[exp for iter_var in iterable],例如:
这样写比用循环语句来写要简单很多。注意不要忘记把式子用中括号括起来,因为你要生成的是列表。
>>> listA=[1,2,3,4,5] 实现每个元素都平方
# 方法1:列表和循环实现
>>> listC=[]
>>> for i in listA:
listC.append(i*i)
>>> listC
[1, 4, 9, 16, 25]
# 方法2:封装在函数里
>>> def funcA1(a):
listD=[]
for i in a:
listD.append(i*i)
return listD
>>> funcA1(listA)
[1, 4, 9, 16, 25]
# 方法3:列表生成式
>>> listA=[1,2,3,4,5]
>>> listB=[x*x for x in listA]
>>> listB
[1, 4, 9, 16, 25]
列表生成式的各种例子
[ 表达式/语句 for [for] [if] ]
(1)表达式/语句
(2)可以有1-N(一般2~3)个for循环
而且,是多层循环,并非独立循环,见字符串kfc那个例子
(3)有1个if?
(4) 中间只有空格,没有任何逗号等!!!
>>> listA1=[2*a for a in range(10)]
>>> listA1
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> listA2=[a*b+1 for a in range(10) for b in range(5)]
>>> listA2
[1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 1, 3, 5, 7, 9, 1, 4, 7, 10, 13, 1, 5, 9, 13, 17, 1, 6, 11, 16, 21, 1, 7, 13, 19, 25, 1, 8, 15, 22, 29, 1, 9, 17, 25, 33, 1, 10, 19, 28, 37]
>>> listA3=[2*a for a in range(10) if a%2==1]
>>> listA3
[2, 6, 10, 14, 18]
>>> genA1=(2*a for a in range(10) if a%2==0)
>>> genA1
<generator object <genexpr> at 0x0000000002F13570>
>>>
>>> [m+n for m in "kfc" for n in "McDonald"]
['kM', 'kc', 'kD', 'ko', 'kn', 'ka', 'kl', 'kd', 'fM', 'fc', 'fD', 'fo', 'fn', 'fa', 'fl', 'fd', 'cM', 'cc', 'cD', 'co', 'cn', 'ca', 'cl', 'cd']
>>> [a+b for a in range(1,3) for b in range(1,3)]
[2, 3, 3, 4]
>>> for a in range(1,3):
for b in range(1,3):
print(a+b)
2
3
3
4
# 可以很方便的用 lower()等改变string的大小写,但是,list的怎么改大小写?得这么改才行。
>>> listA1=["Jack","TOM","luCY","joe"]
>>> listA2=[x.lower() for x in listA1]
>>> listA2
['jack', 'tom', 'lucy', 'joe']
生成器 generator
这种一边循环一边计算的机制,称为生成器:generator。
语法: (表达式/语句 for [for] [if] )
(1)表达式/语句
(2)可以有1-N(一般2~3)个for循环
而且,是多层循环,并非独立循环,见字符串kfc那个例子
(3)有1个if?
(4) 中间只有空格,没有任何逗号等!!!
可用两种方法取值 next()
嵌套写next() 会有问题----未知!会导致每次都是计算第1个数据,不往下next了
>>> next((x*x for x in [1,2,3]))
1
>>> next((x*x for x in [1,2,3]))
1
>>> g2=(x*x for x in [1,2,3])
可以往下顺次取数
>>> next(g2)
1
>>> next(g2)
4
>>> next(g2)
9
可用两种方法取值 for循环
>>> g3=(x*x for x in [1,2,3,4,5])
>>> for i in g3:
print(i)
1
4
9
16
25
斐波拉契数列
(1)函数实现
我自己写的
>>> def feibolaqi(max):
listA1=[]
a,b=0,1
for i in range(max):
a,b=b,a+b
listA1.append(a)
listA1.append(b)
return listA1
>>> feibolaqi(20)
[1, 1, 1, 2, 2, 3, 3, 5, 5, 8, 8, 13, 13, 21, 21, 34, 34, 55, 55, 89, 89, 144, 144, 233, 233, 377, 377, 610, 610, 987, 987, 1597, 1597, 2584, 2584, 4181, 4181, 6765, 6765, 10946]
廖雪峰网上的例子,有修改,返回了一个list
>>> def fib(max):
listA2=[]
a,b,n=0,1,1
while n <max:
a,b=b,a+b
n+=1
listA2.append(a)
listA2.append(b)
return listA2
>>> fib(20)
[1, 1, 1, 2, 2, 3, 3, 5, 5, 8, 8, 13, 13, 21, 21, 34, 34, 55, 55, 89, 89, 144, 144, 233, 233, 377, 377, 610, 610, 987, 987, 1597, 1597, 2584, 2584, 4181, 4181, 6765]
(2)函数加yield变成生成器
>>> def fib(max):
listA2=[]
a,b,n=0,1,1
while n <max:
yield b
a,b=b,a+b
n+=1
listA2.append(a)
listA2.append(b)
return listA2
>>> fib(20)
<generator object fib at 0x00000000033782A0>
匿名函数lambda
匿名函数lambda x: x * x
语法:lambda 参数:表达式(只能1个)
(1) 没有函数名,不担心函数名冲突的问题
(2)只能有1个表达式(表达式一定有返回值)
(3)参数可以没有 没有时,也必须有: 比如无参数时 lambda:
(4) 等价匿名函数lambda x: x * x
实际上就是
def f(x):
return x*x
>>> def build(x,y):
return lambda:x*x+y*y
>>> f1=build(1,3)
>>> f1()
10
>>>
>>> funcAA1=(lambda n:1 if n==1 else n*funcAA1(n-1))
>>> funcAA1(5)
120
#嵌套map映射函数
>>> list(map(lambda x:x*x,[1,2,3,4,5]))
[1, 4, 9, 16, 25]