设为首页 收藏本站
查看: 681|回复: 0

[经验分享] [原创]Python入门学习之高级特性

[复制链接]

尚未签到

发表于 2015-12-1 13:54:01 | 显示全部楼层 |阅读模式
  一 前言
  学习高级特性的时候也许会感觉到有些许的难,这些新的特性在以前c/c++中是没有遇到过的,而且c/c++也不支持这样简便但又强大的语法。
  
  二 切片
  谈到切片,可以想像到切萝卜,拿到萝卜的某一段,用这个来比喻这里的切片非常贴切。python中的切片操作就是取list或者tuple中的某一段。
  比如,有以下定义的list:



#define a list
l=['Luffy','Corey','Nancy','Jeffrey','Kyle','Avery','Jason','Sunny']

  取其前3个元素的方法有两种,代码如下:



>>> l[:3]
['Luffy', 'Corey', 'Nancy']
>>> l[0:3]
['Luffy', 'Corey', 'Nancy']

  也就是说,从0开始的话可以省略。
  取第2个到第4个元素的代码如下:



>>> l[1:5]
['Corey', 'Nancy', 'Jeffrey', 'Kyle']

  取倒数第2个直到最后一个的代码如下:



>>> l[-2:]
['Jason', 'Sunny']

  在不知道list长度的情况下取整个list的内容,代码如下:



>>> l[:]
['Luffy', 'Corey', 'Nancy', 'Jeffrey', 'Kyle', 'Avery', 'Jason', 'Sunny']

  在整个list中每2个取1个:



>>> l[::2]
['Luffy', 'Nancy', 'Kyle', 'Jason']

  在list中前6个中每2个取1个:



>>> l[:5:2]
['Luffy', 'Nancy', 'Kyle']

  在实际的编辑代码中,经常可以把这里的切片操作中的指向list的变量替换成list本身,如下所示:



>>> ['Luffy', 'Corey', 'Nancy', 'Jeffrey', 'Kyle', 'Avery', 'Jason', 'Sunny'][:3]
['Luffy', 'Corey', 'Nancy']

  tuple和字符串都可以看成是一个list,故上述语法也是可以对其使用的。
  
  三 列表生成式
  列表生成式(List Comprehensions)是python中内置的非常强大的用来创建list的生成式。
  最简单的例子,我们要创建一个从1到10的列表,可以用



list(range(1,11))

  这样简简单单的一行代码搞定。但是要生成更复杂的列表该怎么办呢?
  生成[1x1,2x2,3x3,...,10x10]这样的列表该怎么办呢?使用循环当然是可以实现的,但是代码过于复杂,使用列表生成式则只需要如下一行代码:



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

  如果再加上只计算偶数的平方,那也不复杂,只需要在for循环后面加上if判断条件即可。



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

  还可以使用两层循环,



>>> [x+y for x in 'ABC' for y in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

  写了这么多的列表生成式,我想大家也都明白了这语法的由来。其实也就是将正常的语法反转,将最里层的计算放在最前面。如最后一个列表生成式可以写成如下正常的语法:



for x in 'ABC':
for y in 'XYZ':
print(x+y)

  
  四 生成器
  有了列表生成式,我们可以直接创建一个列表,但是如果考虑到内存限制时,我们就不能创建元素个数很多的列表了,那此时我们该怎么办呢?
  python提供一个叫做生成器的机制,通过生成器可以推算出后续的元素,这样就不用一次创建出所有的元素。要创建一个生成器,有两种方法:
  第一种方法:把列表生成式的[]改成(),就创建了一个generator。
    如下面代码所示:
  



>>> g=(x for x in range(10))
>>> print(next(g))
0

    要获取生成器的第一个元素,可以直接对g调用next函数。当然,也可以使用for循环来遍历整个生成器下一步生成的数据。
    第二种方法:如果推算的方法过于复杂,列表生成式无法实现时,就可以通过函数来实现。相对于从列表生成式到Generator,从函数到Generator也很简单,只需要先写好函数,然后再在某个位置上加上yield关键字就可以了。
    比如,生成一个Fibonacci数列的函数如下:



def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'

  
  要把这个函数转换成generator,只需要把print(b)这行代码替换成yield b就可以了。



def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'

  
  含有yield关键字的函数就不再是一个函数了,而是一个generator。要注意的是,generator的执行流程与函数不一样,在遇到yield时返回,当下次再调用时再从上次返回的yield处继续执行。
  
  五 迭代器
  可以直接作用于for循环的对象统称为可迭代对象:Iterable,可以使用isinstance()判断一个对象是否是Iterable对象。生成器不仅可以由for循环进行遍历,还可以使用next()遍历。我们把可以被next()函数调用并不断返回下一个值的对象统称为迭代器:Iterator。
  这里要区分一个Iterable和Iterator,list,dict,str都是Iterable,但不是Iterator(可以使用iter()函数把Iterable变成Iterator)。Iterator可以是一个无限大的数据流,不能提前知道整个序列的长度,这些都是Iterable不能达到的要求。
  
  六 后记
  这里提到的都是我在python中才学习到的一些编程的新特性。如有错误之处,敬请留言!!!
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-145926-1-1.html 上篇帖子: 五、python使用模块 下篇帖子: Python Quick list dir
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表