Python高级特性

一、 切片

  1. python中提供了切片(Slice)操作符 , 可以方便的获取list或tuple中的某一段元素 。

    # -*-  coding : utf-8 -*-  #Python 切片#生成0~99的元组或list都是可以进行切片操作的
    L=tuple(range(100))#输出
    print(L)#使用且前截取
    #使用 L[startIndex : endIndex] 的形式
    #startIndex表示 开始截取的位置  endIndex表示结束截取的位置  含左不含右
    print(L[10:20])
    print(L[:10])  # 没有起始位置时 , 默认从0开始
    print(L[10:])  # 没有结束位置时 , 默认截取剩余部分#指定截取时的步数
    print(L[:10:2]) # 截取0~10的元素 , 每两个取一个
    print(L[::5])  #所有的数 , 每五个取一个
    
  2. 示例

    #去除字符串首尾的空格
    def trim(s):if(s[0] == " "):s = s[1:]trim(s)elif s[len(s)-1] == " " :s = s[:len(s)-1]trim(s)else:print("***"+s+"***")s = input("请输入要处理的字符串:")
    trim(s)
    

二、 迭代

  1. python中的迭代遍历不仅仅可以用在list和tuple上 , 而且可以用在dict上 。
  2. 示例

    # -*-  coding : utf-8 -*- #python 中的迭代遍历 #1. 迭代list 或 tuple
    #为什么是 一个列子?   因为tuple本身就是一个特别的listL=tuple(range(100))
    J=list(range(100))for i in J :print(i)#2. 迭代一个dict
    # 在迭代dict时 ,  默认迭代的是dict 的key 的集合 , 随后可以拿着key从dict 中取到value
    D = {'a':1 , 'b':2 , 'c':3}
    #遍历Key
    for d in D :print(d)
    #遍历value 方式一
    for d in D : print(D[d])#遍历value 方式二
    for d in D.values() :print(d)
    
  3. 当我们在python 中使用for遍历时 , 只要作用于一个可迭代对象 , for循环就可以正常运行 , 而不用太关心被迭代的元素类型 。
  4. 如何判断一个对象是一个可迭代对象 ?

    from collections import Iterable#python   判断一个对象是否是一个可迭代对象
    D = {'a':1 , 'b':2 , 'c':3}
    flag = isinstance(D , Iterable)
    print("是否是一个可迭代的对象呢: "+str(flag))
    
  5. 遍历二维list

    #python遍历二维列表K=((1,1) , (2,2) , (3,3) , (4,4))for x , y in K :print(x , y)
    
  6. 练习

    #python 迭代练习
    #查找list中的最大值和最小值
    print("查找list中的最大值和最小值:")
    H=(1,6,33,7,8,5,3,7,75,3,7,32,6,8,8,4,3,88,5,33,5,11111)
    min=None
    max=Nonefor h in H :if min==None or (h!=min and h<min) :#int 不能和None进行逻辑运算 , 当min为None时  , 先赋予初始值 。 min = helif max==None or (h!=max and h>max) :max = h
    print("min=" , min)
    print("max=" , max)
    

三、 列表生成式

  1. 列表生成式即List Comprehensions , 是Python内置的非常简单却强大的可以 用来创建List 的生成式 。

    举个例子
    要想生成[1,2,3,4,5,6,7,8,9,10] , 可以用list(range(1,11))但是想要生成[1x1 , 2x2 , 3x3 , 4x4, 5x5] 怎么做? 只能使用原始的for循环么??
    1. 可以用list(x*x for x in range(1, 6))
    2. 可以使用判断 , 筛选出仅偶数的平方
    list(x*x for x in range(1,11) if x%2==0)
    3. 可以使用循环嵌套生成全排列
    list(m+n for m in 'ABC' for n in 'XYZ')
    
  2. 示例

    # -*- conding:utf-8 -*-import os #导入os模块
    #利用列表生成式列出当前目录下所有的目录和文件名L = [d for d in os.listdir('.')]#.代表当前目录
    print(L)#遍历dict的第三中方式
    D={'1':'a' , '2':'b' , '3':'c'}
    for k,v in D.items():#使用for循环遍历dict 时 , 默认遍历keys , 可以通过D.values()仅遍历value , 可以通过items()同时遍历key和valueprint(k , '=' , v)  #使用列表生成式将dict 转换为listL2 = [k+"="+v for k , v in D.items()]
    print(L2)   #把list中的所有字符串转换为小写并输出L3=['AAA',"BBB",18,'CCC','adfFFFF']L3c=[s.lower() for s in L3 if isinstance(s , str)]
    print(L3c)
    

四 、 生成器

  1. 通过列表生成式 , 我们可以直接创建一列表 , 但是虽然理论上list 的长度是无限的 , 由于受内存限制, 实际上list的长度也是受限的的 。 当我创建出一个包含100万个元素的list却只取其中的某几个元素使用 一次时 ,这就显得非常的浪费 。
  2. 所以 ,如果列表中的元素如果可以按照某种算法推算出来 , 我们就不必创建大量占用内存的list而使用list 中的元素了 。 在python中这样以便循环一边计算的机制叫做生成器generator 。
  3. 生成一个generator最简单的办法就是把一个列表生成式的[]改为() , 就创建了一个generator 。

    # -*- conding:utf-8 -*-#generator生成器
    L=[x for x in range(10)] #列表生成式 用于比较
    G=(x for x in range(10)) #生成器print("列表" , L)
    print("生成器" , G )
    
  4. 遍历generator的元素之前说过generator保存的是数据生成的算法 , 不断调用next(g)的方式太麻烦 , 由于generator也是可迭代对象 , 所以可以使用for循环 。

    G=(x for x in range(10)) #生成器
    for g in G :print(g)
    
  5. generator非常强大 , 如果推算的算法比较复杂 , 用上述的方法无法实现的时候 , 还可以用函数来实现 。

    #函数的形式实现generator#比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
    #1, 1, 2, 3, 5, 8, 13, 21, 34, ...
    #斐波拉契数列用列表生成式写不出来,但是,用函数把它打印出来却很容易:def fib(max) :n , a , b  = 0 , 0 , 1#n控制循环次数 , a为假设的第0个数 b为第一个数while n<max :print(b)a , b = b , a+b # 相当于a=b , b=a+b n = n + 1 print('done')#调用
    fib(6)
    
  6. 定义generator的另一种形式: 如果一个函数中包含了yield关键字 , 那么这个函数就不再是一个普通函数 , 而是一个generator 。

    #从上面的例子可以看出和generator非常类似 , 可以从第一个元素开始推算出后续的任意元素 。
    #想要把fib()函数变为generator , 其实只要将print(b) 变为yield b 就可以了def fib(max) :n , a , b  = 0 , 0 , 1#n控制循环次数 , a为假设的第0个数 b为第一个数while n<max :yield ba , b = b , a+b # 相当于a=b , b=a+b n = n + 1 print('done')f=fib(6)
    print(f)
    
  7. 需要注意的是:generator和函数的执行流程是不一样的 , 函数时顺序执行 , 从上至下 , 遇到return语句或函数最后一句时就返回 。但是generator在每次调用next()函数时执行 , 遇到yield语句返回 , 再次执行时从上次返回的yield处继续执行 。

    #generator函数的执行顺序
    #generator遇到yield之后返回结果 , 下次执行时从上次的yield出执行
    def odd() :print("step 1")yield 1print("step 2")yield 2print("step 3")yield 3o=odd()
    r1 = next(o)
    print(r1)
    r2 = next(o)
    print(r2)
    r3 = next(o)#当顺序执行完yield关键字之后 , 再执行next()函数就会报错
    print(r3)
    
  8. 即使generator是以函数的形式定义的 , 我们也几乎不会用next()函数获取返回值 , 而是使用迭代遍历

    def odd() :print("step 1")yield 1print("step 2")yield 2print("step 3")yield 3#使用迭代遍历获取generator函数返回的值
    for r in odd() :print(r)
    
  9. 当generator以函数的形式定义 , 并且generator中含有return语句时 , 会发现拿不到return语句中的返回值 , 如果想要拿到返回值 ,则必须捕获StopIteration错误 , 返回值包含在StopIteration的value中:

    def odd() :print("step 1")yield 1print("step 2")yield 2print("step 3")yield 3return "done"o=odd()
    while True:try:x=next(o)print(x)except StopIteration as e:print("return:" , e.value)break
    
  10. 总结
    1. generator 是非常强大的工具 , 在Python中 , 可以简单的把列表生成式改为generator, 也可以通过函数形式实现复杂李玉偶记的generator
    2. generator工作时的原理: generator在for循环的过程中不断的计算下一个元素 , 并在适当的条件结束for循环 。 对于普通函数改成的generator来说, 遇到return语句或者执行到函数最后一行语句 , 就是结束generator的指令 , for循环随之结束 。

五 、 迭代器

  1. 通过以上的学习已经知道 , 可以使用for循环的数据类型有以下几种:

    1. 集合数据类型: list 、 tuple 、 dict 、 set 、 str 。
    2. generator :包括生成器和带yield的generator function
    3. 这些可以直接作用于for循环的对象统统成为可迭代对象

      # -*-  coding : utf-8-*-
      #判断数据类型是否是一个可迭代类型
      from collections import Iterable flag = isinstance([] , Iterable)
      print("list是否是可迭代对象:" , flag)flag = isinstance(() , Iterable)
      print("tuple是否是可迭代对象:" , flag)flag = isinstance({} , Iterable)
      print("dict 、 set 是否是可迭代对象:" , flag)flag = isinstance("" , Iterable)
      print("str是否是可迭代对象:" , flag)
      
  2. 生成器不但可以用for循环遍历 , 还可以被next()函数不断电泳并返回下一个值 , 知道最后抛出一个StopItreator 错误表示无法继续返回下一个值了 。
  3. 可以被next()函数调用并不断返回下一个值的对象称之为迭代器
    1. 生成器是Iterator对象 , 但是list 、 dict 、 str虽然是Iterable , 却不是Iteraor
    2. 想要把Iterable转换为Iterator可以使用iter()函数
  4. 思考: list 、 dict 、 str为什么不是Iterator对象?
    1. 因为pyhton 中Iterator对象表示的是一个数据流 , Iterator对象可以被next()函数调用并不断返回下一个数据 , 直到没有数据时抛出StopIteration错误 , 可以把这个数据流看作是一个有序序列, 但是我们不能提前知道序列的长度 , 只能不断的通过next()函数实现按需计算下一个数据 , 所以Iterator的计算时惰性的 , 只有在需要返回下一个数据时他才会计算 。
    2. Iterator甚至可以表示一个无限大的数据流 , 列如:全体自然数 , 而使用list永远不可能存储全部自然数 。
  5. 迭代器总结:

    1. 凡是可用作与for循环的对象都是Iterable类型
    2. 凡是可以作用于next()函数的对象都是Iterator类型 , 他们表示一个惰性的计算的序列 。
    3. 集合数据类型如: list 、 dict 、tuple 、 set 、 str都不是Iterator类型的数据 , 但是可以通过iter()函数转换为一个Iterator类型的对象 。
    4. Python的for循环本质上就是通过不断调用next()函数实现的 。如:

      # -*- conding : utf-8-*-#迭代器
      #Python中的for循环实质上是通过不断调用next()函数实现的 。L = [1,32,3,4,5,6,7,8,89,9,]for l in L:pass#等同于
      it = iter(L)
      while True:try :#获取下一个值x = next(it)except StopIteration as e :#遇到异常break;
      

Python (五) 高级特性相关推荐

  1. python的高级特性:切片,迭代,列表生成式,生成器,迭代器

    python的高级特性:切片,迭代,列表生成式,生成器,迭代器 1 #演示切片 2 k="abcdefghijklmnopqrstuvwxyz" 3 #取前5个元素 4 k[0:5 ...

  2. 一文了解Python部分高级特性

    本部分主要介绍 Python 的部分高级特性,包括切片.迭代器.推导式.生成器.匿名函数.装饰器等.阅读本文预计需要 15 min. 一文了解Python部分高级特性 1. 前言 2. 切片 3. 迭 ...

  3. python 的高级特性:函数式编程,lambda表达式,装饰器

    一.Python语言的高级特性 函数式编程 基于Lambda演算的一种编程方式 程序中只有函数 函数可以作为参数,同样可以作为返回值 纯函数式编程语言:LISP,Haaskell Python函数式编 ...

  4. python的高级特性3:神奇的__call__与返回函数

    __call__是一个很神奇的特性,只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用. 也许说的比较抽象,举个例子就会明白. In [107]: f = absIn [1 ...

  5. python 11高级特性

    切片 取列表中前3个元素我们常见的方法有两种: [L[0],L[1],L[2]] 采用循环的方式如下图所示. 对这种经常取指定索引范围的操作,用循环十分繁琐,因此,Python提供了切片(Slice) ...

  6. JavaSE复习之十五 高级特性:数据库及数据库连接 补充(1)

    数据库MYSQL 今日内容介绍 MySQL数据库 SQL语句 第1章 数据库 1.1 数据库概述 l 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用 ...

  7. 【Python】高级特性 一

    切片 取一个list或tuple的部分元素 常规方法: 循环方法: 切片操作符: #切片 #取一个list或者tuple的部分元素是非常常见的操作 #取前三个元素 #利用切片操作,实现一个trim() ...

  8. python中io中的+模式_Python的高级特性,模块和IO操作

    今天我们学习Python的高级特性.模块和IO操作,通过学习这些,我们可以更快的了解Python,使用Python. 高级特性中会讲述列表生成式.生成器.和一些高级函数,学习这些方便我们快速的生成列表 ...

  9. Python高级特性

    我一直认为Python是一门很神奇的语言.神奇之处在于其既可阳春白雪,亦可下里巴人.也就是其简单到几乎所有的人稍加学习即可上手,但是你如果细细品味,就会发现他还有很多高深的东西.正如一位漂亮的姑娘,一 ...

最新文章

  1. winhttp get 实例_实例|CASS的绘制的航道断面,怎么多了两个边沟? 135
  2. Python测试框架pytest(01)简介、安装、快速入门
  3. 待解决的问题--用DOS命令删除远程主机系统文件的方法
  4. python字符编码导致dict中key不同
  5. 如果有机会,买一个能够兼容多终端的大屏幕是很重要的
  6. Docker启动失败 提示An error occurred和乱码
  7. rds 数据导入mysql_将数据导入到 Amazon RDS 数据库实例
  8. ASP.NET Core集成Nacos配置中心之适配多格式配置
  9. Grove-Lora Radio:修改库函数使能修改扩频因子、带宽参数、码率
  10. 去哪儿-10-city-ajax
  11. 割线法求解过程_浸入边界法求解流固耦合问题
  12. GitHub冲突解决
  13. 装逼技能:怎样优雅地摆放桌面图标?
  14. python docx文档_【IT专家】python操作docx文档
  15. 怎么制作鸿蒙系统启动盘,dos系统启动盘怎样做
  16. StackStorm安装WebUI
  17. 网易云音乐外链(PHP的curl函数)
  18. 拒绝被淘汰,如何打造自己的金饭碗?
  19. 在linux系统上查看本机ip地址
  20. Windows游戏编程学习笔记

热门文章

  1. oracle status
  2. 一些常用的基本的liunx命令:
  3. mysql selectprovider_使用Mybatis的@SelectProvide会不会导致注入攻击?
  4. 三角网导线平差实例_网平差三角网三边导线网.doc
  5. mysql-proxy myrelay_myrelay
  6. 橙子云手机华为保修吗_华为云手机引关注!将替代传统手机?华为回应来了
  7. Java黑皮书课后题第4章:4.22(检测子串)编写一个程序,提示用户输入两个字符串,检测第二个字符串是否是第一个字符串的子串
  8. 怎样分组教学计算机学生才有兴趣,学生计算机论文,关于如何激发职业中专学生学习计算机的兴趣相关参考文献资料-免费论文范文...
  9. Java内存缓存-通过Map定制简单缓存
  10. 自由群,外代数和泛包络代数