Python学习——切片、迭代、列表生成式[]、生成器()

笔记由廖雪峰官网和菜鸟教程整理

高级特效
切片

取一个list或tuple的部分元素是非常常见的操作。
tuple操作得到的也是tuple不可更改
字符串是特殊的list,切片操作得到的也是字符串

#用range函数创建0-99的list
>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]
#取前十个
>>> L[:10][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#取后十个,注意倒数第一个是L[-1]
>>> L[-10:][90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
#10-20的数中每隔两个取一个
>>> L[10:20:2]
[0, 2, 4, 6, 8]
#对所有数每隔5个取一个
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
#复制一个list
>>>L[:]
#字符串是特殊的list,切片得到的也是list
>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'

利用切片去除字符串中的空格

def myTrim(s):    
    while s[:1]==' ':
        s=s[1:]   
    while s[-1:]==' ':
        s=s[:-1]    
    return s
迭代
  • for 迭代
    可用于遍历list或者tuple、字符串、dict
    判断是否能迭代,可以使用isinstance判断。
    list输出下标元素可以使用enumerate函数
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代True
#list迭代
>>> d=['a','b','c','d']
>>> for n in d:
	print(n)	
a
b
c
d
#list输出下标和元素,用enumerate函数
>>> for i,value in enumerate(d):
	print(i,value)
0 a
1 b
2 c
3 d
>>> d={'a':1,'b':2,'c':3}
#dict 迭代输出key
>>> for key in d:
	print(key)	
a
b
c
#dict迭代输出value
>>> for key in d:
	print(d.get(key))	
1
2
3
#str迭代
>>> for ch in 'JJL':
	print(ch)
J
J
L

返回最大最小值及索引

  • list
    min(l)——max(l) 最大最小值
    l.index(min(l))——l.index(max(l)) 最大最小值的索引
    但是index只能显示第一个出现的min值的索引
  • dict
列表生成式

[x for x in list if x%2==0]

  • 使用[],将要生成的元素放在最前面,后面加for循环即可创建list,中间不用逗号隔开
  • 可以在for循环后加if判断
  • 可以使用两层循环
  • 函数
    range函数
    list(range(1,11)) 生成[1,2,3,4,5,6,7,8,9,10]
    注意range生成的范围,用‘,’间隔两参数,list后用括号
    lower
    s.lower() 将字符串小写
    isinstance
    isinstance(s,str)判断s是否是str,返回True或者False
#循环
>>> L = []
>>> for x in range(1, 11):
...    L.append(x * x)
...
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#列表生成式
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
#if判断
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
#两层循环
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
#for循环两个变量
>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.items()]#+号可以拼接字符串
['y=B', 'x=A', 'z=C']
#列出当前目录所有文件名
>>> import os # 导入os模块
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']
生成器
#列表生成式 list
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#生成器 generator
>>> g = (x * x for x in range(10))
>>> g
  • 生成器 generator用()表示
  • 可以用next()指向下一个返回值(有点像C++指针),每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
  • 通常不使用next(),而是用循环for n in g: 来得到generator的元素
  • generator和函数
    yield可以代替print来显示生成器,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator。
    generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
    还不太懂! 调用时首先生成一个generator对象,再用next()不断获得下一个值。一般用循环来调用generator函数,在循环过程中不断调用yield,就会不断中断。当然要给循环设置一个条件来退出循环,必须捕获StopIteration错误,返回值包含在StopIteration的value中。
#定义斐波那契函数
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b#yield表示指向generator元素,相当于print(b),但b在这里是generator
        a, b = b, a + b
        n = n + 1
    return 'done'
#调用generator函数
>>> g = fib(6)
>>> while True:
...     try:
...         x = next(g)
...         print('g:', x)
      #捕获StopIteration错误,返回值循环中包含在StopIteration的value
...     except StopIteration as e: 
...         print('Generator return value:', e.value)
...         break
...
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: done

generator生成杨辉三角

#每一行的list都是由上一行的list分别头尾加0后生成的两个list对应位置元素之和,利用zip函数计算。
# -*- coding: utf-8 -*- 
def triangles():
    L=[1]
    while True:
        yield L
        #list可以用+号添加元素
        #如果没有zip(generator对应元素相加,返回tuple),则序列 [1,2,3]+[4,5,6]=[1,2,3,4,5,6]
        L=[sum(i) for i in zip([0]+L,L+[0])]
#方法二:三角每一行首位都是1,中间是上一行两两相加
def triangles():        
            L=[1]
    while True:
        yield L
        L=[1]+[L[x]+L[x+1] for x in range(len(L)-1)]+[1]
#输出的
n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break

for t in results:
    print(t)
迭代器

总结
1、可作用于for循环的对象都是Iterable
2、可作用于next()的对象都是Iterator
3、list、dict、str都是iterable都不是Iterator,可以用iter()转变。
4、生成器generator既可以for也可以next

  • Iterable(可循环迭代)
    可直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象。
    可以使用isinstance() 判断一个对象是否是Iterable对象
>>> from collections import Iterable
>>> isinstance([], Iterable)#list
True
>>> isinstance({}, Iterable)#dict
True
>>> isinstance('abc', Iterable)#string
True
>>> isinstance((x for x in range(10)), Iterable)#生成器
True>
>> isinstance(100, Iterable)#int
False
  • 迭代器Iterator
    可以被next()调用并不断返回下一个值的对象,生成器generator是Iterator对象。
    Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。
    用isinstance()判断,第二参数是Iterator
>>> from collections import Iterator
>>> isinstance((x for x in range(10)), Iterator)#生成器
True>
>> isinstance([], Iterator)#list
False
>>> isinstance({}, Iterator)#dict
False
>>> isinstance('abc', Iterator)#string
False
  • Iterable转化Iterator
    把list、dict、str等Iterable变成Iterator可以使用iter()函数:
>>> isinstance(iter([]), Iterator)
True
>>> isinstance(iter('abc'), Iterator)
True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值