推导表达式
- 推导表达式相对于for循环来处理数据,要更加的方便
- 列表推导表达式使用更加的广泛
列表推导
- 循环添加:
li = [ ]
for i in range(1,11): #左闭右开
li.append(i) #[1,2,3,4,5,6,7,8,9,10] - 列表推导:
li = [i for i in range(1,11)]- 列表推导+条件判断
l2 = [i for i in range(1,11) if i % 2 == 0] #[2,4,6,8,10] - 列表推导+三目运算
l3 = [i if i % 2 == 0 else 0 for i in range(1,11)] #[0, 2, 0, 4, 0, 6, 0, 8, 0, 10]
- 列表推导+条件判断
集合和字典推导
- 集合推导
{i for i in range(1,10)} - 字典推导
{i:j for i,j in enumerate(li)}
迭代器和生成器
迭代器
- 生成迭代器:
iterator = iter(li)
或者:
iterator = li.iter() - 迭代器对象本身需要支持以下两种方法(必须要有的,它们使迭代器能够进行循环遍历),他们一起构成迭代器协议:
iterator.iter()
iterator.next() - 取值:
next(iterator)
iterator.next()
小例:
i = iter([1,2,3])
for j in range(3):
print(next(i)) #1
2
3
注意:如果迭代器值取完之后,会返回StopIteration错误
自定义迭代器
class TupleIter:
def __init__(self,li):
self.li = li
self._index = 0
def __iter__(self):
return self #固定写法
def __next__(self):
if self._index < len(self.li):
index = self.li[self._index]
self._index += 1
return index
else:
raise StopIteration
t = TupleIter((1,2,3,4))
for i in t:
print(i) #1
2
3
4
生成器
- 生成器也可以看作迭代器
- 函数中只要有yield关键字就是一个生成器对象
- 生成器对象可以被遍历
- 生成器一般使用到大数据批量获取
- 作用:节省资源
def func(n):
i = 0
while i < n:
yield i
i += 1
- yield表达式只能在函数中使用,在函数体中使用yield表达式可以使函数成为一个生成器
- 生成器可以被迭代,也就是可以被循环遍历
- yield可以表达式结果,并且暂定函数执行
- yield类似于return,但yield不会结束函数,是暂时挂起返回值
斐波拉契数列
def fab_yield(end):
n,a,b = 0,0,1
while n < end:
yield b
a,b = b,a + b
n = n + 1
-
通过迭代器去生成斐波拉契数列或者获取列表中大量数据要比直接得到(比如for)更加节省内存,是一个一个迭代出来,而不是一起全部取出,效率也高
i = 0 def func(): global i i += 1 yield i print("hh") f = func() #没有下面时,什么都不会打印,在这里挂起 for j in f: print(j) #1 hh
模块
- 模块:
在Python中,模块就是一个py文件,可以使用下面两种方法导入- import datetime #模块名
使用时:datetime.datetime() #模块名.函数名() - from datetime import datetime(as this_datetime)
注意:datetime是一个常用的时间处理模块
- import datetime #模块名
- 在同一目录下,可直接使用上面两种方法去导入
- 在不同目录下,需要使用sys.path添加路径
- sys.path.append(‘path’)
- 在Python3中导入后,会在当前路径下生成一个__pycache__文件夹
sys模块
- sys模块提供了与Python解释器交互的函数,在Python中它是始终可以导入使用的
- sys.argv 获取终端命令行输入
- sys.path 解释器模块导入查找路径
if name==‘main’:
- 一个python文件通常有两种使用方法
- 第一是作为脚本直接执行
- 第二是 import 到其他的 python 脚本中被调用(模块重用)执行
- if name == ‘main’: 的作用就是控制这两种情况执行代码的过程,在if name == ‘main’: 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而 import 到其他脚本中是不会被执行的
- name
python会自动的给模块加上这个属性
如果模块是被直接调用的,则__name__的值是__main__,否则就是改模块的模块名 - if name==‘main’
- 自身直接运行的时候成立,其他文件调用的时候不成立
包和包管理
- 包概念:
把很多模块放到一个文件夹里面,就可以形成一个包 - 包管理:
当把很多模块放在文件中时,为了方便引用包中的模块,引入了包管理 - init.py
在包管理中,加入此模块,则包名可以直接通过属性访问的方式,访问此模块内的对象,此模块不加上可能不会报错,但是规范是要加上,文件内容可以为空 - 相对路径导入:
在包管理中,可以通过(一个点)和…(两个点)分别来导入同层和上一层的模块
相对路径导入
- 引用作用:
在包中,如果包中模块要导入同一包中的其他模块,就必须使用此方法导入 - 使用方法:
from.module(…module) import obj (as new_name) - 引入之后的影响
当一个模块中出现此导入方式,则该模块不能被直接运行,只能被导入