龙空技术网

Python学习之高级特性,看了都说好

程序员小乐 23

前言:

现在小伙伴们对“python 36新特性”大约比较着重,兄弟们都想要分析一些“python 36新特性”的相关内容。那么小编也在网上搜集了一些对于“python 36新特性””的相关文章,希望姐妹们能喜欢,小伙伴们快快来学习一下吧!

点击上方 "程序员小乐"关注公众号, 星标或置顶一起成长

第一时间与你相约

每日英文

Destiny decides who enters your life, but you get to decide who stays.

谁走进你的生命,是由命运决定;谁停留在你生命中,却是由你自己决定。

每日掏心话

人终将会变老,事物也随之变更,很多时候,一个人发现自己爱上了一个人,都是在跟他分别的时候。

来自:stone_zhu | 责编:乐乐

链接:jianshu.com/p/37245bddde90

程序员小乐(ID:study_tech)第 673 次推文 图片来自网络

往日回顾:最近频频被点名的“区块链”,到底是个啥?

正文

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

L = []

n = 1

while n <= 99:

L.append(n)

n = n + 2

取list的前一半的元素,也可以通过循环实现。

但是在Python中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好。基于这一思想,我们来介绍Python中非常有用的高级特性,1行代码能实现的功能,决不写5行代码。请始终牢记,代码越少,开发效率越高。

切片(Slice)

L = list(range(100))

L[:10]

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

(0, 1, 2, 3, 4, 5)[:3]

>>> (0, 1, 2)

'ABCDEFG'[:3]

>>> 'ABC'

在很多编程语言中,针对字符串提供了很多各种截取函数(例如,substring),其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。

迭代

1.通过collections模块的Iterable类型判断对象是否为可迭代对象

from collections import Iterable

isinstance('abc', Iterable) # str是否可迭代

>>> True

2.Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身

for i, value in enumerate(['A', 'B', 'C']):

print(i, value)

>>>

0 A

1 B

2 C

列表生成

1.list(range(1, 11))

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

L = []

for x in range(1, 11):

L.append(x * x)

3.列表生成式(list comprehensions)可以用一行语句代替循环生成上面的list

[x * x for x in range(1, 11)]

生成器(generator)

generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误;

同样也可以使用for循环遍历

1.把一个列表生成式的[]改成()

g = (x * x for x in range(10))

for n in g:

print(n)

>>>

1

4

9

16

25

36

49

64

81

2.函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator

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

把函数改成generator后,我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代

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)

迭代器

可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象。

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。可以使用isinstance()判断一个对象是否是Iterator对象。

集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

python的for循环本质上就是通过不断调用next()函数实现的。

for x in [1, 2, 3, 4, 5]:

pass

完全等同于:

# 首先获得Iterator对象:

it = iter([1, 2, 3, 4, 5])

# 循环:

while True:

try:

# 获得下一个值:

x = next(it)

except StopIteration:

# 遇到StopIteration就退出循环

break

小结:Python的Iterator对象表示的是一个数据流,这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入程序员小乐技术群,在公众号后台回复“加群”或者“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

Spring、Spring MVC、MyBatis 整合文件配置详解,看了都说好!

初级开发者应该从Spring源码中学什么?

Java RESTful 框架的性能比较

关注微信公众号「程序员小乐」,收看更多精彩内容

嘿,你在看吗?

标签: #python 36新特性