码迷,mamicode.com
首页 > 编程语言 > 详细

python高级特征:列表生成式;generator, 迭代器。

时间:2019-11-03 18:11:29      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:dict   分层   多个   ==   高级特性   使用   数组   很多   list   

Python高级特性

  • 列表生成式:不过一种语法糖
  • 生成器:不过一个方法
  • 迭代器:

 

列表生成式

 Python内置的函数,来创建list。

简单的生成:

>>> list(range(1,11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

复杂的生成:增加一个for循环。

>>> a = [x*x for x in range(1, 11)]
>>> a
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

 

还可以在for循环后加if判断,这样对循环后的所有元素进行整除,得到符合条件的一组元素,返回的是list。

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

 

还可以套用两层for循环

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

 

 

for循环可以同时接收多个变量。比如dict的items()方法:

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

 

>>> d.items()
dict_items([(x, A), (y, B), (z, C)])

 

小结:

list生成式:

[表达式/0~n个变量 for 0~n个变量 in list/dict/相关变体] 

 

本质就是使用循环和条件语句对list/dict进行筛选:

[表达式/变量 条件/循环语句 条件/循环语句] 

 

Ruby类似的方法糖。

Ruby没有列表生成式,但有很多语法糖,来操作array对象。

range对象使用to_a转化为数组。

> (1...11).to_a
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 乘方后,增加一个判断:等同Python上面的列表生成式??。

 > (1...11).to_a.map{|x| x * x}.select {|x| x % 2== 0}
 => [4, 16, 36, 64, 100]

 

 Ruby的each功能很强大:可以替代上面for接收多个变量的情况。

 Ruby的for..in..功能同样可以做到上面Python的功能:??还更简便,无需调用items(), 

> for k,v in d
>   puts "#{k}=#{v}"
> end
x=A
y=B
z=C

 

 

Python测试:

请修改列表生成式,通过添加if语句保证列表生成式能正确地执行:

L1 = [Hello, World, 18, Apple, None]

L2 = [x.lower() for x in L1 if isinstance(x, str)]
>>> L2
>[hello, world, apple]

 

解释: 就是简化写法,没别的。 经常用一看就直到。太复杂的还是分开写,便于后续维护代码。毕竟视觉上,分层容易理解。

L1 = [Hello, World, 18, Apple, None]

L2 = []
for x in L1:
    if isinstance(x, str):
        L2.append(x.lower())

 

python高级特征:列表生成式;generator, 迭代器。

标签:dict   分层   多个   ==   高级特性   使用   数组   很多   list   

原文地址:https://www.cnblogs.com/chentianwei/p/11788208.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!