python的高级特性:切片,迭代,列表生成式,生成器,迭代器
python的高级特性:切片,迭代,列表生成式,生成器,迭代器
#演示切片
k="abcdefghijklmnopqrstuvwxyz"
#取前5个元素
k[0:5]
k[:5]
#后5个元素
k[-5:] #vwxyz
#每隔一个取一个
k[::2] #acegikmoqsuwy
#原样复制一个
k[:] #演示迭代
d={'a':1,'b':2,'c':3}
for key in d:
print(key)
#结果输出abc, 即输出key, 而且要注意dict的迭代顺序不像list是顺序排列的 for v in d.values():
print(v)
#按值输出, 1,2,3 for k,v in d.items():
print(k+":"+str(v))
#按键值对输出,a:1,b:2,c:3 ary=range(10)
for i,v in enumerate(ary):
print(str(i)+" "+str(v))
#enumerate函数可以把一个list变为索引元素对,这样我们迭代元素就可以同时取得索引 for x,y in [(1,1),(2,4),(3,7)]:
print(x,y)
#for循环里,引用两个变量是比较常见的 #下面演示 列表生成式
k=list(range(1,11))
print(k)
#显示 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] k=[x*x for x in range(1,11)]
print(k)
#显示 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] k=[x*(x+1) for x in range(1,11,2)]
print(k)
#显示 [2, 12, 30, 56, 90] #在列表生成器中我们还可以在后面附加if条件语句
def toUppers(L):
return [x.upper() for x in L if isinstance(x,str)] print(toUppers(['hello','world',100]))
#显示 ['HELLO', 'WORLD'] #在列表生成式中,也可以用多层 for 循环来生成列表
print([m*100+n*10+z for m in range(1,10) for n in range(0,10)
for z in range(1,10) if m*100+n*10+z==z*100+n*10+m]) #结果
#[101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 202, 212, 222, 232, 242,
# 252, 262, 272, 282, 292, 303, 313, 323, 333, 343, 353, 363, 373, 383, 393,
# 404, 414, 424, 434, 444, 454, 464, 474, 484, 494, 505, 515, 525, 535, 545,
# 555, 565, 575, 585, 595, 606, 616, 626, 636, 646, 656, 666, 676, 686, 696,
# 707, 717, 727, 737, 747, 757, 767, 777, 787, 797, 808, 818, 828, 838, 848,
# 858, 868, 878, 888, 898, 909, 919, 929, 939, 949, 959, 969, 979, 989, 999] print([m+n for m in 'ABC' for n in 'XYZ'])
#结果 ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ'] #列出当前目录下的所有文件与目录名
import os
print([d for d in os.listdir('.')]) #下面演示 生成器
#生成器类似于C#中的滞后执行机制,只在迭代时占用资源。其目的是不会一次把
#100万个列表一次载入内存。
list1=[x*x for x in range(10)]
print(list1)
#输出 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] #下面的g就是一个生成器 generator
g=(x*x for x in range(10))
print(g)
#输出 <generator object <genexpr> at 0x0000021FAC0A3B48>
#如果要输出generator的每个元素,可以用next()函数
print(next(g)) #
print(next(g)) #
print(next(g)) #
#正常的方式还是使用forgrgi循环迭代对象
for n in g:
print(n) #斐波拉契数列生成的函数
def fib(max):
n,a,b=0,0,1
while n<max:
print(b)
a,b=b,a+b
n=n+1
return 'done'
fib(6)
#输出 1 1 2 3 5 8 #我们把上面的函数改成generator, 只需要把print(b) 改为yield b
#这就是定义generator的另一种方法,一个函数中包含yield关键字,它就不
#是一个普通函数,而是一个generator
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n=n+1
return 'done' f=fib(6)
print(f)
#输出 <generator object fib at 0x000001F82E3C3C50> #用for循环generator时,会发现拿不return的返回值,其实必须要捕获
#StopIteration错误,才可以。
g=fib(6)
while True:
try:
x=next(g)
print('g:',x)
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的执行流程
def odd():
print('step1')
yield 1
print('step2')
yield (3)
print('step3')
yield (5) #调用
o=odd()
next(o) #step1
next(o) #step2
next(o) #step3
#next(o) #StopIteration #总结一下:
#能用于for循环的类型有
#(一)集合类型 list,tuple,dict,set,str等
#(二) generator, 包括生成器和带yield的generator function
#这些对象统称为可迭代的对象: Iterable #可以使用isinstance判断一个对象是否是Iterable对象:
from collections import Iterable
print(isinstance([],Iterable)) #True
print(isinstance('abc',Iterable)) #True
print(isinstance(100,Iterable)) #False #而可以被next()函数调用并不断返回下一个值的对象称为迭代器 Iterator
#可以使用isinstance()判断是否为Iterator对象
from collections import Iterator
print(isinstance((x for x in range(10)),Iterator))
print(isinstance([2,3,4],Iterator)) #生成器都是Iterator对象,但是list,dict,str虽然是Iterable,去不是Iterator
#把list,dict,str转为Iterator可以使用iter()函数
print(isinstance(iter('abcdefg'),Iterator))
#结果 True #Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是不可能存储全体自然数的
python的高级特性:切片,迭代,列表生成式,生成器,迭代器的更多相关文章
- python高级特性:切片/迭代/列表生成式/生成器
廖雪峰老师的教程上学来的,地址:python高级特性 下面以几个具体示例演示用法: 一.切片 1.1 利用切片实现trim def trim(s): while s[:1] == " &qu ...
- Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
定义函数 def my_abs(x):#求绝对值的my_abs函数 if x >= 0: return x else: return –x def nop():#空函数 pass#占位符 参数检 ...
- Python笔记(九)_切片、列表生成式
切片 mylist[:3] 取前3位元素,0可省略不写 mylist[-4:] 取后4位元素,0可省略不写 mylist[2:4] 从第2个开始取,取到第4个,但第4个不取,取的元素值为4-2=2 m ...
- Python之旅Day5 列表生成式 生成器 迭代器 装饰器
装饰器 器即函数,装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器涉及的知识点= 高阶函数+函数嵌套+闭包 在遵循下面两个原则的前提下为被装饰者新功能 ...
- 列表生成式 生成器 迭代器 yield
列表生成式 格式:通过一个或者若干个在List里边的for构建List而非List外部的for循环 举个例子:计算从1到10整数的平方构成一个List L=[ x*x for x in range(1 ...
- python 基础 切片 迭代 列表生成式
对list 进行切片 如列表 L = ['Adam', 'Lisa', 'Bart', 'Paul'] L[0:3] ['Adam', 'Lisa', 'Bart'] L[0:3]表示,从索引0开始取 ...
- Python 高级特性介绍 - 迭代的99种姿势 与协程
Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...
- python协程函数应用 列表生成式 生成器表达式
协程函数应用 列表生成式 生成器表达式 一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...
- Python的高级特性8:你真的了解类,对象,实例,方法吗
Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...
随机推荐
- Dynamics CRM 2015/2016 Web API:聚合查询
各位小伙伴们,今天是博主2016年发的第一篇文章.首先祝大家新年快乐.工资Double,哈哈.今天我们来看一个比較重要的Feature--使用Web API运行FetchXML查询! 对的,各位.你们 ...
- spring oxm入门(包含demo)
O/X Mapper 是什么? Spring 3.0 的一个新特性是 O/X Mapper.O/X 映射器这个概念并不新鲜,O 代表 Object,X 代表 XML.它的目的是在 Java 对象(几乎 ...
- A:LinkedList实现了List接口; B: AbstractSet实现了Set接口; C: HashSet继承自AbstractSet基类; D: WeakMap继承自 AbstractMap
List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedListSet有两个实现类:HashSet和LinkedHashSetAbstractS ...
- 近期全国各地联通线路无法访问OA的解决方案
最近有多地区使用联通线路的用户无法访问easyradius控制台,即oa.ooofc.com,其主要的原因是由于联通的DNS解析错误,导致的 oa.ooofc.com的解析IP是115.239.252 ...
- TensorFlow-tensorboard可视化
运行了很多次出现错误,错误原因在于运行tensorboard时,需要退出python编辑
- Godray
软管的这个有点蛋疼..应该是我材质没弄好 最后发现不是材质,是法线不正确,调整后
- 【转】Spring Boot干货系列:(二)配置文件解析
转自:Spring Boot干货系列:(二)配置文件解析 前言 上一篇介绍了Spring Boot的入门,知道了Spring Boot使用"习惯优于配置"(项目中存在大量的配置,此 ...
- <转>Win8.1+CentOS7 双系统 U盘安装
0.准备工作 1.宏碁 Aspire 4752G 笔记本 2.Win8.1 企业版操作系统 3.8G 以上 U 盘 4.UltraISO(当然也可以选择其他的U盘制作工具,看个人喜好) 5.下载 Ce ...
- 解决ESXi有虚拟机模版部署的CentOS虚拟机,网卡eth0找不到问题
1,问题和虚拟机克隆后出现网卡找不到问题类似. 2,修改主机名hostname 修改 /etc/sysconfig/network文件 3,删除/etc/sysconfig/network-scrip ...
- 【WP8】仿QQ提示消息
WP版的QQ提示消息的时候从顶部滑入,3秒后从顶部滑出,本文模仿该效果实现一个MessageToastManager类用于显示提示消息 思路很简单,就是动画而已,支持配置颜色和回掉 // ****** ...