04 - python进阶篇

1. 模块和包

1.1 模块

  • 每一个以扩展名py结尾的代码文件都是一个模块
  • 模块名同样也是一个标识符,需要符合标识符的命名规则
  • 在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具
  • 模块就好比工具包,要使用工具包中的工具,需要先导入这个模块

两种导入方式

import 模块名1,模块名2

from ... import 工具名

模块测试

在实际工作中,每一个模块都是独立开发的,开发这个模块的人员通常会在模块下方写一些测试代码,仅在模块内使用。

__name__属性:

  • __name__,测试模块的代码只在测试情况下被运行,导入时不会执行
  • 是一个python的内置属性,记录这一个字符串
  • 如果是被其它文件导入的,__name__就是模块名
  • 如果是当前执行的程序,__name__就是__main__

示例:

1.2 包

  • 包是一个包含多个模块的特殊目录
  • 目录下有一个特殊的文件__init__.py
  • 包名的命名方式和变量名一致,小写字母+_

使用import 包名可以一次性导入包中所有的模块。

包的制作示例

1. 新建一个test_package目录

2. 在这个目录下新建python文件模块test1,test2

3. 在两个模块中分别定义方法say_hello1()和say_hello2()

4. 在目录下新建__init__.py,将需要暴露的模块进行导入

5. 新建文件进行导入测试

test1.py

def say_hello1():
    print('你好呀1')

test2.py

def say_hello2():
    print('你好呀2')

 __init__.py

from . import test1
from . import test2

导入模块与运行 

2. 文件操作

2.1 认识文件

文本文件

  • 可以使用文本编辑软件查看,如python的源文件

二进制文件

  • 保存的内容不是直接给人阅读的(不能直接使用文本编辑软件查看),而是提供给软件使用的,比如图片文件、音频文件

2.2 文件操作

一共包含三个步骤:

  1. 打开文件
  2. 将文件内容读入内存 或者 将内存内容写入文件
  3. 关闭文件

python操作文件记住一个函数和三个方法

 读取文件示例

新建一个青花瓷文本文件

使用python代码读取

# 第一步,填入文件路径,打开文件,返回的是文件的操作对象
f = open('./青花瓷.txt')

# 第二步,使用文件对象读取文件中的数据
text = f.read()
print(text)

# 第三步,读取完了之后,关闭流文件,防止资源占用
f.close()

运行代码 

文本指针:

  • 文本指针标记从哪个位置读取数据
  • 第一次打开文件时,通常文件指针会指向文件的开始位置,当执行完了read方法后,文本指针会移动到内容的末尾
  • 如果执行了一次read方法,读取了所有内容,那么再次调用read方法,不会读取到任何内容

写入文件示例

test_write.py

# 第一步,填入文件路径,打开文件,返回的是文件的操作对象
f = open('./青花瓷.txt')

# 第二步,使用文件对象写入数据
f.write('\n在瓶底书刻隶仿前朝的飘逸\n就当我为遇见你伏笔')

# 第三步,读取完了之后,关闭流文件,防止资源占用
f.close()

 运行程序

原因

在打开文件的时候,如果不加文件的访问方式,函数默认是以只读的方式打开文件。

因此,如果想要写入文件,需要给函数加上访问方式。

语法

f = open("文件名", "访问方式")

加上文件访问方式

# 第一步,填入文件路径,打开文件,返回的是文件的操作对象
f = open('./青花瓷.txt', "a")

# 第二步,使用文件对象写入数据
f.write('\n在瓶底书刻隶仿前朝的飘逸\n就当我为遇见你伏笔')

# 第三步,读取完了之后,关闭流文件,防止资源占用
f.close()

2.3 按行读取文件

read方法默认会把文件的所有内容一次性读取到内存,如果文件太大,对内存的占用会非常严重。

读取大文件的正确姿势

test_readline.py

# 打开文件
f = open('./青花瓷.txt')

# 按行读取文件内容
while True:
    text = f.readline()

    if not text:
        break

    # 读取的时候是默认换行的
    print(text, end="")

# 关闭文件流
f.close()

运行程序

 

2.4 with...as语句

使用open打开一个文件的时候,如果文件存在,可以正常打开,操作完之后再调用close关闭文件。

如果文件不存在,就会抛出错误,后面的close就不会执行了,为了保证无论如何都可以正确关闭文件

一般写法

try:
    f = open(路径, 'r')
finally:
    f.close()

简便写法示例

test_with.py

with open("README.txt") as f:   
    data= f.read()
    print(data)
with open('./青花瓷.txt') as f:
    print(f.read())

 运行

with语句可以自动管理上下文资源,不论什么原因跳出with块,都能确保文件正常关闭,即不需要手动释放资源,不用写close。 

3. lambda表达式

语法

lambda 参数列表: lambda体

优势

  • 对于单行函数,使用lambda表达式可以省去定义函数的过程,让代码更加简洁
  • 对于不需要多次复用的函数,使用lambda表达式可以在用完之后立即释放,提高程序执行的性能

示例

4. os库

os 模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应不同的操作系统平台,根据不同的平台进行相应的操作。

5. 标准库sys

python的sys模块提供访问由解释器使用或维护的变量的接口,并提供了一些函数用来和解释器进行交互,操控python的运行时环境。

6. 时间库

6.1 time模块

是python处理时间数据的标准库

6.2 datetime模块

datatime模块重新封装了time模块,提供了更多接口,变得更加直观和易于调用。

6.3 calendar模块

提供与日历相关的功能。

7. 日志logging模块

通过记录和分析日志可以了解一个系统或软件运行情况是否正常,也可以在应用程序出现故障时快速定位问题。

日志的级别

DEBUG(调试)- INFO(通知)- WARN(警告)- ERROR(错误)- CRITICAL(严重)

日志的内容

发生时间 - 发生位置 - 日志级别 - 日志内容

使用

python提供一个记录日志的标准库logging

import logging

# 默认的日志输出级别为warning
logging.debug('This is debug log')  # 调试级别
logging.info('This is info log')  # 信息级别
logging.warning('This is warning log')  # 警告级别
logging.error('This is error log')  # 错误级别
logging.critical('This is critical log')  # 严重错误级别

运行程序

默认打印warning以上级别的日志。 

输出日志到文件并指定相关信息

import logging

# 使用baseconfig()来指定日志输出级别,日志信息写入test.log文件中
# asctime:日期,levelname:级别,message:报错信息,filename:文件名,lineno:报错行数;datefmt:格式化时间字符串;level:修改默认日志级别
logging.basicConfig(filename="test.log", filemode="w",
                    format="%(asctime)s %(name)s:%(levelname)s:%(message)s|%(filename)s:%(lineno)s",
                    datefmt="%Y-%M-%d %H:%M:%S", level=logging.DEBUG)

logging.debug('This is a debug message')
logging.debug('This is debug log')  # 调试级别
logging.info('This is info log')  # 信息级别
logging.warning('This is warning log')  # 警告级别
logging.error('This is error log')  # 错误级别
logging.critical('This is critical log')  # 严重错误级别

8. 数学相关模块

8.1 math模块

math库是python提供的内置数学类函数库,因为复数类型常用于科学计算,一般计算并不常用,因此math库不支持复数类型,仅支持整数和浮点数运算。

8.2 decimal模块

decimal模块提供了一个Decimal数据类型用于浮点数计算,Decimal重现了手工的数学运算,确保了二进制浮点数无法精确保有的数据精度。

以上这些模块没有必要一个一个去死记硬背里面的每一个属性和方法,在实际使用的使用去代码文档里看就行了,写代码不是记代码。

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值