一、python中一个py文件就是一个模块(导入模块)
- 可以通过import或者from-import在一个模块中去使用另一个模块的内容
- import 会将模块的内容执行一遍
- import 模块名:将模块中的所有内容都导入,并且可以在当前模块中通过
- 模块名.的方式去使用模块中的所有全局变量
import qf_test
# 使用qf_test内的全局变量,局部变量不能用
qf_test.fun1()
print(qf_test.test_a)
# from 模块名 import 变量1,变量2,变量3
# 也是将所有的内容全部导入,但是只能使用import后面的变量
from qf_test import test_a, fun1
# 使用import后面的变量
print(test_a)
fun1()
from 模块名 import * :将模块中所有的内容都导入,可以直接使用所有全局变量
1. 重命名
- import 模块名 as 模块新名字
import qf_test as tt
tt.fun1()
num = 10
# from 模块名 import 变量名 as 新名字
from qf_test import test_a as test_num
print(num) # 使用当前模块的num变量
print(test_num)
2. 都用as重命名
- from 模块名 import 变量名1 as 新名字1, 变量名2 as 新名字2....
注意:可以给部分命名和不命名 - from 模块名 import 变量名1 as 新名字1, 变量名2 as 新名字2, 变量名3....
3.可以检查被导入的内容之前是否已经被导入过,如果导入过,不会再重复导入
注意:多次导入,但是只执行一次,多次导入的效果可以同时生效
二、阻止导入的方法
语法:if __name__ == '__main__':
# 不希望被别的模块导入执行的代码写在这里
这里面的代码块而言直接执行当前模块时都会被执行,如果被导入别的模块中时,这些代码块不会被执行
import qf_test
print(qf_test.test_a) # 不能用会保持,AttributeError: module 'qf_test' has no attribute 'test_a'
1.每一个模块都有一个name属性,这个属性默认值是当前模块对应的py文件的文件名
当当前模正在被执行的时候,系统会自动将模块的'name'属性变成'main'
py文件命名不能为main
2.模块的使用
将具有相同功能的函数和数据封装到一起
三、迭代器
1.什么是迭代器(iter)
- 迭代器:是Python中一种容器类型的数据类型,属于序列,没有具体的自变量
- 可以将其他的序列转换成迭代器
- 转换语法:iter(序列)
2.迭代器的特点
- a.他只能next函数或者方法按顺序逐个获取迭代器中的元素,获取方式是取出,取出后该元素就不在迭代器中了
注意:只能逐个取
iter1 = iter('abcdef')
print(iter1)
# 方法一:取数据
print(next(iter1))
# StopIteration取完后就会报错
for x in range(5):
print(next(iter1))
# 方法二
# 迭代器.__next__()
iter2 = iter((1, 2, 3))
print(iter2.__next__())
# print(iter2.__next__())
print(list[iter2])
3.遍历迭代器
注意:迭代器没有长度,取完后就不能再取了
for x in iter1:
print(x)
print('====')
四、什么是生成器
1.什么是生成器
- 生成器就是迭代器,但是迭代器不一定是生成器
- 生成式就是生成器的一种特殊形式:(变量 for 变量 in 序列)
- 产生一个生成器,生成器中可以生成的数据是数字0~4(每个元素是数字)
ge1 = (x for x in range(5))
print(ge1)
print(next(ge1))
print(next(ge1))
#
print('=========')
for item in ge1:
print(item)
#
ge2 = (x*2 for x in range(5))
print('=========')
for item in ge2:
print(item)
ge2 = ([x, x*2] for x in 'abc')
print(next(ge2))
print('===========')
ge2 = (x for x in range(5) if x%2)
for item in ge2:
print(item)
2.生成器就是函数体中有yield关键字的函数
-
(函数中只要有yield,那么调用这个函数不再是执行函数体并且获取返回值,而是产生一个生成器)
-
通过next获取生成器的元素的时候,会去执行生成器对应的函数的函数体,执行到yield为止,并且将yield后面的值作为返回值(元素值)。
然后保存当前结束的位置,下次一获取生成器的元素的时候会接着上次结束位置往后执行,执行到yield..... -
生成器可以当成序列来使用
def func1(n):
print('生成器!!')
for x in range(n+1):
print(x)
yield x
print('yeye')
ge3 = func1(3)
print(ge3)
# print('=:',next(ge3)) # 0
# print('=:',next(ge3)) # 1
print(next(ge3)) # 2
print(next(ge3)) # 3
def func3():
num = 0
while True:
yield num
num += 1
ge5 = func3()
print(ge5)
print('==:',next(ge5))
print('==:',next(ge5))
#
# print('========')
for _ in range(5, 100):
print(next(ge5))
print('=======')
print(next(ge5))
注意:生成器生成的数据的规律:奇数就返回他本身,偶数就返回它的2倍
def func2(n):
for x in range(n):
yield x, 2*x, 3*x
# yield 2*x
# yield 3*x
# if x%2:
# yield x
# else:
# yield x*2
g6 = func2(5)
print(next(g6))
print(next(g6))
print(next(g6))
五、文件操作
- 使用文件可以做数据的持久化(本地化):数据库文件,txt、json,plist,二进制文件
1.文件操作主要是读写操作
-
读:取出文件中的数据
-
写: 将数据写到文件中
-
所有文件操作的过程:打开文件 、操作文件、关闭文件
2.打开文件和关闭文件
open(file, mode='r',encoding=None)
说明:
- a.file :文件路径(必须传参),决定需要打开的是哪个文件
- 绝对路径(不推荐使用)
- 相对路径: ./相对路径 (相对路径是相对当前py文件对应的文件夹)
符号 | 解释 |
---|---|
./ | 当前文件夹 |
../ | 当前文件夹的上层文件夹 |
.../ | 当前文件夹的上层文件夹的上层文件夹 |
符号 | 意义 |
---|---|
mode | 文件打开方式(不同的操作对应不同的打开方式) |
'r' | 以只读的形式打开文件, 文本 |
'rb'/'br' | 读操作,读出来的数据是二进制形式的数据 |
'w' | 以写的形式打开文件 |
'bw'/'wb' | 写操作,将二进制数据写入文件 |
'a' | 写操作,追加 |
- c.encoding :文本文件的编码方式
符号 | 意义 |
---|---|
utf-8 | 几乎支持所有的语言文字 |
gbk | 只支持英文 |
- d.open函数的返回值,就被打开的文件对象
3、关闭文件
- 语法:文件对象.close()
用法 | 意义 |
---|---|
文件对象.read() | 从文的读写位置读到文件结束,返回读到的结果 |
文件对象.readline() | 读一行 |
文件对象.readlines() | 返回一个列表,列表的元素是文件中每一行的内容 |
#####读文件操作
<hr>
###### 第一步:打开文件
f1 = open('./test1.txt', 'r', encoding='utf-8')
###### 第二步:读文件中的内容
content = f1.read()
print(type(content), content)
print('==:', f1.read())
content = f1.readlines()
print(content)
###### 第三步:关闭文件
f1.close()
写文件操作
语法 | 含义 |
---|---|
'w' | 将字符串写入文件中, 完全覆盖文件原来的内容 |
'wb'/'bw' | 将二进制写入文件中, 完全覆盖文件原来的内容 |
'a' | 追加 |
# 第一步:打开文件
f2 = open('./test1.txt', 'w', encoding='utf-8')
##### 第二步:写入文件
# f2.write(content+'hello world')
f2.writelines(['abc\n', '123\n', 'aaaaa\n'])
网友评论