3.高级特性

3.1切片

L = list(range(100))

L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3

如果第一个索引是0,还可以省略 L[:3]

也支持取倒数元素 L[-2:] 取L集合的倒数2位元素

L[10:20] 取前11-20个数:

L[:10:2]取前10个数,每两个取一个

L[::5] 所有数,每五个取1个

'ABCDEFG'[:3]

Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单

3.2 迭代

python中不管迭代对象有无下标,都可以进行迭代

那么如何判断一个对象是否可迭代呢?from collections import Iterable

isinstance('abc', Iterable) ;

在Java里可以迭代下标,python里可以使用enumerate 函数迭代索引和元素的

for i, value in enumerate(['A', 'B', 'C']):

... print(i, value)

3.3 列表生成,是Python内置的非常简单却强大的可以用来创建list的生成式。

L = []

>>> for x in range(1, 11):

... L.append(x * x)#使用循环

#使用列表生成式

[x*x for x in range(1,11)if x%2 == 0] #要生成的元素x*x放置前面

#使用2层循环,生成全排列

[m+n for m in 'ABC' for n in 'XYZ']

import os # 导入os模块,模块的概念后面讲到

>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录

#for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:

d = {'x': 'A', 'y': 'B', 'z': 'C' }

>>> for k, v in d.items():

... print(k, '=', v)

#列表生成式也可以使用两个变量来生成list:

d = {'x': 'A', 'y': 'B', 'z': 'C' }

>>> [k + '=' + v for k, v in d.items()]

['y=B', 'x=A', 'z=C']

#list中所有的字符串变成小写:

L = ['Hello', 'World', 18, 'Apple', None]

>>> [s.lower() for s in L if isinstance(s,str) == True]

3.4 生成器

列表的空间是有限的,在python中,一边循环一边计算的机制 generator

g = (x * x for x in range(10))

for n in g:

print(n)

#著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:1, 1, 2, 3, 5, 8, 13, 21, 34, ...

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仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:

#generator函数 在执行过程中,遇到yield就中断,下次又继续执行。

##杨辉三角

def triangles():

L = [1] #定义一个list[1]

while True:

yield L

L = [L[i] + L[i + 1] for i in range(len(L) - 1)]

L.insert(0,1)

L.append(1)

if(len(L)>10):

break

#生成一个generator对象,然后通过for循环迭代输出每一行

a=triangles(10)

for i in a:

print(i)

3.5迭代器

直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

Iterable 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象:

isinstance({}, Iterable) #True

Iterator 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

可以使用isinstance()判断一个对象是否是Iterator对象:

isinstance((x for x in range(10)), Iterator) #True

isinstance('abc', Iterator) #False

-------------------------------------------------------------

是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回

下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,

但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,

所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

-------------------------------------------

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

更多相关文章

  1. 创建单独的函数而不是一个大的缓慢处理时间?
  2. 'module'对象没有属性'views' django错误
  3. python cookboo 文件与IO 函数
  4. 在Python中强制使用函数参数类型?
  5. Python(名称空间、函数嵌套、函数对象)
  6. flask-admin 新增功能关联两张表,关联的表中的字段显示出来是对象
  7. python中函数参数传递的几种方法
  8. python函数篇0-2
  9. Python的范围函数如何工作?

随机推荐

  1. 老司机带你在MySQL领域“大吉大利,晚上吃
  2. mysql如何判断一个字符串是否包含另外一
  3. MySQL史上最难的难题,急求高人!高人请进!LEF
  4. MySql php:检查Row是否存在
  5. Win2012 R2 IIS8.5+PHP(FastCGI)+MySQL运
  6. 给苹果osx安装mysql数据库
  7. MySQL SQL语句学习(查询某年每个月的销售
  8. 我是对的,InnoDb比MyISAM更适合频繁的并发
  9. Mongodb 的ORM框架 Morphia 注解二 ——
  10. 实例讲解:.NET如何访问MySQL数据库