文章目录

  • 切片
  • 三元表达式
  • 列表生成式
  • 迭代器
  • 生成器


切片

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循环,sunminmax函数等)使用迭代器协议访问对象
  • (字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在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语句挂起该生成器函数的状态,保留足够的信息,以便之后从它离开的地方继续执行

生成器的优点

  • 优点一:生成器的好处是延迟计算,一次返回一个结果,也就是说,它不会一次生成所有的结果,这对于大数据里处理,将会非常有用
  • 优点二:生成器还能有效提高代码可读性