【Python学习之五】高级特性1(切片、迭代、列表生成器、生成器、迭代器)

1、切片

  有一个list—>L = [1,2,3,4,5,6,7]或tuple—>T = (1,2,3,4,5,6,7),如果想取得前三个元素,怎么操作?

  硬方法,也是低效的方法是:L= L[L[0], L[1], L[2]]。但是如果数量多,就算是用循环也很麻烦。但是Python提供了,Slice切片操作符。如下:

>>> L[0:3]
[1,2,3]

  L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。即索引012,正好是3个元素。如果第一个索引是0,还可以省略,直接L[:3]。也可以从第三开始,取三个元素:L[2:5]。Python支持L[-1]取倒数第一个元素,同样支持切片。即是,Python支持由0开始从左到右,也可以从-1开始从右往左,做切片操作。

  通常一个切片操作要提供三个参数 [start_index:  stop_index:  step] 。其中,start_index是切片的起始位置;stop_index是切片的结束位置(但是不包括该索引的元素);step可以不提供,默认值是1,步长值不能为0,不然会报错ValueError。

  当 step 是正数时,以list[start_index]元素位置开始(包括该位置元素), step作为步长到list[stop_index]元素位置(不包括该位置元素)为止,从左向右截取。这里面一个重点就是,要保证 list[stop_index]元素的逻辑位置必须在list[start_index]元素的逻辑位置右边,否则取不出元素。下面是一些合法的例子:

>>> L[1:5]
[2, 3, 4, 5]

>>> L[1:-1]      #-1代表的是元素7的位置   
[2, 3, 4, 5, 6]

>>> L[-5:-1]
[3, 4, 5, 6]

 >>> L[1:-2]
 [2, 3, 4, 5]

  下面是一些非法的例子:

>>> L[-1:-3]
[]

>>> [-3:1]
  File "<console>", line 1
    [-3:1]
       ^
SyntaxError: invalid syntax

  下面是一些容易弄混的例子:

>>> L[-6:-1:1]          #start_index是-6,即数2,而stop_index是-1
[2, 3, 4, 5, 6]
>>> L[-1:-6:-1]        #start_index是-1,即数7,而stop_index是-6
[7, 6, 5, 4, 3]
>>> L[-1:-6:1]         #不合法,不符合逻辑从左到右
[]

>>> L[-6:-1:2]
[2, 4, 6]
>>> L[-1:-6:-2]
[7, 5, 3]

  start_index和stop_index都是可以省略的,比如L[:]。被省略的默认由其对应左右边界起始元素开始截取:

>>> L[:]
[1, 2, 3, 4, 5, 6, 7]

 >>> L[:3]
 [1, 2, 3]

  >>> L[:-1]
  [1, 2, 3, 4, 5, 6]

 >>> L[-5:]        #取最后五个数

 [3,4,5,6,7]

  >>> L[-5::2]       #去最后五个数中的奇数
  [3, 5, 7]

  一些常用的切片操作,参考(https://blog.csdn.net/xpresslink/article/details/77727507):

# 取前一部分
>>> alist[:5]
[0, 1, 2, 3, 4]

# 取后一部分
>>> alist[-5:]
[5, 6, 7, 8, 9]

# 取偶数位置元素
>>> alist[::2]
[0, 2, 4, 6, 8]

# 取奇数位置元素
>>> alist[1::2]
[1, 3, 5, 7, 9]

# 浅复制,等价于list.copy()更加面向对象的写法
>>> blist = alist[:]
>>> blist
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 返回一个逆序列表,推荐reversed(list)的写法,更直观易懂。
>>> alist[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

# 在某个位置插入多个元素
>>> alist[3:3] = ['a','b','c']
>>> alist
[0, 1, 2, 'a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]

# 在开始位置之前插入多个元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[:0] = ['a','b','c']
>>> alist
['a', 'b', 'c', 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 替换多个元素
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> alist[0:3] = ['a','b','c']
>>> alist
['a', 'b', 'c', 3, 4, 5, 6, 7, 8, 9]

# 删除切片
>>> alist = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del alist[3:6]
>>> alist
[0, 1, 2, 6, 7, 8, 9]

   切片练习题,https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431756919644a792ee4ead724ef7afab3f7f771b04f5000#0

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Date    : 2018-05-22 19:13:58
 4 # @Author  : Chen Jing (cjvaely@foxmail.com)
 5 # @Link    : https://github.com/Cjvaely
 6 # @Version : $Id$
 7 
 8 # 切片Slice练习
 9 # 利用切片操作,实现一个trim()函数,
10 # 去除字符串首尾的空格,注意不要调用str的strip()方法
11 
12 def trim(s):
13     if s[:1] == ' ':
14         return trim(s[1:])
15     elif s[-1:] == ' ':
16         return trim(s[:-1])
17     else:
18         return s
19 
20 
21 # 测试:
22 if trim('hello  ') != 'hello':
23     print('测试失败!')
24 elif trim('  hello') != 'hello':
25     print('测试失败!')
26 elif trim('  hello  ') != 'hello':
27     print('测试失败!')
28 elif trim('  hello  world  ') != 'hello  world':
29     print('测试失败!')
30 elif trim('') != '':
31     print('测试失败!')
32 elif trim('    ') != '':
33     print('测试失败!')
34 else:
35     print('测试成功!')
原文地址:https://www.cnblogs.com/cjvae/p/9318110.html