python3入门笔记三之高级特性---切片,迭代,列表生成式,生成器,迭代器

简介: 切片 (取指定索引范围 )格式:arr[开始索引:结束索引:Step] 开始索引 默认0,可不写; 结束索引默认为数组的长度, 获取的范围为 开始索引-结束索引 之间, 不包括结束索引; Step默认为1。

切片 (取指定索引范围 )


格式:arr[开始索引:结束索引:Step] 开始索引 默认0,可不写; 结束索引默认为数组的长度, 获取的范围为 开始索引-结束索引 之间, 不包括结束索引; Step默认为1。


L = ['0', '1', '2', '3', '4']
print( L[0:3]) # ['0', '1', '2'] 获取从索引0开始,到索引3之间的,不包括索引3的数
print( L[-2:-1]) # ['3'] 从倒数第二个开始到倒数第一个之间
print( L[::2]) # 步长step为2时结果 ['0', '2', '4'] 
复制代码


前10个数: L[:10]后10个数: L[-10:]10-20之间: L[10:20]


tuple也是一种list,唯一区别是tuple不可变。因此,tuple也可以用切片操作,只是操作的结果仍是tuple:print( (0, 1, 2, 3, 4, 5)[:3]) # (0, 1, 2)字符串'xxx'也可以看成是一种list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:print( 'HelloWorld!'[:3]) # Hel

利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:


def myTrim(s):
    while(s[:1] == ' '):
        s = s[1:]
    while(s[-1:] == ' '):
        s = s[:-1]
    return s
print(myTrim(' aa '))
复制代码


迭代 (Iterable)


Python中,迭代是通过for ... in来完成的 使用for循环时,只要作用于一个可迭代对象,for循环就可以正常运行


dict ,list ,tuple,string  都可以遍历


  1. demo-dict :


默认情况下,dict迭代的是key。 如果要迭代value,可以用for value in d.values(), 如果要同时迭代key和value,可以用for k, v in d.items()


#dict 字典的存储不是按照list的方式顺序排列,所以迭代出的结果顺序很可能不一样。
d = {'a': 1, 'aa': 2, 'c': 3}
for key in d:
    print(key)
for value in d.values():
    print(value)
for key,value in d.items():
    print(key,value)
复制代码


  1. demo-string: 在es6中这个也可以直接遍历,可以参考博主的这篇文章《es6入门提升总结一之字符串的遍历器接口》 es6写法:for (let codePoint of 'foo') {}


for ch in 'HelloWorld':
    print(ch)
复制代码


  1. demo-list:


如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断:


from collections import Iterable
print(isinstance({'a':1,'b':2},Iterable)) # dict    True
print(isinstance('hello world',Iterable)) # str     True
print(isinstance([1,2,3,4,5],Iterable))   # list    True
print(isinstance((1,2,3,4,5,6),Iterable)) # tuple   True
print(isinstance(111,Iterable))           # num     False
复制代码


如果要对list实现类似Java那样的下标循环怎么办?Python内置的 enumerate (枚举)函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:


for i, value in enumerate(['A', 'B', 'C']):
    print(i, value)
# 结果:
    0 A
    1 B
    2 C     
复制代码


  1. demo-tuple:


for (x) in ([1,2],[3,4],[5,6]):
    print(x)
# 结果:
[1, 2]
[3, 4]
[5, 6]
# 获取tuple中list的值
for (x,y) in ([1,2],[3,4],[5,6]):
    print(x,y)
# 结果:     
1 2
3 4
5 6   
复制代码


列表生成式 (List Comprehensions)


列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(1, 11))


  1. 生成[1x1, 2x2, 3x3, ..., 10x10]格式


print([x*x for x in range(1,11)])
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
复制代码


  1. for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:


在一个列表生成式中,for前面的if ... else是表达式,而for后面的if是过滤条件,不能带else


print([x*x for x in range(1,11) if x%2==0])
# [4, 16, 36, 64, 100]
print([x if x % 2 == 0 else -x for x in range(1, 11)])
# [-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
复制代码


  1. 还可以使用两层循环,可以生成全排列:


print([m+n for m in 'abc' for n in 'xyz'])
# ['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']
复制代码


  1. 列出当前目录下的所有文件和目录名,可以通过一行代码实现


import os
print([d for d in os.listdir('.')])
# ['hello-world', 'notebook.ipynb', 'python入门笔记2和3.ipynb']
复制代码


生成器 (generator)


这个看着也有点眼熟, 哈哈 原来在es6中也有这个generator


在Python中,这种一边循环一边计算的机制,称为生成器:generator。


有了生成器,我们可以在需要的时候才去创建这个元素出来,可以节省内存的使用 定义 generator 的一种方法:将一个列表生成式的 [] 改成 ()


网络异常,图片无法展示
|


g = (x **2 for x in range(10))
print(next(g)) # 0
print(next(g)) # 1
print(next(g)) # 4
print(next(g)) # 9
# 直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。
复制代码


正确的方法是使用for循环,因为generator也是可迭代对象:


g = (x **2 for x in range(10))
for n in g:
    print(n)
复制代码


定义generator的另一种方法,如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:


网络异常,图片无法展示
|


最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。


# 斐波拉契数列
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
for a in fib(6):
    print(a)  # 1 1 2 3 5 8
复制代码


注意:    a, b = b, a + b      等于     t = (b, a + b) # t是一个tuple     a = t[0]     b = t[1]    for循环,拿不到这个return 的 'done',如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中:


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)
while True:
    try:
        x=next(f)
        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
复制代码


迭代器 (Iterator)


看到这个迭代器,就想到在java中,只能通过这个iterator在遍历中删除这个元素,而不能在普通的for循环中去删除这个集合的元素 😄


可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator


from collections import Iterator 
print(isinstance((x for x in range(10)),Iterator)) # True
print(isinstance([],Iterator)) # False
print(isinstance((),Iterator)) # False
print(isinstance('a',Iterator)) # False
复制代码


直接作用于for循环的数据类型有以下几种: 一类是集合数据类型,如list、tuple、dict、set、str等; 一类是generator,包括生成器和带yield的generator function。 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable


上面迭代中的3.demo-list有说到如何判断一个对象是可迭代对象


Iterable 可以通过 iter() 函数转变成 Iterator


from collections import Iterator
a=[1,2,3,4,5]
b=iter(a)
print(isinstance(b, Iterator))
print(next(b)) # 1
复制代码


Iterator对象表示的是一个数据流 Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。


网络异常,图片无法展示
|



目录
相关文章
|
16天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
2天前
|
C语言 Python
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
本文介绍了Python的关键字列表及其使用规则。通过回顾`hello world`示例,解释了Python中的标识符命名规则,并探讨了关键字如`if`、`for`、`in`等不能作为变量名的原因。最后,通过`import keyword`和`print(keyword.kwlist)`展示了Python的所有关键字,并总结了关键字不能用作标识符的规则。
21 9
|
10天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
23 14
|
12天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
29 10
|
17天前
|
测试技术 开发者 Python
探索Python中的装饰器:从入门到实践
装饰器,在Python中是一块强大的语法糖,它允许我们在不修改原函数代码的情况下增加额外的功能。本文将通过简单易懂的语言和实例,带你一步步了解装饰器的基本概念、使用方法以及如何自定义装饰器。我们还将探讨装饰器在实战中的应用,让你能够在实际编程中灵活运用这一技术。
36 7
|
7月前
|
人工智能 Java Python
python入门(二)安装第三方包
python入门(二)安装第三方包
104 1
|
2月前
|
机器学习/深度学习 Python
【10月更文挑战第5天】「Mac上学Python 6」入门篇6 - 安装与使用Anaconda
本篇将详细介绍如何在Mac系统上安装和配置Anaconda,如何创建虚拟环境,并学习如何使用 `pip` 和 `conda` 管理Python包,直到成功运行第一个Python程序。通过本篇,您将学会如何高效地使用Anaconda创建和管理虚拟环境,并使用Python开发。
78 4
【10月更文挑战第5天】「Mac上学Python 6」入门篇6 - 安装与使用Anaconda
|
2月前
|
IDE 开发工具 iOS开发
【10月更文挑战第3天】「Mac上学Python 3」入门篇3 - 安装Python与开发环境配置
本篇将详细介绍如何在Mac系统上安装Python,并配置Python开发环境。内容涵盖Python的安装、pip包管理工具的配置与国内镜像源替换、安装与配置PyCharm开发工具,以及通过PyCharm编写并运行第一个Python程序。通过本篇的学习,用户将完成Python开发环境的搭建,为后续的Python编程工作打下基础。
216 2
【10月更文挑战第3天】「Mac上学Python 3」入门篇3 - 安装Python与开发环境配置
|
2月前
|
iOS开发 MacOS Python
【10月更文挑战第1天】「Mac上学Python 1」入门篇1 - 安装Typora与Markdown编辑技巧
本篇将详细介绍如何在Mac系统上安装Typora这款简洁高效的Markdown编辑器,并学习Markdown常用语法。通过本篇,用户能够准备好记录学习笔记的工具,并掌握基本的文档编辑与排版技巧,为后续学习提供便利。
163 1
【10月更文挑战第1天】「Mac上学Python 1」入门篇1 - 安装Typora与Markdown编辑技巧
|
7月前
|
Java Python 开发者
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】
线程池详解与异步任务编排使用案例-xian-cheng-chi-xiang-jie-yu-yi-bu-ren-wu-bian-pai-shi-yong-an-li
512 3
Python 学习之路 01基础入门---【Python安装,Python程序基本组成】
下一篇
DataWorks