Python中的生成式
生成式
在Python中经常能看到形如ret =[x**2 for x in iterable]这样的赋值语句,但对于学过其他编程语言的人来说,就很难理解这样的for循环,而这语法就是python为了简洁而发明的新语法。
python生成式的优点:
常见的解析式
- 列表生产式
- 生成器生产式
- 集合生成式
- 字典生成式
range()函数。
语法格式:range(start, stop, step).
-
start:计数起始步,默认从0开始。
-
stop:计数结束步,但不包括stop
-
step:步长,默认为1。
列表生成式
python中的列表 “[]” 表示一个列表,快速高效的生成一个列表可以使用列表生成式生成。
-
语法格式:[exap for val in iterable if condition]
先对传入的迭代对象进行for循环取出符合条件的元素,在用if语句进行判断,最后将符合条件的结果以列表的形式返回。
#exam01
print([i**2 for i in range(10)])
#exam02
a = []
for i in range(1,9):
a.append(i*i)
print(a) #结果:[1, 4, 9, 16, 25, 36, 49, 64]
print([i*i for i in rannge(1, 9)])
#结果:[1, 4, 9, 16, 25, 36, 49, 64]
#带if语句
print([i for i in range(10) if i > 5]) #结果:[6, 7, 8, 9]
生成器生成式
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
- 语法格式:[exap for val in iterable if condition]
g = (x * x for x in range(10))
#因为我们创建的是一个生成器,使用print()无法将生成器内的每一个元素打印出来。如果想一个的将其中的元素打印出来,我们可以通过next()函数获得生成器的下一个返回值。
next(g)#每次调用,就计算到下一个元素,但计算到最后一个元素的时候,抛出StopIteration的错误。
for i in g:
print(i) #我们想一次打印出所有的元素,也可以使用for循环
集合生成式
python中除了列表生成器,还有与列表生成器大同小异的集合生成器。
- 一般语法:{exp for item in iterable if exp}
print({x for x in range(1,100) if x%9==0})
字典生成器
跟列表生成式一样,字典生成式用来快速生成字典,不同的是,字典需要两个值。字典生成式在一些需要列表或元组转化成字典的场合可以写出很优雅的代码。
- 一般语法:{key: value for (key,value) in iterable if exp }
print({i : i ** 2 for i in {1, 2, 3, 9, 12} if i % 3 == 0})
#结果:{3:9,9:81,12:144}
ls = [('name1','xiao'),('name2','wang')]
print(dict(x for x in ls))
#结果:{'name1': 'xiao', 'name2': 'wang'}
三元表达式
三元运算符是软件编程中的一个固定格式,语法是“条件表达式?表达式1:表达式2”。使用这个算法可以使调用数据时逐级筛选。python中虽没有这种表达式,但有类似功能的语句。
- 一般语法:result = 为真时的结果 if 判断条件 else 为假时的条件
#第一种写法
x, y = 1, 2
result = x if x > y else y