python列表生成式原理_三元表达式/和/或如何在Python中工作/真与假的性质/列表生成/生成器,and,or,执行,原理,True,False,本质,生成式...
一看标题,看似是三个不相关的问题,实际上息息相关。
我们都知道,“C系语言(C\C++、C#、Java等)”都有一个共同的知识点:三目运算符,其主要作用还是为了简化选择结构语句。让其不是那么冗杂,繁多,具体用法如下:
C语言:
#include
int main()
{
int a = 2;
int b = 3;
if(a > b)
int c = a;
else
c = b;
return 0;
}
使用三目运算符便可以这样简化以上语句:
#include
int main()
{
int a = 2;
int b = 3;
c = a > b?a:b;
return 0;
}
标识符=条件表达式?表达式1:表达式2?表达式3:表达式4
但是Python显得与“C系语言”格格不入,Python没有三目运算符,但是Python有一个东西,它与三目运算符的功能类似,我们称其为“三元表达式”。
用法如下:
a, b, c = 1, 2, 3
if a>b:
c = a
else:
c = b
可以简写为:
c = a if a>b else b
可以看到,Python的三元表达式与三目运算符的功能极其类似。可能Python开发者这样编写Python的原因就是为了增强可读性,因为运算符的长相毕竟很不友好,里面既有冒号还有问号,不知情的初学者会一脸懵逼。而换成我们熟知的if、else便会对初学者友好许多。
但实际上,想要简化代码,方法有很多。只要脑洞大,什么方法都是好方法。比如,我们可以用列表来模仿三元表达式:
c = [b, a][a > b]
还可以用经典的and、or操作符来模仿三元表达式:
c = (a>b and [a] or [b])[0]
# 改编版
c = (a>b and a or b)
这里有的读者可能不理解这里的代码,这里做出如下解释:
可以使用and和or的原因是:and和or在本质上就是个if...else语句,也就可以是三元表达式。
我们一提到and,就想到是在做逻辑运算:如下:
#0 and 1的结果是0(有零则零)
#1 and 1的结果是1(全一才一)
#0 or 1的结果的1(有一则一)
#0 or 0的结果是0(全零才零)
那为什么会是这样的结果呢?
因为and和or在本质上就是if...else语句。
表达式exp1 and exp2等价于:
if not exp1:
return exp1
else:
return exp2
那就当然可以写成:
exp1 if not exp1 else exp2
=====================================================
同理,对于or:
表达式exp1 or exp2等价于:
if exp1:
return exp1
else:
return exp2
那就当然可以写成:
exp1 if exp1 else exp2
知道了这个,就好理解and和or的本质了:
为什么 0 and 1 的结果为0呢?很简单:
if not 0:
return 0
else:
return 1
一看便知,结果是0。
为什么 0 or 1 的结果为1呢?很简单:
if 0:
return 0
else:
return 1
一看便知,结果是1。
其余情况读者可以自行尝试。
这样,如果and和or的操作数不是0或1,而是其他的数,我们也好办了。
这就引出是我们讨论的第三个问题:Python中True和False的本质。
我用经典的IPO程序设计方法(输入、处理、输出)来概括:
当True和False被用作了输入,处理的过程需要我们把他们当做整数类型来运算,那么True和False的输出分别为1和0;
当True和False被用作了输出,处理的过程需要我们把他们当做布尔类型来运算,那么True的输入可以是除零以外的任何整数值,False的输入只能是0;
现在,我举以下例子或题目帮助读者理解这两句话:
全国计算机等级考试——Python语言程序设计有这么一道例题:
给出如下代码:
import turtle
def drawLine(draw):
turtle.pendown() if draw else.penup()
turtle.fd(50)
turtle.right(90)
drawLine(Ture)
drawLine(Ture)
drawLine(Ture)
drawLine(Ture)
以下选项中描述错误的是
A.运行代码,在Python Turtle Graphics中,绘制一个正方形
B.代码 drawLine(draw)可取值为True或者False
C.代码drawLine(True)中的True替换为-1,运行代码结果不变
D.代码drawLine(True)中的True替换为0,运行代码结果不变
这道题的答案很直白,即使考生不会这道题,只要使用选择题题型独有的做题技巧(大家中学时期做过这么多的选择题,这里就不在赘述了,大家都懂),也可以把这道题的答案蒙出来,为D选项。
下面具体解释这道题:
除了if...else,Python还可以把for循环当做三元表达式用来快速生成列表:
L=[]
for x in range(1,11):
L.append(x*x)
print(L)
写这样的循环无疑是繁琐的,所以,以上代码可以等价于:
L = [x*x for x in range(1,11)]
这就是传说中的列表生成式。
我们都知道,for循环不仅仅有一层的,还有两层的for循环。
比如说:
for m in 'AB':
for n in 'CD':
L.append(m + n)
print(L)
相当于:
L = [m + n for m in 'AB' for n in 'CD']
print(L)
简洁了不止一星半点。
结果为:['AC','AD','BC','BD']。
当然了,还可以套三层或三层以上的for循环,不过很少用到,这里也不进行赘述。
我们还可以试试与if...else结合:
L = [x*x for x in range(1,11) if x%2==0]
#找到从1到10所有的偶数的平方项
看到这里,有的同学可能会这样的问题,中括号里的“x*x for x in range(1,11) if x%2==0”到底是个什么东西?
如果“x*x for x in range(1,11) if x%2==0”单独存在的话,被Python解释器认为的错误的语法。所以,它不是个东西!
但如果这个东西外面加了圆括号,那他就是传说中的“生成器”。
还是,全国计算机等级考试——Python语言程序设计有这么一道例题:
下面代码的输入结果是:
L = [1,2,3,4,5]
s1 = ','.join(str(n) for n in L)
print(s1)
A. [1,2,3,4,5] B. 1,2,3,4,5
C.[1,,2,,3,,4,,5] D.1,,2,,3,,4,,5
解析:如果考生不了解这道题join(str(n) for n in L)里面的str(n) for n in L是个什么东西,但是知道join内置函数的作用,这道题的答案也呼之欲出。首先,join函数返回的是字符串类型,故排除A、C选项。其次,观察join(str(n) for n in L)的内容,可以猜出:是把L的元素依次转化为字符串,故选B。
参考文献:
《高教版Python语言程序设计冲刺试卷(含线上题库)》黄天羽 李芬芬/著 高等教育出版社
《玩转Python,轻松过二级》·董付国/著 清华大学出版社
python列表生成式原理_三元表达式/和/或如何在Python中工作/真与假的性质/列表生成/生成器,and,or,执行,原理,True,False,本质,生成式...相关推荐
- python对应的岗位_隐式相对导入如何在Python中工作?
包是具有__init__.py文件的目录,是,并且在模块搜索路径上找到时作为模块加载.因此,如果父目录位于模块搜索路径上,则pkg只是一个可以导入并视为包的包. 但是通过将pkg / core / m ...
- python按enter退出_【cmd按任意键退出 python】
转Linux 下 Python 实现按任意键退出 某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时 ...
- python二十二:迭代,三元表达式,列表解析
迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前退) 可迭代对象:实现了迭代器协议的对象( ...
- 三元函数的几何图形一般是_三元表达式,递归,内置函数
三元表达式 三元表达式仅应用于: 1.条件成立返回一个值 2.条件不成立返回一个值. 若一般函数表达如下 比大小: def max2(x,y):if x>y: returrn xelse:ret ...
- 【Python 必会技巧】三元表达式(三目运算符)
三元表达式是编程中的一个固定格式,一般编程语言的格式为:判段条件 ? 条件为真时的结果 : 条件为假时的结果,举例说明: int A,B,C; A = 1; B = 2; C = A > B ? ...
- 用python画奥迪标志_不知道不 OK!53 个 Python 经典面试题详解
作者 | Chris 翻译 | 苏本如,责编 | 夕颜 头图 | CSDN付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 以下为译文: 本文列出53个Python面试问题,并且提供了 ...
- python测开课程_【测开课程】02 Python基础
一.Python语言的特点(优点) 1.简单易用,支持在macOS.Windows.Unix等操作系统适用 2.编程语言,大量的数据结构.支持开发大型程序 3.错误检查很多 4.高级语言,内置灵活数组 ...
- python大神作品_掌握了这24个顶级Python库,你就是大神!
全文共11815字,预计学习时长24分钟 Python有以下三个特点: · 易用性和灵活性 · 全行业高接受度:Python无疑是业界最流行的数据科学语言 · 用于数据科学的Python库的数量优势 ...
- python字符串去头尾_悉尼大学某蒟蒻的Python学习笔记
About me 本蒟蒻是悉尼大学计算机科学大一的学生,这篇博客记录了学习INFO1110这门课的一些心得,希望能对大家有帮助. To start with 因为计算机只能识别机器语言,所以我们需要编 ...
最新文章
- EXTJS之Ext.util.Observable自定义事件
- C#面向对象的三大特性
- Project Reactor展开方法
- postman 请求参数为数组及JsonObject
- 微型计算机原理设计存储系统,微机原理存储器设计讨论报告
- python源码中的学习笔记_第6章_元组
- 3月面经汇总-字节跳动,美团,腾讯算法岗
- 直线端点画垂线lisp_AutoCAD中利用AutoLISP开发小程序,实现快速画直线对称中心线...
- 常微分方程简要复习_笔记_第2章:一阶微分方程的初等解法
- ValueError: Error initializing torch.distributed using tcp:// rendezvous: port number missing
- django 使用时自定义fields的ModelSerializerield
- 对话量子链创始人帅初:区块链发展目标是构建协同进化的生命体
- 在Javascript 中的Base64加密,支持中文加密及emoji表情的unicode编码的base64加密
- 《程序员》:唯品会双11大促技术保障实践
- window服务安装、卸载
- 在zedGraph曲线上显示数据,显示波峰,寻峰算法的实现
- C语言例题——求一元二次方程的实数根
- Restful风格设计
- DLL/EXE查看工具Dumpbin
- python制作关键图谱_知识图谱neo4j—利用python进行知识入库
热门文章
- qvalue: Check that you have valid p-values or use a different range of lambda
- 20145328 《信息安全系统设计基础》第2周学习总结
- zabbix系列(八)zabbix添加对web页面url的状态监控
- JS中的值是按值传递,还是按引用传递呢?
- 【转载】Gradle命令行黑魔法
- 2013阿里技术嘉年华:阿里数据同步前世今生
- 判断IE关闭还是刷新
- ios 给网页传值_iOS开发—页面传值汇总
- WinAPI-命令规则
- 第三方服务-阿里云视频点播服务java服务端SDK相关代码