文章目录
- 切片
- 三元表达式
- 列表生成式
- 迭代器
- 生成器
切片
test='alex'
#这个范围表示的是大于等于0小于1的范围
print(test[0:1]) # a
#取最后一个字符
print(test[-1]) # x
#大于等于0小于从右数第一个字符的范围
print(test[0:-1]) # ale
#创建一个0-99的数列
L=list(range(100))
print(L) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
#取前10个数
print(L[:10]) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#取后10个数
print(L[-10:]) #[20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
#取11-20个数
print(L[10:20]) #[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
#前10个数,每两个取一个
print(L[:10:2]) #[0, 2, 4, 6, 8]
#所有数每5个取一个
print(L[::5]) #[0, 5, 10, 15, 20, 25]
#复制一个L
print(L[:]) #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
三元表达式
name='alex'
res='hh' if name =='alex' else 'kk' #这就是三元表达式 如果name='alex'name返回 hh 否则返回kk
print(res) #hh
列表生成式
写列表生成式时,把要生成的元素x * x
放到前面,后面跟for
循环,就可以把list
创建出来
#要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
print(list(range(1,11)))
#生成[1x1, 2x2, 3x3, ..., 10x10]
L=[]
for x in range(1,11):
L.append(x*x)
print(L) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:
print([x*x for x in range(1,11)]) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#for循环后面还可以加上if判断
#比如我们筛选出仅偶数的平方
print([x*x for x in range(1,11) if x%2==0]) #[4, 16, 36, 64, 100]
#还可以使用两层循环,可以生成全排列:
print([m+n for m in 'ABC' for n in 'XYZ']) #['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
#for循环其实可以同时使用两个甚至多个变量
#比如dict的items()可以同时迭代key和value
d={'x':'A','y':'B','z':'C'}
for k,v in d.items(): #d.items 遍历值和键
print(k,'=',v)
#x = A
#y = B
#z = C
#因此,列表生成式也可以使用两个变量来生成list
d={'x':'A','y':'B','z':'C'}
print([k+'='+v for k,v in d.items()]) #['x=A', 'y=B', 'z=C']
#最后把一个list中所有的字符串变成小写
L=['Hello','World','IBM','Apple']
print([s.lower() for s in L]) #['hello', 'world', 'ibm', 'apple']
迭代器
- 迭代器协议:对象必须提供一个
next
方法,执行该方法要返回迭代的下一项,要么就引起一个Stopiteration
异常,以终止迭代(只能往后走不能往前退) - 可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个
_iter_()
方法 - 协议是一种约定,可迭代对象实现了迭代器协议,
python
的内部工具(如for
循环,sun
,min
,max
函数等)使用迭代器协议访问对象 - (字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在
for
循环时,调用了他们内部的_iter_
方法,把他们变成了可迭代对象,然后for
循环调用可迭代对象的_next_
方法去取值,而且for
循环会捕捉Stoplteration
异常,以终止迭代
x='hello'
iter_test=x.__iter__()
print(iter_test)
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
print(iter_test.__next__())
#等同于
x='hello'
iter_test=iter(x) #iter 是系统内置的 x.__iter__() 是数据类型内置的
print(next(iter_test)) #next 是系统内置的 iter_test.__next__() 是数据类型内置的
print(next(iter_test))
print(next(iter_test))
print(next(iter_test))
print(next(iter_test))
运行结果
<str_iterator object at 0x01069970>
h
e
l
l
o
h
e
l
l
o
获取列表中全部的元素
- 第一种
l=[1,2,3]
for i in l: # i_l=l._iter_() i_l._next_()
print(i)
运行结果
1
2
3
- 第二种
l=[1,2,3]
print(l[0])
print(l[1])
运行结果
1
2
- 第三种
l=[1,2,3]
iter_l=l.__iter__() #遵循迭代器协议,生成可迭代对象
print(iter_l.__next__())
print(iter_l.__next__())
运行结果
1
2
生成器
什么是生成器
- 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己的内置
_iter_()
方法),所以生成器就是可迭代对象
生成器在python
中的表现形式
- 生成器函数:常规函数定义,但是,使用
yeild
语句而不是return
语句返回结果,yeild
语句一次返回一个结果 - 生成器函数可以记住上一次返回时在函数体中的位置,对生成器函数的下一次调用跳转至该函数中间,而上次调用的所有局部变量都保持不变
def test():
yield 1
yield 2
yield 3
yield 4
g=test()
print(g)
print(g.__next__())
print(next(g)) #与上面的功能一样
print(next(g))
print(next(g))
运行结果
<generator object test at 0x030E52F0>
1
2
3
4
- 生成器表达式:
- 生成器表达式:类似于列表生成式,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
laomuji=('鸡蛋%s'%i for i in range(10)) #生成器表达式和列表生成式就是()不一样
print(laomuji)
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
print(laomuji.__next__())
运行结果
<generator object <genexpr> at 0x030E52B0>
鸡蛋0
鸡蛋1
鸡蛋2
鸡蛋3
鸡蛋4
鸡蛋5
鸡蛋6
鸡蛋7
生成器表达式和列表生成式的区别
- 把列表生成式的
[]
换成()
得到的就是生成器表达式 - 列表生成式与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
生成器总结
下面我们以生成器函数为例进行总结
- 语法上和函数类似:生成器函数和常规函数几乎是一样的,它们都是使用
def
语句进行定义,差别在于,生成器使用yield
语句返回一个值,而常规函数使用return
语句返回一个值 - 自动实现迭代器协议:对于生成器,
python
会自动实现迭代器协议,以便应用到迭代背景中(如for
循环,sum
函数) - 有与生成器自动实现了迭代器协议,所以,我们可以调用它的
next方
法,并且,在没有值可以返回的时候,生成器自动产生Stopitreation
异常 - 状态挂起:生成器使用yield语句返回一个值。
yield
语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行
生成器的优点
- 优点一:生成器的好处是延迟计算,一次返回一个结果,也就是说,它不会一次生成所有的结果,这对于大数据里处理,将会非常有用
- 优点二:生成器还能有效提高代码可读性