一.切片
L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
取出前三个元素 , 笨方法就是通过下标一个一个获取 [L[0], L[1], L[2]]
Python做好了封装
可以通过切片就行快速获取
L[0:3] 进行获取 还可以倒着来 比如L[-2,-1]
取出前几个 L[:N]
后几个L[N:]
前几个每几个取一个L[:N:X]
所有数每几个取一个L[::X]
其中字符串也可以进行切片 例如C#的substring(N,X) 当然tuple也肯定可以.
二.迭代
给list或者tuple进行遍历 我们叫做迭代
如何判断一个对象是否可迭代呢 通过isinstance关键字
>>> isinstance('abc', Iterable) # str是否可迭代
True

如果要对集合实现类似JAVA那样的下标循环怎么办?
Python内置了一个enumerate函数可以将list变成 索引-元素对,这样就可以for循环迭代索引和元素本身
for i ,value in enumerate(['a','b','c'])
print(i,value)
如果要循环多个tuple可以这么搞
>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
... print(x, y)
...
1 1 2 4 3 9
练习 :使用迭代找到list中最大和最小的数,并返回一个tuple
def findmaxandmin(L):
if L!=[]:
max = L[0]
min = L[0]
for i in L:
if i>max:
max = i
elif i<min:
min = i
return(min,max)
else:
return (None,None)
>>> a = findmaxandmin([7,11,17,4,8])
>>> print(a)
(4, 17)
三.列表生成式
列表生成式即list comprehensions,是python非常简单却非常强大的可以用来创建list的生成式
举个例子: 要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11)):
但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:
L = []
for x in range(1,11):
L.append(x*x)
但是这种方式有点呵呵了..让我们看一种高级的写法
[x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
这种方式是列表生成式用处的最好体现.
[x + n for x in 'ABC' for n in 'FGH']
['AF', 'AG', 'AH', 'BF', 'BG', 'BH', 'CF', 'CG', 'CH']
呵呵..还有这种骚操作...
for 循环的后面还可以加上if判断
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
比如查看当前目录的文件
import os
>>> [d for d in os.listdir('.')]
['DLLs', 'Doc', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'python3.dll', 'python37.dll', 'pythonw.exe', 'Scripts', 'tcl', 'Tools', 'vcruntime140.dll']
for循环可以循环多个变量,例如 d = {'x':'A','y':'a','E':'C'} for x,v in d.items():print(k,'=',v)
但是不够简洁,我们这个时候就还可以使用列表生成式.. [k +'='+v for k,v in d.items()] 结果 : ['x=A', 'y=a', 'E=C']
比如将一组字符串转换为小写 L = ['ASFAS','Acaac'] >>> [v.lower() for v in L] 结果 : ['asfas', 'acaac']
反正用处多多了,再见了列表生成式...
四.生成器
通过列表生成式,我们可以直接创建一个列表,但是,但是收到内存限制,列表容量肯定是有限的,而且创建100万个元素,不仅占据了很大的内存空间,而且我们们就仅仅用那几个元素.那后面绝大的空间就白白浪费了.所以.如果列表元素根据那种算法推算出来,这样就可以去掉不必要的元素,从而节省大量内存,在Python中,这种 "一边循环一边计算的机制" 叫做 "generator".
创建generator的方法和列表生成器差不多,就是把中括号变成括号 [列表生成式] ----(生成器)
示例:
>>> [x*x for x in range(1,10)] ##这是列表生成式
[1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x*x for x in range(10)) ##这是生成器
>>> g
<generator object <genexpr> at 0x000001E4C1D82318>
但是我们应该怎么去访问里面的元素的呢.. Python让我们通过next关键字 一个一个去里面找
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
>>> next(g)
25
>>> next(g)
36
>>> next(g)
49
>>> next(g)
64
>>> next(g)
81
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
generator保存的是算法,每次调用next(n),就会计算出n的下一个元素.直到最后一个元素.没有更多的元素时,抛出StopIteration的错误.
不过!!!,这太变态,正确的方式应该是通过for循环,因为generator是可迭代对象.
isinstance(g,Iterable) --》true
>>> for i in g:
print(i)
所以我们创建了一个generator后,基本上永远都不会用到next() ,二十通过for循环去迭代它,并不需要关心StopIteration的error
网上的一个斐波拉契数
用函数表示
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
其中赋值的操作 n,a,b = 0,0,1相当于 t = (0,0,1) #t就是个tuple, n = t[0] a = t[1] b = t[2]
其中斐波拉契数就非常类似generator 我们需要如何修改呢 : 直接将print 改成yield.
五.迭代器
我们已经知道,可以直接用于for循环的数据类型有以下几种:
一类是集合类型:list、tuple、dict、set、str 等
一类是generator,包括生成器与带tyield的generator function
可以被迭代的对象统称叫做Iterable
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
可以使用isinstance()判断一个对象是否是Iterator对象:
有趣的是生成器都是Iterator对象,但list、dict、str虽然是Iterable,但不是Iterator...
把Iterable转换为Iterator转换为可以用到iter()函数 (L = (1,2,3) Liter = iter(L))

Python高级特性(一)的更多相关文章

  1. 三、python高级特性(切片、迭代、列表生成器、生成器)

    1.python高级特性 1.1切片 list列表 L=['Mli','add','sal','saoo','Lkkl'] L[0:3]  #即为['Mli','add','sal']  从索引0开始 ...

  2. python高级特性:切片/迭代/列表生成式/生成器

    廖雪峰老师的教程上学来的,地址:python高级特性 下面以几个具体示例演示用法: 一.切片 1.1 利用切片实现trim def trim(s): while s[:1] == " &qu ...

  3. python高级特性和高阶函数

    python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...

  4. Python高级特性(3): Classes和Metaclasses(转)

    原文:Python高级特性(3): Classes和Metaclasses 类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个“类对象”并将其赋值给一个同名变 ...

  5. Python高级特性(2):Closures、Decorators和functools(转)

    原文:Python高级特性(2):Closures.Decorators和functools 装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过 ...

  6. Python高级特性(1):Iterators、Generators和itertools(转)

    译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...

  7. Python高级特性之:List Comprehensions、Generator、Dictionary and set ...

    今天帅气的易哥和大家分享的是Pyton的高级特性,希望大家能和我一起学习这门语言的魅力. Python高级特性之:List Comprehensions.Generator.Dictionary an ...

  8. Python 高级特性介绍 - 迭代的99种姿势 与协程

    Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...

  9. Python高级特性(切片,迭代,列表生成式,生成器,迭代器)

    掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...

  10. Python 高级特性(1)- 切片

    前言 面 tx 被问到 python 的高级特性相关,这里做个补充学习吧 正向范围取值 关键点 首位下标是 0 第一个数字是起始下标,第二个数字是结束下标(但最终结果不包含它) 代码块一 # 正向范围 ...

随机推荐

  1. JIRA

    https://www.jianshu.com/p/8c14b52ce692 JIRA这个工具接触有好几年了,在多个海外项目上都用过这个工具.去年又在项目上深度使用后就有点爱不释手了,回国后也在找机会 ...

  2. PHP 关于判断输入日期是否合法

    合法要求 一年仅十二个月 4,6,9,11月仅30天,1,3,5,7,8,10,12月仅31天 闰年2月29天,否则28天 输入的变量年,月,日为数字 代码: <?php //PHP中判断输入的 ...

  3. 开始食用grpc(之一)

    开始食用grpc(之一) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9501353.html ```   记一次和一锅们压马路,路过一咖啡厅(某巴克),随口 ...

  4. 2018-2019-2 网络对抗技术 20162329 Exp6 信息搜集与漏洞扫描

    目录 Exp6 信息搜集与漏洞扫描 一.实践原理 1. 间接收集 2. 直接收集 3. 社会工程学 二.间接收集 1. Zoomeye 2. FOFA 3. GHDB 4. whois 5. dig ...

  5. 无代理处理post非简单请求跨域问题

    express下 在处理纯http服务post请求的时候的跨域问题 即使在服务端先加入 Access-Control-Allow-Origin: *(get即时有效) 会出现 Failed to lo ...

  6. Hibernate HQL ③

    迫切左外连接: - LEFT JOIN FETCH 关键字表示迫切左外连接检索策略 - list()方法返回的集合中存放实体对象的引用,每个 Department 对象关联的 Employee 集合都 ...

  7. Linux正则表达式练习

    练习一 1.生成30位的随机口令 [root@centos7 ~]#cat /dev/urandom | tr -dc "[:alnum:]" | head -c30 RJL5qc ...

  8. Redis_MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk问题解决

    原因:可参考https://www.linuxidc.com/Linux/2012-07/66079.htm 解决方案一: 修改redis.conf中 stop-writes-on-bgsave-er ...

  9. ueditorUE 去掉本地保存成功的提示框!

    网上修改什么JS的太麻烦,这样比较暴力,仅供参考 这里直接修改的样式: ue.ready(function () {                 $(".edui-editor-mess ...

  10. RabbitMQ in Action (2): Running and administering Rabbit

    Server management the Erlang node and the Erlang application Starting nodes multiple Erlang applicat ...