2021-08-07

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值