Python高级特性(一)
一.切片
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高级特性(一)的更多相关文章
- 三、python高级特性(切片、迭代、列表生成器、生成器)
1.python高级特性 1.1切片 list列表 L=['Mli','add','sal','saoo','Lkkl'] L[0:3] #即为['Mli','add','sal'] 从索引0开始 ...
- python高级特性:切片/迭代/列表生成式/生成器
廖雪峰老师的教程上学来的,地址:python高级特性 下面以几个具体示例演示用法: 一.切片 1.1 利用切片实现trim def trim(s): while s[:1] == " &qu ...
- python高级特性和高阶函数
python高级特性 1.集合的推导式 列表推导式,使用一句表达式构造一个新列表,可包含过滤.转换等操作. 语法:[exp for item in collection if codition] if ...
- Python高级特性(3): Classes和Metaclasses(转)
原文:Python高级特性(3): Classes和Metaclasses 类和对象 类和函数一样都是Python中的对象.当一个类定义完成之后,Python将创建一个“类对象”并将其赋值给一个同名变 ...
- Python高级特性(2):Closures、Decorators和functools(转)
原文:Python高级特性(2):Closures.Decorators和functools 装饰器(Decorators) 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过 ...
- Python高级特性(1):Iterators、Generators和itertools(转)
译文:Python高级特性(1):Iterators.Generators和itertools [译注]:作为一门动态脚本语言,Python 对编程初学者而言很友好,丰富的第三方库能够给使用者带来很大 ...
- Python高级特性之:List Comprehensions、Generator、Dictionary and set ...
今天帅气的易哥和大家分享的是Pyton的高级特性,希望大家能和我一起学习这门语言的魅力. Python高级特性之:List Comprehensions.Generator.Dictionary an ...
- Python 高级特性介绍 - 迭代的99种姿势 与协程
Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...
- Python 高级特性(1)- 切片
前言 面 tx 被问到 python 的高级特性相关,这里做个补充学习吧 正向范围取值 关键点 首位下标是 0 第一个数字是起始下标,第二个数字是结束下标(但最终结果不包含它) 代码块一 # 正向范围 ...
随机推荐
- Quartz+JAVA+Servlet实现任务调度系统(简洁)
前言 该系统使用场景: 在12306上买了一张火车票,30分钟内需要支付(需要添加一个倒计时),30分钟还没有支付就请求取消订单的接口(自动根据url请求),如果支付了收到了支付的回调通知后,就删除计 ...
- 使用Python开发的POC多线程批量执行小框架
因为代码量非常少,所以就叫“小框架”吧. 接口非常简陋,但是好处是适配POC脚本的时候很灵活,兼容性高,不需要任何研究成本. 简单来说,你按照自己的想法和习惯开发一个POC验证程序,它只要做到三点,即 ...
- 决AndroidStudio 安卓模拟器安装在D盘问题
决AndroidStudio 安卓模拟器安装在D盘问题 转 http://www.cnblogs.com/LiuDanK/articles/10106473.html 大家知道安卓的模拟器位置默认是放 ...
- windows下cmd命令行上传代码到github的指定库
https://blog.csdn.net/a419419/article/details/80063010 git错误:unable to auto-detect email address 解决办 ...
- PHP常用日期加减计算方法实例
PHP常用日期加减计算方法实例 实例总结了PHP常用日期加减计算方法.分享给大家供大家参考,具体如下: PHP 标准的日期格式 date("Y-m-d H:i:s"); PHP 简 ...
- MyBatis(九) 使用association定义单个对象的封装规则
(1)接口中编写方法 public Emp getEmpandDept(); (2)编写Mapper文件 <resultMap type="com.eu.bean.Emp" ...
- python爬虫第三天
DebugLog实战 有时候我们需要在程序运行时,一边运行一边打印调试日志.此时需要开启DebugLog. 如何开启: 首先将debugleve ...
- 常用的js效果
使用jquery实现鼠标悬停显示层 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- Python3小知识点
1. 是转义字符,\可以输出.在一行的末尾单独的一个\表示这行没有结束,下一行接着写 2.可以用"'或"""把一大段话引起来(可以换行)然后赋值,输出. 3.要 ...
- Python3.x在linux下print中文问题
由于python3内部以Unicode实现,在默认非utf-8的Linux上print中文会报错UnicodeEncodeError. 由于系统默认非unicode,python3又以unicode实 ...