一、模块
1、什么是模块
Python中一个py文件就是一个模块;
可以通过 import 或者 from-import 在一个模块中去使用另外一个模块的内容;
方法:
import 模块名 ——》将模块中所有的内容导入,并且可以在当前模块中通过“模块名.”的方式去使用模块中的所有全局变量;
from 模块名 import 变量1,变量2,... ——》将模块中所有的内容都导入,但是只能使用import后面的变量;
from 模块名 import * ——》将模块中所有内容导入,可以直接使用所有的全局变量;
代码执行到 import 的时候,会将 import 后面的模块的内容执行一遍;
================
test1 代码内容:
print(__name__)
test=100
print('导入了一个新的模块',test)
def func1():
print('good morning,everone')
func1()
print(func1())
==============
例如:
import test1
__test1__ #print(__name__)
#导入了一个新的模块 100 #print('导入了一个新的模块',test)
good morning,everone #print('good morning,everone')
good morning,everone #func1()
None #print(func1())
#####以上为导入 test1 文件 自动执行的结果
test1.func1() #good morning,everone
#####以上为人为执行 test1.func1 的结果
2、模块重命名
import 模块名1 as 模块新名字 ——》 给模块名1用模块新名字命名,但模块新名字只在当前模块中有用,并没有对其真的改名;
from 模块名 import 变量名1 as 变量新名字,变量名2 as 变量新名字,...——》给模块部分变量重新命名,但变量新名字只在当前模块中有用,并没有对其真的改名;
import test1 as jsj
print(jsj.test) #100
from test1 import func1 as hanshu1
print(hanshu1()) #代码执行的实质是 test1.func1()
3、import
一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
4、选择性导入(阻止导入)
if _ _ name_ _ == '_ _ main_ _' : ——》固定写法
不希望被别的模块导入执行的代码写在这儿(注意缩进)
5、什么时候使用模块
将具有相同的功能的函数和数据封装到一起,使用
二、迭代器
1、什么是迭代器
迭代器是Python中容器类的数据类型。属于序列,没有具体的字面量(即不逐个取出查看,你永远不晓得这个迭代器里有多少个元素,以及元素是什么)。可以将其他的序列转换成迭代器。
生成语法:iter(序列);
2、迭代器的特点
a、只能通过next方法去一个一个的获取迭代器中的元素;
b、取出一个元素后,迭代器中就不存在这个元素了;
取出语法:next(迭代器);迭代器._ _ next_ _ ()
str1='123456abcde'
iter1=iter(str1)
print(iter1) #<str_iterator object at 0x002809B0> 迭代器地址
print(next(iter1)) #1
print(next(iter1)) #2
print(next(iter1)) #3
print(next(iter1)) #4
print(next(iter1)) #5
print(iter1._ _ next_ _ ()) #6
思考:iter剩下的元素是什么???
三、生成式和生成器
1、生成器
生成器就是迭代器,但迭代器不一定是生成器;
生成式就是生成器的一种特殊形式:(变量 for 变量 in 序列)
ge1=(x for x in range(10))
print(ge1) #<generator object <genexpr> at 0x01DC6E40>
next(ge1) #0 把0取出来了,只是未未打印出来
print(next(ge1)) #1 打印出来了
print('======')
for item in ge1:
print(item) #23456789
2、生成器就是函数体中有yield关键字的函数
print('========')
普通函数
def func1(n):
for x in range(1,n+1):
print(x) #1 2 3
print(func1(3)) #None
print('========')
生成器
def func2(n):
for x in range(1, n + 1):
print(x)
yield
print(func2(5)) #<generator object func2 at 0x00AF6F60>
调用函数不再执行函数体,也不再获取返回值,而是提示你这是一个生成器,返回生成器地址;
这个函数变成了生成器
ge2=func2(2)
next(ge2) # 1 2
ge3=func2(3)
print(next(ge3)) #None yield返回值默认是None
通过next获取生成器的元素的时候,会去执行生成器对应的函数的函数体,执行遇到yield为止,并将yield后面的值(默认值None)作为返回值(元素),然后保存当前结束位置,下次获取生成器元素的时候会接着上一次结束的位置;
例如:
def func2(n):
for x in range(1, n + 1):
print(x)
yield x
ge4=func2(4)
print(next(ge4)) 此次访问是x=1时
print(next(ge4)) 此次访问是x=2时,且x=1已取出,即不存在于此生成器中
print(next(ge4)) 此次访问是x=3时,且x=1和2已取出,即不存在于此生成器中
执行过程如下
'''
x=1 ,print(1),yield 返回值1,执行结束
x=2 ,print(2),yield 返回值2,执行结束
x=3 ,print(3),yield 返回值3,执行结束
此生成器还剩下x=4
四、文件操作
使用本地文件可以做数据的持久化(本地化)——》数据库文件、txt文件、json文件、plis他、二进制文件;
1、文件操作——读写操作
读——》取出文件中的数据
写——》将数据写到文件中
所有文件操作的过程:打开文件——》操作(读、写、保存)文件——》关闭文件
2、打开文件和关闭文件
打开文件: open(file,mode="r",encoding=utf—8)
(1)file——》文件路径,决定需要打开的是哪个文件;
绝对路径(不推荐使用)
相对路径:相对路径是相对当前py文件对应的文件夹;格式: ./相对路径
相对路径是相对当前py文件对应的文件夹的上层文件夹;格式: ../相对路径
相对路径是相对当前py文件对应的文件夹的上层文件夹的上层文件夹;格式:.../相对路径
例如: open('./text.txt',"r",encoding='utf-8')
(2)mode——》文件打开方式(不同的操作对应不同的打开方式)
"r"——》以只读形式打开文件,文本
"rb/br"——》读操作,读出来的数据是二进制形式的数据
"w"——》以写的形式打开文件
"wb/bw"——》写操作,将二进制数据写入文件
"a"——》写操作,追加
(3)encoding——》文本编码方式
utf—8:几乎支持所有的语言
gbk:只支持英文
(4)open函数的返回值,就是被打开的文件对象
(5)关闭文件: 文件.close()
例如:text.close()
3、操作文件
打开文件
f1=open('./text.txt',"r",encoding='utf-8')
读文件内容
文件.read() ——》从文件的读写位置读到文件结束,返回读到的结果;
文件.readline()——》读一行;
文件.readlines()——》返回一个列表,列表的元素是文件中每一行的内容;
content=f1.read()
print(type(content),content) #<class 'str'> 娃哈哈wahaha
f1.close()
文件的写操作
f2=open("./text.txt","w",encoding="utf-8")
'w'——》将字符串写入文件中,完全覆盖文件原来的内容;
'wb/bw'——》将二进制写入文件中,完全覆盖文件原来的内容
f2.write('娃哈哈') #娃哈哈1
f2.write(content+"娃哈哈2") #娃哈哈1娃哈哈2
f2.write("wahaha")#娃哈哈1娃哈哈2wahaha
网友评论