Python基础(9)三元表达式、列表解析、生成器表达式

一、三元表达式

三元运算,是对简单的条件语句的缩写。

# if条件语句

if x > f:
    print(x)
else:
    print(y)

  

# 条件成立左边,不成立右边

x if x > y else y    # 三元表达式

python的三元运算格式如下:

result=值1 if x<y else 值2

  

# 如果条件成立,那么将“值1”赋值给result变量,否则,将“值2”赋值给result变量

二、列表解析

列表解析:用三元表达式,将结果写入列表,即为列表解析

运用列表生成式,可以写出非常简洁的代码。

如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:

#方法一
L = []
for x in range(1, 11):
    L.append(x * x)

#结果L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 方法二:列表解析
[x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

for循环后面还可以加上if判断:

[x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

还可以使用两层循环,可以生成全排列:

[m+n for m in ‘ABC‘ for n in ‘XYZ‘]
[‘AX‘, ‘AY‘, ‘AZ‘, ‘BX‘, ‘BY‘, ‘BZ‘, ‘CX‘, ‘CY‘, ‘CZ‘]

三层和三层以上的循环就很少用到了。

for循环还可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:

d = {‘x‘: ‘A‘, ‘y‘: ‘B‘, ‘z‘: ‘C‘ }
for k, v in d.items():
     print(k, ‘=‘, v)

y = B
x = A
z = C:

因此,列表生成式也可以使用两个变量来生成list:

d = {‘x‘: ‘A‘, ‘y‘: ‘B‘, ‘z‘: ‘C‘ }
[k + ‘=‘ + v for k, v in d.items()]
[‘y=B‘, ‘x=A‘, ‘z=C‘]

列表解析实例

#遍历s=‘hello‘
l=[]
for i in s:
    res=i.upper()
    l.append(res)
print(l)
#####################################
#列表解析:
s=‘hello‘
res=[i.upper() for i in s]
print(res)
要求:列出1~10所有数字的平方
####################################################
1、普通方法:
>>> L = []
>>> for i in range(1,11):
...     L.append(i**2)
...
>>> print L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
####################################################
2、列表解析
>>>L = [ i**2 for i in range(1,11)]
>>>print L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
要求:列出1~10中大于等于4的数字的平方
####################################################
1、普通方法:
>>> L = []
>>> for i in range(1,11):
...     if i >= 4:
...         L.append(i**2)
...
>>> print L
[16, 25, 36, 49, 64, 81, 100]
####################################################
2、列表解析
>>>L = [ i**2 for i in range(1,11) if i >= 4 ]
>>>print L
[16, 25, 36, 49, 64, 81, 100]
要求:列出"/var/log"中所有已‘.log‘结尾的文件
##################################################
1、普通方法
>>>import os
>>>file = []
>>> for file in os.listdir(‘/var/log‘):
...     if file.endswith(‘.log‘):
...         file.append(file)
...
>>> print file
[‘anaconda.ifcfg.log‘, ‘Xorg.0.log‘, ‘anaconda.storage.log‘, ‘Xorg.9.log‘, ‘yum.log‘, ‘anaconda.log‘, ‘dracut.log‘, ‘pm-powersave.log‘, ‘anaconda.yum.log‘, ‘wpa_supplicant.log‘, ‘boot.log‘, ‘spice-vdagent.log‘, ‘anaconda.program.log‘]
##################################################
2.列表解析
>>> import os
>>> file = [ file for file in os.listdir(‘/var/log‘) if file.endswith(‘.log‘) ]
>>> print file
[‘anaconda.ifcfg.log‘, ‘Xorg.0.log‘, ‘anaconda.storage.log‘, ‘Xorg.9.log‘, ‘yum.log‘, ‘anaconda.log‘, ‘dracut.log‘, ‘pm-powersave.log‘, ‘anaconda.yum.log‘, ‘wpa_supplicant.log‘, ‘boot.log‘, ‘spice-vdagent.log‘, ‘anaconda.program.log‘]

小结

运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

三、生成器表达式

egg_list=[‘鸡蛋%s‘ %i for i in range(10)] #列表解析

#############################################

laomuji=(‘鸡蛋%s‘ %i for i in range(10))#生成器表达式
print(laomuji)
print(next(laomuji)) #next本质就是调用__next__
print(laomuji.__next__())
print(next(laomuji))

总结:

  1.把列表解析的[]换成()得到的就是生成器表达式

  2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

  3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。

例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:

  sum(x ** 2 for x in xrange(4))

而不用多此一举的先构造一个列表:

sum([x ** 2 for x in xrange(4)])

时间: 2024-12-15 06:09:48

Python基础(9)三元表达式、列表解析、生成器表达式的相关文章

Python__三元表达式+列表解析+生成器表达式

x = 10res = 'ok' if x > 3 else 'no'print(res)#列表解析l = ['egg%s'%i for i in range(10)]print(l)l = ['egg%s'%i for i in range(10) if i > 5]print(l)names = ['alex_sb','egon','wupeiqi_sb','yuanhao_sb']names_new = [name for name in names if name.endswith('

三元表达式/列表推导/生成器表达式

一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(res) 二 列表推导式 #1.示例 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i for i in range(10)] #2.语法 [expression for item1 in iterable1 if condition1 for

190329迭代器-生成器-三元运算-列表解析

一.迭代器 迭代器协议:对象必须提供一个next()方法,执行该方法要么返回迭代中的下一项,要么抛出一个Stoplteration异常终止迭代 可迭代对象:遵循迭代器协议,即可迭代对象,(可以被for循环的就是可迭代对象) l = {1,2,3} iter_l = l.__iter__() #将列表转换为迭代器 print(iter_l.__next__()) print(next(iter_l)) 二.生成器 1.生成器函数 def f(): for i in range(10): yield

python基础学习-三元表达式+生成式

一.三元表达式 1.普通和三元表达式区别: 1.普通的表达式 def func(x,y): if x > y: return x else: return y ? res = func(1,2) print(res) 2.三元表达式 语法格式:条件成立时返回的值 if 条件 else 条件不成立时要返回的值 x = 1 y = 2 ? res = x if x > y else y print(res) egon = 18 alex = 80 ? res = 'egon' if egon &l

三元表达式 列表解析

三元表达式 # 三元表达式 # x=2 # y=3 # res=x if x > y else y #判断条件if x > y放中间,如果成立结果放判断条件左边,否则就放在右边 # print(res) #打印结果为y def max2(x,y): # if x > y: # return x # else: # return y return x if x > y else y #三元表达式:条件放中间,True放左边,False右边 print(max2(2,3)) 这,感觉没

python\列表和生成器表达式

一.协程函数的应用 写一个装饰器用于让协程函数不需要输入再执行一次next()函数 分析: 在装饰器中生成该协程函数的生成器, 并且执行一次next()函数 def firstNext(func): def wrapper(*args, **kwargs): g = func(*args, **kwargs) next(g) return g return wrapper @firstNext def eater(name): print("{} start to eat".forma

python基础学习-三元表达式和lambda表达式

#!/usr/bin/env python # -*- coding:utf-8 -*-  三元运算 if else 的简写 name ="alex" if 1==1 else "SB" #如果条件成立 赋alex 否则 赋SB print(name) #--------------lambda表达式 f2 = lambda a1,a2:a1+a2+100 #等价 下边函数定义 def f1(a1,a2): return  a1+a2+100 #---------l

Python - 列表解析式/生成器表达式

列表解析式: [expr for iter_var in iterable if cond_expr] 生成器表达式: (expr for iter_var in iterable if cond_expr) 二者的区别: -列表解析式需要生成所有的数据: -生成器解析式不是真正创建列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目yield出来.生成器表达式使用了延迟计算,在使用内存上更有效.

Python 基础 - Day 4 Learning Note - Generator 生成器

列表生成器/列表解析 list comprehension 简单灵活地创建列表,通常和lambda(), map(), filter() 一起使用 通过列表生成式, 直接创建列表.但是,收到内容限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问几个元素,那其他的就白占空间.列表生成器能够一边循环一边计算,大大节省大量的空间.是生成器的一种. 只有调用,才能生成. 不支持切片操作,只能通过__next()___一个个取数字. 基本语法

《转》python学习(12)-列表解析

一.列表解析 列表解析来自函数式编程语言(haskell),语法如下: [expr for iter_var in iterable] [expr for iter_var in iterable if cond_expr] 第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表. 第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到i