vs00ASPNET 2020-02-15
https://www.cnblogs.com/xiexiaoxiao/p/7772441.html
https://blog.csdn.net/su_bao/article/details/81484483
https://blog.csdn.net/leavemetomorrow/article/details/90641362
1. 当只有 if 时,列表生成式构造为 [最终表达式 - (范围选择 - 范围过滤)]
>>> [num ** 2 for num in range(10) if num % 2 == 0]
[0, 4, 16, 36, 64]
如果 if 和 for 的位置调换,则会报错。
>>> [num ** 2 if num % 2 == 0 for num in range(10)]
File "<stdin>", line 1
[num ** 2 if num % 2 == 0 for num in range(10)]
^
SyntaxError: invalid syntax
2. 当同时有 if 和 else 时,列表生成式构造为 [最终表达式 - 条件分支判断 - 范围选择]
>>> [num ** 2 if num % 2 == 0 else 0 for num in range(10)]
[0, 0, 4, 0, 16, 0, 36, 0, 64, 0]
如何 if 和 for 的位置调换,则会报错。
>>> [num **2 for num in range(10) if num % 2 == 0 else 0]
File "<stdin>", line 1
[num **2 for num in range(10) if num % 2 == 0 else 0]
^
SyntaxError: invalid syntax
官方文档并没有提及到这个。我就说一下我的理解方法。
1,python解释器看到列表生成式会先找关键字 for,for 后面的部分是为了筛选需要显示的数字,for 前面的表达式则是对这些数字进行进一步加工。
2,当只有 if 而没有 else 时,此时迭代器 range 里面的元素会被筛选,只有偶数才会进行下一步操作;筛选好之后,再进行平方操作。这里if的作用是为了筛选。
3, 当同时有 if 和 else 时,此时迭代器中的所有元素都将会在下一步被处理,然后就是偶数的进行平方,奇数的显示为0。这里 if 和 else 的作用则是为了进行不同条件下的处理。
因写多了判断语句,看着短短的代码却占据来好几行,于是便搜下if-else简洁的写法,结果也是发现新大陆
4种:
第1种:__就是普通写法
a, b, c = 1, 2, 3 if a>b: c = a else: c = b
第二种:一行表达式,为真时放if前
c = a if a>b else b
第三种:二维列表,利用大小判断的0,1当作索引
c= [b, a][a > b]
第四种:传说中的黑客,利用逻辑运算符进行操作,都是最简单的东西,却发挥无限能量啊
c = (a>b and [a] or [b])[0] # 改编版 c = (a>b and a or b)
第四种最有意思了,
利用and 的特点,若and前位置为假则直接判断为假。
利用 or的特点,若or前位置为真则判断为真。
# 从前往后找,and找假,or找真 # 前真返后, print(111 and 222) # 222 # 前假返前 print(0 and 333) #0 # 若x真【x】, x假,y真【y】,xy假【y】,只有前真返回前 print(111 or 222) #111 print(0 or 222) #222 print(‘‘ or 0) # 0
对于c = (a>b and a or b)而言,若(a>b and a) 真:a >b and a, 则a > b 为真 假:b, 则 a> b为假
补充:对于and的理解
id_ = ‘12345‘ # 判断长度为5或者为8 if len(id_) == 5 or len(id_) == 8: print(id_, ‘------‘) # 相反的表达为非5且非8 if len(id_) != 5 and len(id_) != 8: print(id_, ‘+++++++‘)