zoukankan      html  css  js  c++  java
  • 【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('测试成功!')
  • 相关阅读:
    直接插入排序
    安卓突击:隐式、显式Intent
    安卓突击:Android 动画有哪几种?
    安卓突击:ANR
    安卓突击:系统上安装了多种浏览器,能否指定某浏览器访问指定页面
    安卓突击:系统上安装了多种浏览器,能否指定某浏览器访问指定页面
    Android:BroadcastReceiver的基础知识
    安卓突击:service的基础知识
    安卓突击:数据存储方式
    Android突击:常用的五种布局
  • 原文地址:https://www.cnblogs.com/cjvae/p/9318110.html
Copyright © 2011-2022 走看看