一看标题,看似是三个不相关的问题,实际上息息相关。

我们都知道,“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,本质,生成式...相关推荐

  1. python对应的岗位_隐式相对导入如何在Python中工作?

    包是具有__init__.py文件的目录,是,并且在模块搜索路径上找到时作为模块加载.因此,如果父目录位于模块搜索路径上,则pkg只是一个可以导入并视为包的包. 但是通过将pkg / core / m ...

  2. python按enter退出_【cmd按任意键退出 python】

    转Linux 下 Python 实现按任意键退出 某天在群内有同学问到,在python下我用input或者raw_input都得输入完后回车才能获取到输入的值,那如何实现任意键退出暂停等功能呢,我当时 ...

  3. python二十二:迭代,三元表达式,列表解析

    迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走,不能往前退)   可迭代对象:实现了迭代器协议的对象( ...

  4. 三元函数的几何图形一般是_三元表达式,递归,内置函数

    三元表达式 三元表达式仅应用于: 1.条件成立返回一个值 2.条件不成立返回一个值. 若一般函数表达如下 比大小: def max2(x,y):if x>y: returrn xelse:ret ...

  5. 【Python 必会技巧】三元表达式(三目运算符)

    三元表达式是编程中的一个固定格式,一般编程语言的格式为:判段条件 ? 条件为真时的结果 : 条件为假时的结果,举例说明: int A,B,C; A = 1; B = 2; C = A > B ? ...

  6. 用python画奥迪标志_不知道不 OK!53 个 Python 经典面试题详解

    作者 | Chris 翻译 | 苏本如,责编 | 夕颜 头图 | CSDN付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 以下为译文: 本文列出53个Python面试问题,并且提供了 ...

  7. python测开课程_【测开课程】02 Python基础

    一.Python语言的特点(优点) 1.简单易用,支持在macOS.Windows.Unix等操作系统适用 2.编程语言,大量的数据结构.支持开发大型程序 3.错误检查很多 4.高级语言,内置灵活数组 ...

  8. python大神作品_掌握了这24个顶级Python库,你就是大神!

    全文共11815字,预计学习时长24分钟 Python有以下三个特点: · 易用性和灵活性 · 全行业高接受度:Python无疑是业界最流行的数据科学语言 · 用于数据科学的Python库的数量优势 ...

  9. python字符串去头尾_悉尼大学某蒟蒻的Python学习笔记

    About me 本蒟蒻是悉尼大学计算机科学大一的学生,这篇博客记录了学习INFO1110这门课的一些心得,希望能对大家有帮助. To start with 因为计算机只能识别机器语言,所以我们需要编 ...

最新文章

  1. EXTJS之Ext.util.Observable自定义事件
  2. C#面向对象的三大特性
  3. Project Reactor展开方法
  4. postman 请求参数为数组及JsonObject
  5. 微型计算机原理设计存储系统,微机原理存储器设计讨论报告
  6. python源码中的学习笔记_第6章_元组
  7. 3月面经汇总-字节跳动,美团,腾讯算法岗
  8. 直线端点画垂线lisp_AutoCAD中利用AutoLISP开发小程序,实现快速画直线对称中心线...
  9. 常微分方程简要复习_笔记_第2章:一阶微分方程的初等解法
  10. ValueError: Error initializing torch.distributed using tcp:// rendezvous: port number missing
  11. django 使用时自定义fields的ModelSerializerield
  12. 对话量子链创始人帅初:区块链发展目标是构建协同进化的生命体
  13. 在Javascript 中的Base64加密,支持中文加密及emoji表情的unicode编码的base64加密
  14. 《程序员》:唯品会双11大促技术保障实践
  15. window服务安装、卸载
  16. 在zedGraph曲线上显示数据,显示波峰,寻峰算法的实现
  17. C语言例题——求一元二次方程的实数根
  18. Restful风格设计
  19. DLL/EXE查看工具Dumpbin
  20. python制作关键图谱_知识图谱neo4j—利用python进行知识入库

热门文章

  1. qvalue: Check that you have valid p-values or use a different range of lambda
  2. 20145328 《信息安全系统设计基础》第2周学习总结
  3. zabbix系列(八)zabbix添加对web页面url的状态监控
  4. JS中的值是按值传递,还是按引用传递呢?
  5. 【转载】Gradle命令行黑魔法
  6. 2013阿里技术嘉年华:阿里数据同步前世今生
  7. 判断IE关闭还是刷新
  8. ios 给网页传值_iOS开发—页面传值汇总
  9. WinAPI-命令规则
  10. 第三方服务-阿里云视频点播服务java服务端SDK相关代码