(Python)条件语句,循环语句的多种写法,以及generator expression & list comprehension的实现

一.if语句的多种写法

1.常规

if a>b:
    c = a
else:
    c = b

2.表达式

c = a if a>b else b 

3.二维列表

c = [b,a][a>b]

以上三种写法都是一个意思。

二.for...[if]...构建iterable & List (generator expression & List comprehension)

如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(List comprehensions)和生成表达式(generator expression)。

1. generator expression

(expr for iter_var in iterable) or (expr for iter_var in interable if cond_expr)

>>> multiples_of_6 = (not (i % 6) for i in range(1, 10))
>>> list(multiples_of_6)
[False, False, False]

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以应当考虑使用生成器表达式而不是列表解析.生成器表达式并不真正创建数字列表, 而是返回一个生成器generator,generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。但是我们一般通过for循环来迭代它,并且不需要关心StopIteration的错误。

于这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来。 生成器表达式使用了“惰性计算”(lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用call by need的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated),所以在列表比较长的情况下使用内存上更有效.A generator object in python is something like a lazy list. The elements are only evaluated as soon as you iterate over them. 

From:https://www.cnblogs.com/dadadechengzi/p/6292156.html

2.List comprehension

1>一列list

[expr for iter_var in iterable ] or [expr for iter_ in iterable if cond_expr]
Python中,for...[if]...语句一种简洁的构建List的方法,从for给定的List中选择出满足if条件的元素组成新的List,其中if是可以省略的。下面举几个简单的例子进行说明

​
>>> a=[12,3,4,6,7,13,21]

>>> newList =[x for x in a]

>>> newList

[12,3,4,6,7,13,21]

>>> newList2 =[x for x in a if x%2==0]

>>> newList2

[12,4,6]

​

省略if后,newList构建了一个与a具有相同元素的List。但是,newList和a是不同的List。执行b=a,b和newList是不同的。newList2是从a中选取满足x%2==0的元素组成的List。如果不使用for...[if]..语句,构建newList2需要下面的操作。

>>> newList2=[]

>>>for x in a:

... if x %2==0:

... newList2.append(x)

>>> newList2

[12,4,6]

 

2>对两组list进行操作,构成list里嵌套元组的形式(应该可以衍生到n组list 没有试过)

[对(x,y)的操作 for x in 集合1 for y in 集合2 if 条件]
嵌套的for...[if]...语句可以从多个List中选择满足if条件的元素组成新的List。

>>>a=[12,3,4,6,7,13,21]

>>>b=['a','b','x']

>>>newList=[(x, y) for x in a for y in b]

>>>newList

[(12,'a'), (12,'b'), (12,'x'), (3,'a'), (3,'b'), (3,'x'), (4,'a'), (4,'b'), (4,'x'), (6,'a'), (6,'b'), (6,'x'), (7,'a'), (7,'b'), (7,'x'), (13,'a'), (13,'b'), (13,'x'), (21,'a'), (21,'b'), (21,'x')]

>>>newList2=[(x, y) for x in a for y in b if x%2==0 and y<'x']

>>>newList2

[(12,'a'), (12,'b'), (4,'a'), (4,'b'), (6,'a'), (6,'b')]

Notice:

1)List Comprehension & generator expressions 写法上的差别是使用的括号不同。

2)当需要只是执行一个循环的时候尽量使用循环而不是列表解析,这样更符合python提倡的直观性

3)当有内建的操作或者类型能够以更直接的方式实现的,不要使用列表解析

good:
l2=l1

bad:
l2=[x for x in l1]

4)如果需要对每个元素都调用并且返回结果时,应使用L1=map(f,L), 而不是 L1=[f(x) for x in L]

Reference:https://www.cnblogs.com/dadadechengzi/p/6292156.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值