Python基础笔记:高级特性:切片、迭代、列表生成式、生成器、迭代器
题记:
在python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。
1行代码能实现的功能,绝不写5行代码。
请始终牢记:代码越少,开发效率越高。
切片
>>> L=list(range(11)) #生成数0~10
>>> L
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> L[:5] #输出0~4
[0, 1, 2, 3, 4]
>>> L[-5:] #输出倒数第5个~最后
[6, 7, 8, 9, 10]
>>> L[3:7] #输出3~6
[3, 4, 5, 6]
>>> L[0:6:2] #在0~5,每隔2个取一个
[0, 2, 4]
>>> L[::5] #在整个list L上,每隔5个取一个
[0, 5, 10]
编写程序:实现一个trim()函数,取出字符串首尾的空格
def trim(x):
l=len(x)
a=0
b=0
for i in range(l):
if x[i]!=' ':
a=i
break
if a==l-1:
return
else:
for i in range(l):
if x[l-i-1]!=' ':
b=l-i
break
def trim(x): #递归函数实现
if x[0]==' ':
x=trim(x[1:])
if x[-1]==' ':
x=trim(x[:-2])
return x >>> from hello import trim
>>> trim('hello ')
'hello'
迭代(Iterate)
可以迭代的有str,list,tuple,dict ; 迭代是通过for...in来完成的
怎么判断一个对象是否是可迭代对象呢?
>>> from collections import Iterable
>>> isinstance('abc',Iterable)
True
>>> isinstance([1,2,3],Iterable)
True
>>> isinstance(123,Iterable)
False
一些迭代示例:
>>> d={'a':1,'b':2,'c':3} #对dict进行迭代
>>> for key in d: #迭代键值
... print(key)
...
a
b
c
>>> for v in d.values():
... print(v)
...
1
2
3
>>> for key,v in d.items(): #迭代list里元素
... print(key,v)
...
a 1
b 2
c 3
for ch in 'ABC': #对str迭代
... print(ch)
...
A
B
C
>>> for i,value in enumerate(['A','B','C']): #把list变成索引-元素对
... print(i,value)
...
0 A
1 B
2 C
>>> for i in enumerate(['A','B','C']):
... print(i)
...
(0, 'A')
(1, 'B')
(2, 'C')
>>> L=[]
>>> for i in enumerate(['A','B','C']):
... L.append(i)
...
>>> L
[(0, 'A'), (1, 'B'), (2, 'C')]
编程:使用迭代查找一个list中最小和最大值,并返回一个tuple
def find_mm(x):
if len(x)==0:
return (None,None)
else:
a=min(x)
b=max(x)
return (a,b) >>> from hello import find_mm
>>> x=[7]
>>> find_mm(x)
(7, 7)
列表生成器
示例:
>>> [x*x for x in range(1,11)] #生成1*1 2*2 ... 10*10 的列表
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> [x*x for x in range(1,11) if x%2==0] #仅筛选出偶数的平方
[4, 16, 36, 64, 100]
>>> [m+n for m in 'ABC' for n in 'XYZ'] #生成连个串的全排列
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
>>> d={'x':'','y':'','z':''} #把dict生成列表
>>> [k+v for k,v in d.items()]
['x1', 'y2', 'z3']
>>> [k+'='+v for k,v in d.items()]
['x=1', 'y=2', 'z=3'] C:\work>python #在C:\work 目录下打开python解释器
Python 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os #导入os模块
>>> L=[d for d in os.listdir('.')] #os.listdir可以列出文件和目录
>>> ss=[s.upper() for s in L] #把list中所有的字符串变成大写
>>> ss
['HELLO.PY', '__PYCACHE__']
>>> ss=[s.lower() for s in L] #把list中所有的字符串变成小写
>>> ss
['hello.py', '__pycache__']
>>>
>>> for i in ss:
... if i=='hello.py':
... print('Right here!')
...
Right here!
内置函数 isinstance(x,str)、isinstance(x,int) 用来判断x是否是str型或int型
>>> x=5
>>> if isinstance(x,int)==True:
... print('yes!')
...
yes!
>>> x='fuck you!'
>>> if isinstance(x,str)==True:
... print('yes!')
...
yes!
上面判断一个数据是否可以迭代也是 isinstance() 这个函数(名);
练习:修改列表生成式,通过添加 if 语句保证列表生成式能正确地执行
L1=['Hello','World',18,'Apple',None]
>>> L1 = ['Hello', 'World', 18, 'Apple', None]
>>> L2=[s.lower() for s in L1 if isinstance(s,str)==True]
>>> L2
['hello', 'world', 'apple']
生成器:一边循环一边计算的机制
迭代器:已经计算完毕,进行循环
生成器(generator)
要创建一个generator :只要把一个列表生成式的[ ] 改成 ( ) ,就创建了一个generator:
>>> g=(x*x for x in range(10))
>>> g
<generator object <genexpr> at 0x000001E5405C7830>
可以用next() 函数一个一个打印出来generator 的下一个返回值;
>>> g=(x*x for x in range(10))
>>> g
<generator object <genexpr> at 0x000001E5405C7830>
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
.....
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration #genereator 保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
当然,generator是可迭代的:
>>> isinstance(g,Iterable)
True
>>> for i in g:
... print(i)
...
16
25
36
49
64
81
>>>
#generator g 好像有记忆一项,上次利用next函数输出到9,这次从16开始输出!
有输出斐波那契数列的函数:
def fib(max):
n,a,b=0,0,1
while n<max:
print(b)
a,b=b,a+b
n+=1
return 'done'
把这个函数换成generator 只需要把 print(b) 改为 yield b 就可以了。
def fib(max):
n,a,b=0,0,1
while n<max:
yield b
a,b=b,a+b
n+=1
return 'done'
a = f() #创建生成器对象 for i in range(10): #斐波那契数列中前10个元素
print(a.__next__(), end=' ') 1 1 2 3 5 8 13 21 34 55
>>> from hello import fib
>>> f=fib(5)
>>> for i in f:
... print(i)
...
1
1
2
3
5
#如果是函数的话:
>>> f=fib(6)
1
1
2
3
5
8
但是用for 循环调用generator 时,发现拿不到generator 的return 语句的返回值。如果想要拿到返回值,必须不过StopIteration 错误,返回值包含在StopIteration 的 value 中:
>>> from hello import fib
>>> 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
编程:输出杨辉三角
def triangle(max):
n,L=0,[1]
for i in range(max):
yield L
s=[]
if len(L)>=2:
for j in range(len(L)-1):
s.append(L[j]+L[j+1])
s.append(1)
s.insert(0,1)
L=s
return 'done'
>>> t=triangle(10)
>>> while True:
... try:
... x=next(t)
... print('t:',x)
... except StopIteration as e:
... print('Generator return value:',e.value)
... break
...
t: [1]
t: [1, 1]
t: [1, 2, 1]
t: [1, 3, 3, 1]
t: [1, 4, 6, 4, 1]
t: [1, 5, 10, 10, 5, 1]
t: [1, 6, 15, 20, 15, 6, 1]
t: [1, 7, 21, 35, 35, 21, 7, 1]
t: [1, 8, 28, 56, 70, 56, 28, 8, 1]
t: [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
Generator return value: done
迭代器
直接作用于 for 循环的数据类型有:
1.集合数据类型,如list、tuple、dict、set、str等;
2.generator ,包括生成器和带yield 的generator function。
可以被next() 函数调用并不断返回下一个值的对象称为迭代器:Iterator
>>> from collections import Iterable
>>> isinstance([], Iterable) #使用isinstance()#判断一个对象是否是Iterable对象
True
>>> isinstance((x for x in range(10)), Iterator) #判断一个对象是否是Iterator对象
True
你可能会问,为什么list、dict、str等数据类型不是Iterator?
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。
Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Python基础笔记:高级特性:切片、迭代、列表生成式、生成器、迭代器的更多相关文章
- Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
定义函数 def my_abs(x):#求绝对值的my_abs函数 if x >= 0: return x else: return –x def nop():#空函数 pass#占位符 参数检 ...
- python高级特性:切片/迭代/列表生成式/生成器
廖雪峰老师的教程上学来的,地址:python高级特性 下面以几个具体示例演示用法: 一.切片 1.1 利用切片实现trim def trim(s): while s[:1] == " &qu ...
- Python笔记(九)_切片、列表生成式
切片 mylist[:3] 取前3位元素,0可省略不写 mylist[-4:] 取后4位元素,0可省略不写 mylist[2:4] 从第2个开始取,取到第4个,但第4个不取,取的元素值为4-2=2 m ...
- python学习笔记-(八)装饰器、生成器&迭代器
本节课程内容概览: 1.装饰器 2.列表生成式&迭代器&生成器 3.json&pickle数据序列化 1. 装饰器 1.1 定义: 本质上是个函数,功能是装饰其他函数—就是为其 ...
- 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基础笔记系列三:list列表
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! python中的list列表是一种序列型数据类型,一有序数据集合用逗号间隔 ...
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...
- Python 高级特性介绍 - 迭代的99种姿势 与协程
Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...
随机推荐
- 「AT2021」キャンディーとN人の子供 / Children and Candies
前言 今天练习赛出了这道题,由于我太菜没有在考场上做出来. 翻了题解后,感觉题解讲的并不是十分直观,所以自己写一篇. 题目大意 太长了,不讲了. 数据范围: \(1\leq N\leq 400\) \ ...
- UniGUI之Login窗口(10)
在UniGUI的CHM帮助里读到的. 一定要新建一个其他空白的工程,然后再添加LoginForm LoginForm 是另一种特殊的表单类型, 仅用于登录目的. 此操作将创建一个与常规窗体外观相同的空 ...
- 记一个 protobuf 的 jar 包冲突
尝试使用 spark 以 bulkload 的方式写 HBase 时,遇到一个问题,错误堆栈如下 19/02/02 09:00:43 ERROR Utils: Aborting task java.l ...
- synchronized和volatile关键字
synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synch ...
- 第1节 kafka消息队列:10、flume与kafka的整合使用
11.flume与kafka的整合 实现flume监控某个目录下面的所有文件,然后将文件收集发送到kafka消息系统中 第一步:flume下载地址 http://archive.cloudera.co ...
- js正则 - 限制用户名只能中文、字母和数字 , 不能包含特殊字符
/^[\u4E00-\u9FA5A-Za-z0-9]+$/
- Referenced file contains errors
Referenced file contains errors (file:/D:/TONG/tong/eclipse/config_/xsd/spring-context-4.2.xsd). For ...
- 【随缘更(gu)】牛客D4简要思路(没有题解)
T1 当然不能枚举每个区间,于是我们考虑算贡献. 对于每个位置i,我们计算其作为区间内第一个出现ai的位置的区间总数,则有ans=sigma( i - last[i] ) * ( n - i + 1 ...
- @vue-cli的安装及vue项目创建
1.安装 Node.js & Vue CLI @vue/cli3,是vue-进行搭建的脚手架项目,它本质上是一个全局安装的 npm 包,通过安装它,可以为终端提供 vue 命令,进行vue项目 ...
- 二、Linux目录结构&常用指令
Linux目录结构: ps -ef:任务管理器 ifconfig: 查看ip ping : 测试与目标主机的连通性,ctrl+c停止 目录指令: ll:列出当前目录下的文件信息 ls -al : 列 ...