美文网首页
2018-10-12day11模块的使用、迭代器、生成式和生成器

2018-10-12day11模块的使用、迭代器、生成式和生成器

作者: MW演员 | 来源:发表于2018-10-19 19:17 被阅读0次

一、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'])

相关文章

网友评论

      本文标题:2018-10-12day11模块的使用、迭代器、生成式和生成器

      本文链接:https://www.haomeiwen.com/subject/ugyuzftx.html