Discuss / Python / 另外一个问题

另外一个问题

Topic source

L = ['Hello', 'World', 18, 'Apple', None] print ([s.lower() if isinstance(s, str) else s for s in L ]) 这个样子输出的结果是 ['hello', 'world', 18, 'apple', None] 我当然知道正确的做法是: L2 = [s.lower() for s in L1 if isinstance(s,str)] 我想问的是,if放for前面跟放for后面有什么区别? 大神帮我理一下逻辑,说说流程。

[xx if x%2==0 else x for x in range(1,11)] 返回的结果是[1, 4, 3, 16, 5, 36, 7, 64, 9, 100] [xx for x in range(1,11) if x%2 == 0] 返回的结果是[4,16,36,64,100] 根据这两个我自己分析了下,猜测是这么回事。 第一个式子将if写在前面是对for遍历后的结果进行操作,也就是说for先遍历,得到1-10十个数。 然后你是对这十个数进行if操作,在你筛选后必然有结果不满足条件,这个时候如果你没有else语句。 则程序不知道应该将不满足条件的怎么输出。所以就必须有else语句,程序输出你else语句的要求。 第二个式子,则是在遍历的时候就进行筛选,只将满足条件的才放入到x 然后进行x*x. 不知道这么理解对不对。说说你们的看法。

焓焱

#3 Created at ... [Delete] [Delete and Lock User]

个人浅解: 1、第一个语句:print ([s.lower() if isinstance(s, str) else s for s in L ]) 可翻译成: L2=[] for s in L: if isinstance(s,str): L2.append(s.lower()) else: L2.append(s)

2、第二个语句:L2 = [s.lower() for s in L1 if isinstance(s,str)] 可翻译成: for s in L: if isinstance(s,str): s.lower()

另外我也测试了一下,如果if放在for前面,那么就要写完整的表达式,必须要有else,所以翻译过来就是第一种了。由于多了else,所以就会在if不成立的时候把s原封不动的追加到列表内。

焓焱

#4 Created at ... [Delete] [Delete and Lock User]

噢,第二个翻译最后一句写错了,正确的应该是: L2=[] for s in L: if isinstance(s,str): L2.append(s.lower())


  • 1

Reply