博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python基础知识-8-三元和一行代码(推导式)
阅读量:5952 次
发布时间:2019-06-19

本文共 6908 字,大约阅读时间需要 23 分钟。

 

 

1、三元运算(三目运算)

三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值

格式:[on_true] if [expression] else [on_false]
res = 值1 if 条件 else 值2

其他语言类似结构:

判段的条件?条件为真时的结果:条件为假时的结果

赋值一个变量,不满足某个条件就重新赋予另一个值一行代替四行,简化代码

a = 1b = 2            #变量值是...,如果不满足那么值是....。h = ""h = "变量1" if a>b else "变量2"  #可以设置默认设置真,不满足某个条件就等于假;可以默认设置通过,不满足某个条件就不通过,$与shell的那个判断相似,有时间增加一下print(h)------------结果:变量2a = 1     #判断是否为最大值b = 2c = 3max = a if a>b and a>c else "a不是最大值"print(max)-----------结果:a不是最大值a = 1     #和上面的对比,也可以不用变量来接收的打印b = 2c = 3print( a if a>b and a>c else "a不是最大值")-----------结果:a不是最大值a = 7         #求三个数最大值b = 6c = 5print((a if (a > b) else b) if ((a if (a > b) else b) > c) else c)-------------结果:7a = 7b = 6c = 5#print((a if (a > b) else b) if ((a if (a > b) else b) > c) else c)#      (a if (a > b) else b)     (a if (a > b) else b)d   = (a if (a > b) else b)print(d if (d>c) else c)----------------结果:7mcw = [i for i in range(1,11) if i%2==0 ]  #三元运算和列表。将1-10之间的偶数追加到列表print(mcw)---------------结果:[2, 4, 6, 8, 10]

#自我解析:某个事物有两种变化的时候使用,不满足某个条件就是选第二种变化。举例子比如:开关的开

和关;奇数是+号,偶数是-号求和;真和假的判断;作为一个旗帜等等。
#最终简化:赋值一个变量,不满足某个条件就重新赋予另一个值

 2、实现一行打印代码的原理(精简代码)

2.1基本原理:

li=["小","马","过","河"]print([i for i in li])   ------------------结果:['小', '马', '过', '河']
li=["小","马","过","河"] print([i+"*" for i in li])     #一行代码实现列表循环。i是每个元素,对i做操作那么每个列表元素都会做相同的操作。单行批量对列表元素进行操作。 -----------------------结果: ['小*', '马*', '过*', '河*']
li=["小","马","过","河"] print([i+"*" for i in li if type(li)==list])  #添加条件判断 ---------------------结果: ['小*', '马*', '过*', '河*']
使用场景:对列表元素批量操作,只需要实现对列表单个元素实现一行执行(上题自变量i就是代表单个自变量,只需考虑对它操作),就可以实现单行代码实现有循环的功能

 

2.2精简案例:

请将ip=192.168.12.79中的四个十进制数转换成二进制,将四个二进制数拼接成一个二进制数并转换为十进制。(注意:12转换为二进制位数不满8位)

#精简之前 ip="192.168.12.79"li=ip.split(".")li2=[]for i in li:    m=str(bin(int(i))).lstrip("0b")    m="0"*(8-len(m))+m    li2.append(m)mcw="".join(li2)print(int(mcw,base=2)) -----------------------结果: 3232238671 #精简之后
print(int("".join(["0"*(8-len(str(bin(int(i))).lstrip("0b")))+str(bin(int(i))).lstrip("0b") for i in ip.split(".")]),base=2))

 

 2.3单行实现列表元素的批量操作并且if判断某个条件真假,真假各自返回不同结果(三木运算结合列表)

li=["小","马","过","河"]        a=[i+"*" for i in li ]b=[i+"_" for i in li ]print(a if "马" in li else b)----------------结果:['小*', '马*', '过*', '河*']      #判断为真需要返回的结果ali=["小","马","过","河"]      a=[i+"*" for i in li ]b=[i+"_" for i in li ]print(a if "魔" in li else b)-------------------结果:['小_', '马_', '过_', '河_']      #判断为假需要返回的结果bli=["小","马","过","河"]print([i+"*" for i in li ] if "过" in li else [i+"_" for i in li ])    #将a,b变量的值直接替换a,b变量的位置,单行实现功能-------------结果:['小*', '马*', '过*', '河*']

 2.4、单行实现给每个列表元素加*并加一个序列,使得列表元素对应有序。(两个不同的for循环)

li=["小","马","过","河"]a=[i+"*" for i in li ]b=[str(j)+" "+a[j] for j in range(0,len(a))]print(b)----------------------结果:['0 小*', '1 马*', '2 过*', '3 河*'] 变量代入代码后:
li=["小","马","过","河"]print([str(j)+" "+[i+"*" for i in li ][j] for j in range(0,len([i+"*" for i in li ]))])

2.5、if判断,指定哪个列表元素做或者不做批量操作

li=["小","马","过","河"]a=[i for i in li if i!="过"]print(a)-----------------------结果:['小', '马', '河']

 2.6、列表中可以用多个for循环,此次演示两个for循环

a=[str(i)+j  for i in range(1,5) for j in ["小","马","过","河"]]print(a)--------------------------结果:['1小', '1马', '1过', '1河', '2小', '2马', '2过', '2河', '3小', '3马', '3过', '3河', '4小', '4马', '4过', '4河']

 2.7、集合和字典也可以这样支持这些操作

a={i for i in range(0,5)}print(a,type(a))--------------------------结果:{
0, 1, 2, 3, 4}
m={i:j for i in range(1,4) for j in range(1,4)} print(m,type(m)) -----------结果: {1: 3, 2: 3, 3: 3} 

2.8、一行代码实现九九乘法表。让变量成为 [for 循环]

a="\n".join(["  ".join(["%s*%s"%(i,j) for j in range(1,i+1)]) for i in range(1,10)])print(a)------------------------结果:1*12*1  2*23*1  3*2  3*34*1  4*2  4*3  4*45*1  5*2  5*3  5*4  5*56*1  6*2  6*3  6*4  6*5  6*67*1  7*2  7*3  7*4  7*5  7*6  7*78*1  8*2  8*3  8*4  8*5  8*6  8*7  8*89*1  9*2  9*3  9*4  9*5  9*6  9*7  9*8  9*9

 2.10九九乘法表一行实现过程分解

a=[i for i in range(1,5)]print(a)b=[["%s*%s"%(i,j) for j in range(1,i+1)] for i in range(1,5)]print(b)c=[" ".join(["%s*%s"%(i,j) for j in range(1,i+1)]) for i in range(1,5)]print(c)d="\n".join([" ".join(["%s*%s"%(i,j) for j in range(1,i+1)]) for i in range(1,5)])print(d)------------------------结果:[1, 2, 3, 4][['1*1'], ['2*1', '2*2'], ['3*1', '3*2', '3*3'], ['4*1', '4*2', '4*3', '4*4']]  #生成嵌套列表['1*1', '2*1 2*2', '3*1 3*2 3*3', '4*1 4*2 4*3 4*4']#用jion方法将每个子列表的元素分解成指定分隔符的字符串,形成每行要显示的内容。已经将每行的内容变成列表元素了1*1            #每个列表元素都是一行的内容,用jion方法将每个元素用换行符拼接起来,实现换行2*1 2*23*1 3*2 3*34*1 4*2 4*3 4*4 思路:每行输出用生成的嵌套子列表,每列输出用列????? join可以实现列表每个元素换行输出(换行符作为分隔符), join可以实现每个列表元素指定分隔符(包括空格符)拼接 jion可以实现将嵌套子列表生成字符串拼接 列表内循环([i for i in ... ])可以生成嵌套列表,jion可以分解列表成字符串。 jion加列表内循环可以用一行代码实现有规律的多行打印 jion加列表内循环可以用一行代码实现99乘法表等多行的结构

 2.11、[如果不能返回多个变量,那么将多个变量放到一个数据类型返回]

题目:(a+b+c=1000,a^2+b^2=c^2,a,b,c属于整数,求a,b,c的组合。)执行有点慢,1000^3次循环呢

print([ [a,b,c] for a in range(0,1001) for b in range(0,1001) for c in range(0,1001) if a+b+c==1000 and a**2+b**2==c**2]) ---------结果: [[0, 500, 500], [200, 375, 425], [375, 200, 425], [500, 0, 500]]

 2.12、列表推导式和字典推导式结合,由此得出将两个列表元素一个当键一个当值做成字典

print([[ i for i in range(3)] for i in range(3)])print([{
"k"+str(i):"v"+str(j) for j in range(3)} for i in range(3)])print([["k"+str(i)+":"+"v"+str(j) for j in range(3)] for i in range(3)])print([[{
"k"+str(i):"v"+str(j)} for j in range(3)] for i in range(3)])-------------结果:[[0, 1, 2], [0, 1, 2], [0, 1, 2]][{
'k0': 'v2'}, {
'k1': 'v2'}, {
'k2': 'v2'}][['k0:v0', 'k0:v1', 'k0:v2'], ['k1:v0', 'k1:v1', 'k1:v2'], ['k2:v0', 'k2:v1', 'k2:v2']][[{
'k0': 'v0'}, {
'k0': 'v1'}, {
'k0': 'v2'}], [{
'k1': 'v0'}, {
'k1': 'v1'}, {
'k1': 'v2'}], [{
'k2': 'v0'}, {
'k2': 'v1'}, {
'k2': 'v2'}]] 两个列表元素一个当键一个当值做成字典
li1=["name","age","hobby"] li2=["mcw,18,study","xiaoma,19,music","yh,10,eat"] print([[li1[j]+":"+li2[i].split(",")[j] for j in range(0,len(li1))] for i in range(0,len(li2))]) mcw=[{li1[j]:li2[i].split(",")[j] for j in range(0,len(li1))} for i in range(0,len(li2))] print(mcw) print(type(mcw[0])) -------------结果:

[['name:mcw', 'age:18', 'hobby:study'], ['name:xiaoma', 'age:19', 'hobby:music'], ['name:yh', 'age:10', 'hobby:eat']]

[{'name': 'mcw', 'age': '18', 'hobby': 'study'}, {'name': 'xiaoma', 'age': '19', 'hobby': 'music'}, {'name': 'yh', 'age': '10', 'hobby': 'eat'}]
<class 'dict'>

 2.12、列表 推导式实现多个条件判断

如果a=1,输出m,如果a=2,输出c,如果否则输出m

原操作:

a=3if a==1:    print("m")elif a==2:    print("c")else:    print("w")----------------结果:w

推导式实现步骤:

a=3print(["m" if a==1 else ["c" if a==2 else "w"]])---------------结果:[['w']]a=3print(["m" if a==1 else "".join(["c" if a==2 else "w"])])--------------结果:['w']a=3print("".join(["m" if a==1 else "".join(["c" if a==2 else "w"])]))-----------结果:wa=2print("".join(["m" if a==1 else "".join(["c" if a==2 else "w"])]))----------结果:ca=1print("".join(["m" if a==1 else "".join(["c" if a==2 else "w"])]))-----------------结果:m

 2.13生成器推导式:

 

 3、一行定义简单函数:lambda函数

4、map函数使用

 

进制参考链接:https://www.cnblogs.com/ds-3579/p/5246142.html

转载于:https://www.cnblogs.com/machangwei-8/p/10668571.html

你可能感兴趣的文章
JAVAEE-junit测试hibernate里的方法(hibernate交给spring管理)的问题
查看>>
MOTO MB860 国行2.3.5优化增强ROM_Top_T5_end(经典收藏版)
查看>>
C#学习经典(二)---MVC框架(Model view Controller)
查看>>
log4j配置文件说明
查看>>
Maven: 为Compiler插件设置source和target版本
查看>>
linux下永久添加静态路由
查看>>
android 全局变量和局部变量命名规则
查看>>
Ubuntu Sub-process /usr/bin/dpkg
查看>>
详解DNS的常用记录(下):DNS系列之三
查看>>
linux的日志服务器关于屏蔽一些关键字的方法
查看>>
事情的两面性
查看>>
只要会营销,shi都能卖出去?
查看>>
sed单行处理命令奇偶行输出
查看>>
走向DBA[MSSQL篇] 从SQL语句的角度 提高数据库的访问性能
查看>>
VC++深入详解学习笔记1
查看>>
安装配置discuz
查看>>
CentOS7 64位小型操作系统的安装
查看>>
线程互互斥锁
查看>>
KVM虚拟机&openVSwitch杂记(1)
查看>>
win7下ActiveX注册错误0x80040200解决参考
查看>>