可迭代对象
- 我们已经知道可以对list 、tuple、dict 、set 、str 、等类型的数据使用,for in 的循环语法从其中依次拿到数据进行使用,我们把这样子的过程称为遍历或者迭代。
- 把可以通过for in 这类的语句迭代读取一条数据供我们使用的可迭代对象称之为可迭代对象(lterable)
推导式
- 推导式分为:列表推导式,字典推导式,集合推导式等。在这里我们主要说其中一种也是用的最多的列表推导式。
- 列表推导式是python构建列表(list)的一种快捷方式,可以使用简介的代码就创建出一个列表简单理解就是由一个旧列表构建出一个新的列表。
语法
1. [表达式 for 变量 in 旧列表 ]
2. [表达式 for 变量 in 旧列表 if 条件 ]
如下列,找出长度大于2的名字
list1=['李小强','林红','张平平','黄大步','陈冲']
list2=[i for i in list1 if len(i)>2]
print(list2)
运行结果:
['李小强', '张平平', '黄大步']
生成器
背景
- 通过列表推导式我们可以直接创建出一个列表,但是受到内存限制,我们不可能创造出一个无限大的列表。而且创建一个200万个元素的列表,会占用很大的内存空间,而且这个时候我们仅仅需要访问列表中的几个元素,那么后面的元素占用空间就是一种浪费行为。那么我们可不可以用几个元素就创建出几个元素。这样在一定的程度上就优化了内存。那么在python中有一种一边循环一边计算的机制就是生成器。
创建生成器的方式
通过列表推导式的方式
1. g = (x * 3 for x in range(10))
通过函数的方式
1. def fu():
2. n = 0
3. while True:
4. n += 1
5. yield n
只要在函数中出现yield关键字他就是一个生成器函数。
迭代器
关系图对应图
迭代器
- 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从集合的第一个元素访问直到所有元素被访问完结束。
- 可以被next()函数调用并不断返回下一个值的对象称为迭代器lterator
- 生成器是可迭代的,也是迭代器。
- 列表是可迭代的,但不是迭代器。
- 通过iter()函数可以将可迭代的变成一个迭代器。
PEP8规范编写代码
PEP8:python代码风格指南
PEP8 提供了python的编写约定,本节知识点旨在提高代码的可读性,并使其在各种python代码中编写风格保持一致。
-
缩进使用4个空格,空格是首选的缩进方式,python3中不允许使用混合的制表符和空格来缩进。
-
每一行最大长度限制在79个字符以内。
-
顶层函数,类的定义,前后使用2个空格隔开。
-
import 导入
导入建议在不同的行,例如:
1. import os 2. import sys
不建议如下导包:
1. import os, sys
但是可以如下:
1. from subprocess import popen, PIPE
-
导包位于文件顶部,在模块注释、文案字符串之后,全局变量、常量之前,导入按照以下顺序分组:
– 标准库导入
– 相关第三方导入
– 本地应用/库导入
– 在每一组导入之间加入空行 -
python 中定义字符串使用双引号、单引号是相同的,尽量保持同一种方式定义字符串,当一个字符串包含单引号或者双引号时,在最外层使用不同的符号来避免使用反斜杠转义,从而提高可读性。
-
表达式和语句空格:
– 避免在小括号、方括号、花括号后跟空格。
– 避免逗号、分号、冒号之前的空格。
– 冒号在切片中就像二元运算符,两边要有数量相同的空格,如果某个切片参数省略,空格也省略。
– 避免为了和另外一个语句对齐,在赋值运算符附加多个空格。
– 避免表达式在尾部添加空格,因为尾部空格通常看不见,会产生混乱。
– 总是在二元运算符两边加一个空格,赋值 (=),增量赋值(+=,-=),比较(==,<,>,!=,<>,<=,>=,in,not,in,is,is not) ,布尔 (and,or,not)
– 避免将小的代码块和 if/for/while 放在同一行,要避免代码行太长。
1. if foo == 'blah' : do_blah_thing()
2. for x in lst: total += x
3. while t < 10: t = delay()
- 永远不要使用字母‘l’(小写的L),‘O’(大写的O),或者‘I’(大写的I)作为单字符变量名,在有些字体里,这些字符无法和数字0和1区分,如果想用‘I’,用‘L’代替。
- 类名一般使用首字符大写的约定。
- 函数名应该小写,如果想提高可读性可以用下划线分隔。
- 如果函数的参数名和已有的关键字冲突,在最后加单一下划线比缩写或随意拼写更好。因此 class_比clss更好。(也许最好使用同义词来避免这种冲突)。
- 方法名和实例变量使用下划线分割的小写单词,以提高可读性。
练习
- 请使用装饰器实现已存在的函数的执行所花费的时间
- time模块
import time
def fun_out(fn):
def fun_inner():
print('程序开始运行')
fn()
print('程序运行结束')
print(fn())
return fun_inner
def fun():
start = time.time()
n = 0
i = 1
while n < 10000000:
i = i+n
n += 1
end = time.time()
res = end-start
return '运序运行的时间为%s秒' % res
f = fun_out(fun)
f()