《笨办法学Python》(24)--列表生成式 [],生成器(),带yield的函数==生成器, lambda 匿名函数λ

版权声明:一起学习,一起成长,欢迎关注犀牛先生的博客 https://blog.csdn.net/xuemanqianshan/article/details/85119080

基本比较

列表生成式:[ ]

生成器: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]

猜你喜欢

转载自blog.csdn.net/xuemanqianshan/article/details/85119080