03-高级特性

来源:互联网 发布:zhipan.cn 域名城 编辑:程序博客网 时间:2024/05/16 07:05
#!/usr/bin/env python# -- coding: utf-8 --__author__ = 'sunh''''切片操作 Slice'''r = ['a', 'b', 'c', 'd', 'e', 'f', 'g']print r[0:3]  # ['a', 'b', 'c']# 记住倒数最后一个元素的索引是-1。# 我们先创建一个0-99的数列L = range(100)print L# 可以通过切片轻松取出某一段数列。比如前10个数:print L[:10]# 后10个print L[-10:]# 前 10~20个print L[10:20]#  前10个数,每两个取一个:print L[:10:2]# 所有数,每5个取一个:print L[::5]# 甚至什么都不写,只写[:]就可以原样复制一个list:print L[:]# tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:print (0, 1, 2, 3, 4, 5)[:3]# 字符串’xxx’或Unicode字符串u’xxx’也可以看成是一种list,每个元素就是一个字符。# 因此,字符串也可以用切片操作,只是操作结果仍是字符串:print 'ABCDEFG' [:3]print 'ABCDEFG'[::2]'''迭代'''# 因为Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。# list这种数据类型虽然有下标,但很多其他数据类型是没有下标的,# 但是,只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:d = {'a': 1, 'b': 2, 'c': 3}for key in d:    print key# 默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.itervalues(),# 如果要同时迭代key和value,可以用for k, v in d.iteritems()。for value in d.itervalues():    print valuefor k, v in d.iteritems():    print k, v# 如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:from collections import Iterableprint isinstance('abc', Iterable)  # str是否可迭代 Trueprint isinstance([1, 2, 3], Iterable)  # list是否可迭代 Trueprint isinstance(123, Iterable)  # 整数是否可迭代 False# Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身for i, value in enumerate(['A', 'B', 'C']):    print i, value# for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:for x, y in [(1, 1), (2, 4), (3, 9)]:    print x, y'''列表生成式'''# 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。# 举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11):print range(1, 11)[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 如果要生成[1x1, 2x2, 3x3, …, 10x10]怎么做?print [x * x for x in range(1, 11)]# for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:print [x * x for x in range(1, 11) if x % 2 == 0]# 还可以使用两层循环,可以生成全排列:print [m + n for m in 'ABC' for n in 'XYZ']# 运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:import os  # 导入os模块print [d for d in os.listdir('.')]  # os.listdir可以列出文件和目录# 内建的isinstance函数可以判断一个变量是不是字符串:x = 'abc'y = 123print isinstance(x, str)print isinstance(y, str)'''生成器'''# 列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?# 这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。g = (x * x for x in range(10))print g  # <generator object <genexpr> at 0x7f417e952280>print g.next()   # 0print g.next()   # 0print g.next()   # 0print g.next()   # 0print g.next()   # 0print g.next()   # 0print g.next()   # 0print g.next()   # 0print g.next()   # 0print g.next()   # 0# print g.next()'''Traceback (most recent call last):  File "./base/advanced.py", line 109, in <module>    print g.next()   # 0StopIteration''''''generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。generator非常强大。如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, …斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:'''def fab(max):    n, a, b = 0, 0, 1    while n < max:        print b        a, b = b, a + b        n = n + 1fab(6)# 仔细观察,可以看出,fab函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator。# 也就是说,上面的函数和generator仅一步之遥。要把fab函数变成generator,只需要把print b改为yield b就可以了:def fab1(max):    n, a, b = 0, 0, 1    while n < max:        yield b        a, b = b, a + b        n = n + 1print fab1(6)  # <generator object fab1 at 0x7fcc1c04f8c0>

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在蘑菇街退鞋子商家非说脏了怎么办 牛皮屑怎么办ke靠成都银康 微信订阅号取消关注之后还在怎么办 腾讯新闻红包领取说帐号异常怎么办 计算机职弥报名没选模块怎么办 有人用我手机注册有赞了怎么办 一件代发别人的货被投诉了怎么办 淘宝极速退款后商家拒收快递怎么办 运费险退到天猫垫付账户了怎么办 淘宝卖家食品有问题该怎么办 美团外卖不要辣椒给放了怎么办 旺旺卖家拒收我的消息怎么办 淘宝清空购物车大奖到上限了怎么办 游戏无响应除了退出还能怎么办 淘宝给差评了卖家一直打电话怎么办 电脑说带宽问题无法观看视频怎么办 手机淘宝上的购买信息删除了怎么办 为什么支付宝有钱淘宝付不了怎么办 苹果平板电脑上的淘宝点不开怎么办 淘宝付了两次款只有一个订单怎么办 淘宝付款显示支付宝账号异常怎么办 手机老卡换新卡淘宝付不了款怎么办 淘宝买东西退款卖家拒绝退款怎么办 淘宝店铺收藏图片怎么点不了怎么办 手机淘宝显示用户被限制登录怎么办 淘宝设置登录密码原密码忘了怎么办 斑马智行淘宝号换没法登录了怎么办 淘宝卖家手机版显示宝贝不全怎么办 在电脑上登的淘宝账号退不了怎么办 淘宝买家退款不退货写假货怎么办 淘宝卖家已发布商品没货了怎么办 京东换货附近没有京东自提点怎么办 一直显示手机淘宝已停止运行怎么办 唯品会买了不可以退货的衣服怎么办 淘宝店卖东西邮费太贵怎么办 支付宝登录上去必须手机验证怎么办 支付宝里的钱被盗了怎么办 淘宝绑定的支付宝账号忘记了怎么办 支付宝绑定的微博账号忘记了怎么办 怎么知道自己的淘宝密码忘了怎么办 更换扣扣头像图片太大放不下怎么办