1.推导表达式
列表推导
构建一个元素1-10的列表
1)循环添加
li=[]
for i in range(11):
li.append(i)
2)列表推导
li=[i for i in range(1, 11)]
构造形式:
列表推导+条件判断:
li=[i for i in range(1, 11) if i%2==0]
列表推导+三目运算
li=[i if i%2==0 else 0 for i in range(1, 11)]
集合和字典推导
集合推导
set = {i for i in range(1, 11)}
字典推导
dic = {i:j for i,j in enumerate(li)}(还记得枚举类型吗)
2.迭代器和生成器
从可迭代对象中依次取出元素
迭代
1)for 迭代变量 in 可迭代对象(每次循环都会使迭代变量指向下一个元素)
2)while循环
例:
the_list = [5, 4, 1, 3, 2] i=0
for i in the_list: while i<len(the_list)
print(the_list[i]) print(the_list[i])
i+=1
迭代器
对可迭代对象元素的遍历
1)生成迭代器
- iterator = iter(可迭代变量名) ->函数方法
- iterator = li.__iter__ ->魔术方法
2)迭代器对象本身需要支持以下两种方法,一起构成迭代器协议
iterator.__iter__
iterator.__next__
3)取值
next(iterator)
iterator.__next__()
注意:迭代器值取完后,会返回StopIteration错误
从可迭代对象生成一个迭代器
迭代器 = iter(可迭代对象)
下个值 = next(迭代器)
例:
the_list=[i for i in range(1,11)]
it = iter(the_list)
while True:
print(next(it))
生成器
特殊的迭代器,不需要__iter__()
和__next__()
方法,只需要一个yiled
关键字
例:
def fib(): #斐波那契数列
prv, cur = 1, 1
i = 0
while True:
yield cur
prv, cur = cur, prv + cur
a = fib()
it = iter(a)
i=0
while i<10:
print(next(i))
生成器无return,返回结果自动生成迭代器。实例化石时函数体的代码不会运行,在yield处 暂停,只有当调用nenxt()方法时才会激活下方代码,返回yield后的变量
yield 运行规则
1)返回这个对象
2)暂停这个函数
3)等待下次next重新激活
注意:
1)yield 表达式只能在函数中使用,在函数体中使用
2)yield 表达式可以使函数成为一个生成器
3)yield 可以返回表达式结果,并且暂定函数执行,直到next激活下一个yield
3.模块
前边已经略微用到过模块的方法,即import + 模块名称来导入模块。另外,每一个py文件也可以看作一个模块,即在一个文件中调用另一个文件。
导入方法:
- import 模块
- from 模块 import 子模块 as 重命名(from datetime import datetime( as the_time) )
注:1)在python3中导入后,会在当前路径下生成一个 __pycache__ 文件夹
2)相同目录下文件的导入可用以上两种方法,不同目录下,需要使用sys.path添加路径
sys.path.append('path')
如:
– project
|– 1
| |– 2
| | |– 3
| | | |– a.py
|– A
| |– test.py
| |– B
| | |– C
| | | |–-c.py
import sys
sys.path.append('../../../1/2/3')
from a import A
4.包和包管理
1)包概念:把很多模块放到一个文件夹里面,就可以形成一个包
2)包管理:当把很多模块放在文件中时,为了方便引用包中的模块,引入了包管理
3)__init__.py:在包管理中,加入此模块,则包名可以直接通过属性访问的方式,访问此模块的对象,此模块不 加上可能不会报错,但是规范是要加上,文件内容可以为空
导入规则:
- from 包名 import 模块名 (as 重命名)
- from 包名.模块名 import 函数名 (as 重命名)
- from 包名 import * (导入包中的全部模块)