python高级特性:切片/迭代/列表生成式/生成器
廖雪峰老师的教程上学来的,地址:python高级特性
下面以几个具体示例演示用法:
一、切片
1.1 利用切片实现trim
def trim(s):
while s[:1] == " " or s[-1:] == " ": # 若第1个元素或最后1个元素为空格
if s[:1] == " ":
s = s[1:]
if s[-1:] == " ":
s = s[:-1]
return s
注:字符串可以看做一个list,列表切片的完整写法是 L[start:end],其中end也支持负数,最后一个数用-1表示,第1个数用0表示,如果省略start,表示从0开始,如果省略end,表示到最后1个元素结束。
测试代码:
if trim('hello ') != 'hello':
print('测试失败1!')
elif trim(' hello') != 'hello':
print('测试失败2!')
elif trim(' hello ') != 'hello':
print('测试失败3!')
elif trim(' hello world ') != 'hello world':
print('测试失败4!')
elif trim('') != '':
print('测试失败5!')
elif trim(' ') != '':
print('测试失败6!')
else:
print('测试成功!')
1.2 切片还有第3个参数,即:L[start:end:skip],比如在1-10之间,把奇数、偶数选出来
list_1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] odd = list_1[::2]
even = list_1[1::2] print(odd)
print(even)
输出:
[1, 3, 5, 7, 9]
[2, 4, 6, 8, 10]
二、迭代
list_1 = list(range(1, 11)) print("正向迭代:")
for x in list_1:
print(x) print("\n反向迭代:")
for x in reversed(list_1):
print(x) print('\n带索引的迭代:')
for m in enumerate(list_1):
print("list_1[", m[0], "]=", m[1]) dic_1 = {"name": "菩提树下的杨过", "blog": "http://yjmyzz.cnblogs.com/"} # 字典的迭代
print("\ndict字典迭代1:")
for k in dic_1:
print("key:", k, ",value:", dic_1[k]) print("\ndict字典迭代2:")
for v in dic_1.values():
print("value:", v) print('\ndict字典迭代3:')
for k, v in dic_1.items():
print("key:", k, ",value:", v)
输出:
正向迭代:
1
2
3
4
5
6
7
8
9
10 反向迭代:
10
9
8
7
6
5
4
3
2
1 带索引的迭代:
list_1[ 0 ]= 1
list_1[ 1 ]= 2
list_1[ 2 ]= 3
list_1[ 3 ]= 4
list_1[ 4 ]= 5
list_1[ 5 ]= 6
list_1[ 6 ]= 7
list_1[ 7 ]= 8
list_1[ 8 ]= 9
list_1[ 9 ]= 10 dict字典迭代1:
key: name ,value: 菩提树下的杨过
key: blog ,value: http://yjmyzz.cnblogs.com/ dict字典迭代2:
value: 菩提树下的杨过
value: http://yjmyzz.cnblogs.com/ dict字典迭代3:
key: name ,value: 菩提树下的杨过
key: blog ,value: http://yjmyzz.cnblogs.com/
三、列表生成器
这个老厉害了!比如:要找出1~100内所有奇数的平方数(即:1,3,5... 这些数的平方数)
a = [x ** 2 for x in range(1, 101) if x % 2 == 1 and x ** 2 <= 100]
print(a)
输出:[1, 9, 25, 49, 81]
再比如,打印出当前目录下的所有文件(不考虑递归子目录)
import os print([f for f in os.listdir(".")])
小结:写法就是 [... for ... in .. if ...] ,要生成的list项写在for前面,如果迭代时需要指定条件,写在最后的if中。
四、生成器(generator)
这是python引入的一个新概念,想想刚才学到的列表生成器:
result1 = [x ** 2 for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]
print(type(result1), result1)
输出:
<class 'list'> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
不知道大家想过没有:如果for前面的运算比较复杂(比如:求平方根),而for迭代的列表又很大(比如:1千万个),最终列表生成器肯定运行很慢,会严重影响性能。能不能做到『延时』计算?等到真正要用的时候,再按需计算。这就是生成器(generator)要解决的问题,它与[列表生成器]的区别在于,它只保存计算逻辑(即: 保存算法),并不马上计算结果,真正要用的时候,调用next(g)取出下一个计算结果即可,当然,它也支持迭代。
generator1 = (x ** 2 for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(type(generator1), generator1) # 取出第1个值
print(next(generator1))
# 取出第2个值
print(next(generator1)) # 打印剩余的值
for x in generator1:
print(x)
输出:
<class 'generator'> <generator object <genexpr> at 0x1087e7f10>
1
4
9
16
25
36
49
64
81
100
从输出类型上看,它的类型是generator,而非list。单纯从语法上看,只要把"列表生成器"的[],换成()即可。
再来一个复杂点的示例,中学我们都学过"杨辉三角",如果用常规思路,打印出杨辉三角,可以参考下面的代码:
import copy def triangles(limit):
first, second = [1], [1, 1]
print(first)
if limit > 1:
print(second)
if limit == 2:
return
x = copy.copy(second)
while True:
y = copy.copy(first)
[y.append(x[i] + x[i + 1]) for i in range(len(x) - 1)]
y.append(1)
print(y)
x = copy.copy(y)
if len(y) >= limit:
return triangles(10)
输出:
[1]
[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]
[1, 6, 15, 20, 15, 6, 1]
[1, 7, 21, 35, 35, 21, 7, 1]
[1, 8, 28, 56, 70, 56, 28, 8, 1]
[1, 9, 36, 84, 126, 126, 84, 36, 9, 1]
如果,要改写成生成器(generator),该怎么做呢?答案:只要把print(...)的地方,改成yield 即可。
def triangles_generator(limit):
first, second = [1], [1, 1]
yield first
if limit > 1:
yield second
if limit == 2:
return
x = copy.copy(second)
while True:
y = copy.copy(first)
[y.append(x[i] + x[i + 1]) for i in range(len(x) - 1)]
y.append(1)
yield y
x = copy.copy(y)
if len(y) >= limit:
return g = triangles_generator(10)
# 取出前2个
print(next(g))
print(next(g))
# 剩下的用迭代写法输出
for x in g:
print(x)
输出与刚才相同,就不重复贴了。关于这个yield,如果还没理解的,可以对比看下面的示例:
def test1():
return [1, 2, 3] def test2():
print("test2=>1")
yield 1
print("test2=>2")
yield 2
print("test2=>3")
yield 3 print(test1())
g = test2()
print(next(g))
print(next(g))
print(next(g))
输出:
[1, 2, 3]
test2=>1
1
test2=>2
2
test2=>3
3
test2()遇到yield后,会停下来,保存现场,等待下一次调用next()时,才会继续执行。
python高级特性:切片/迭代/列表生成式/生成器的更多相关文章
- Python学习 Day 4 函数 切片 迭代 列表生成式 生成器
定义函数 def my_abs(x):#求绝对值的my_abs函数 if x >= 0: return x else: return –x def nop():#空函数 pass#占位符 参数检 ...
- Python 高级特性介绍 - 迭代的99种姿势 与协程
Python 高级特性介绍 - 迭代的99种姿势 与协程 引言 写这个笔记记录一下一点点收获 测试环境版本: Python 3.7.4 (default, Sep 28 2019, 16:39:19) ...
- python协程函数应用 列表生成式 生成器表达式
协程函数应用 列表生成式 生成器表达式 一.知识点整理: 1.可迭代的:对象下有_iter_方法的都是可迭代的对象 迭代器:对象._iter_()得到的结果就是迭代器 迭代器的特性: 迭代器._n ...
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
掌握了Python的数据类型.语句和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n = 1 while n ...
- python 基础 切片 迭代 列表生成式
对list 进行切片 如列表 L = ['Adam', 'Lisa', 'Bart', 'Paul'] L[0:3] ['Adam', 'Lisa', 'Bart'] L[0:3]表示,从索引0开始取 ...
- 【转】Python高级特性——切片(Slice)
摘录廖雪峰网站 定义一个list: 1 L = ['haha','xixi','hehe','heihei','gaga'] 取其前三个元素: >>> L[0],L[1],L[2] ...
- Python高级特性——切片(Slice)
摘录廖雪峰网站 定义一个list: L = ['haha','xixi','hehe','heihei','gaga'] 取其前三个元素: >>> L[0],L[1],L[2] (' ...
- Python高级特性:迭代
迭代的目的是实现遍历出一个可迭代对象的元素,即for循环 基本语法 : for ... in ... 首先只有可迭代对象才可以迭代,判断一个对象是不是可以迭代的方法如下: >>> f ...
- Day7 python高级特性-- 切片 Slice
先举一个例子,取list或tuple中的某几个元素: 1.取 ['a','b','c','d','e','f'] 第1.2.5.6个元素: >>> a = [' ...
随机推荐
- 转载:Linux操作系统(1.3.1)《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19611.html 1.3 准备工作 由于Linux具有免费.使用广泛.商业支持越来越完善等特点,本书将主要针对Linux上运行的Ng ...
- 轻松读懂MSIL
原文:http://www.cnblogs.com/brookshi/p/5225801.html
- Python-GIL 进程池 线程池
5.GIL vs 互斥锁(*****) 1.什么是GIL(Global Interpreter Lock) GIL是全局解释器锁,是加到解释器身上的,保护的就是解释器级别的数据 (比如垃圾回收的数据) ...
- window.open子窗口获取父窗口的值
//子窗口获取父窗口id的值 window.opener.document.getElementById("id").value; //子窗口调用父窗口的函数 window.ope ...
- 并发之atomicInteger与CAS机制
并发之atomic与CAS自旋锁 通过前几章的讲解我们知道i++这种类似操作是不安全的.针对这种情况,我们可能会想到利用synchronize关键字实现线程同步,保证++操作的原子性,的确这是一种有效 ...
- linux 创建用户和密码
:useradd -m 用户名//添加用户 :passwd 用户名 //然后设置密码 :userdel -r newuser1 //删除用户 newuser1,同时删除其自家目录 samba 设置账号 ...
- 性能测试三十二:监控之Java线程监控
线程的五种状态 * 新建:new * 运行:runnable * 等待:waitting(无限期等待),timed waitting(限期等待) * 阻塞:blocked * 结束:terminate ...
- Ext.js入门:TabPanel组件(八)
一:TabPanel组件简介 二:简单代码示例 三:使用iframe作为tab的标签页内容 四:动态添加tabpanel的标签页 五:为tabpanel标签页添加右键菜单 方式一: <html ...
- Xshell不能使用退格、删除键进行删除的解决方法
xshell在输入命令时,如果敲错字母了的时候,想通过按退格键删除敲错的字母,却在屏幕显示出了“^H”,退格不行,再按删除键,却显示出“^[[3~”,怎么着就是删除不了输错的字母. 修改办法:文件-- ...
- [OpenCV-Python] OpenCV 中的 Gui特性 部分 II
部分 IIOpenCV 中的 Gui 特性 OpenCV-Python 中文教程(搬运)目录 4 图片 目标 • 在这里你将学会怎样读入一幅图像,怎样显示一幅图像,以及如何保存一幅图像 • 你将要学习 ...