python 编程基础 —— 大厦必不可少的砖瓦水泥

时光毁灭记忆、已成空白 提交于 2020-10-14 20:41:05

掌握python基本语法后,我们可以在骚骚地写一些小脚本,当时总感觉少了点什么?

文件读写

我们要加载外部的文件怎么办?我们要存储自己计算好的数据怎么办呢?这个时候我们需要用到文件读写功能。我们先打开一个文件对象

# file = open(file_name [, access_mode][, buffering])
file_1 = open('python大法是好剑客.txt', 'r') # 只读文件

file_name是文件名或着文件的path,access_mode用来制定文件操作的模式,如果是只读文件,pattern=‘r’; 只写文件,pattern=‘w’,明细参数可以参考下图(来自菜鸟教程); buffering 表示是否寄存,基本不会用到。
python 文件读取参数设置
然后我们就可以读取文件对象中的内容或者写入内容,常用操作

  • 读取: file.readline() 逐行读取; file.readlines()一次性读取所有行 (小文件可以,大文件很危险!)
  • 写入:file.write(string) 字符串写入文件;file.writelines(sequence)
# 第一行内容是:你又在胡说八道什么了!
print(file.readline())

除了文件读写,可能还需要补充一些文件路径方面的操作,在os库里面定义了丰富的工具函数

  • os.mkdir(dir)新建目录; 加强版os.makedirs() 创建完成的路径目录,比如你在/user下要创建 /user/python/base/helloworld/,在python/base/不存在的情况下,os.makdirs
  • os.getcwd() 获取当前目录
  • os.rmdir(dir)删除目录,删除操作很危险,尽量少用
  • os.path.exists(path) 判断路径是否存在
  • os.path.join(str1, str2, str3) 会把str1,str2,str3连接成一个路径。

命令行参数

大家在学python的时候一定会到类似如下的命令

python say_hello.py  LiMing

在py脚本后多了一个字符串,你会问它到底是什么?有什么用呢?我们看一下say_hello.py的内部实现

import sys

print("hello, {}! ".format(sys.argv[1]))

其实就是想和遇到的小伙伴套个近乎,但是需要知道小伙伴的姓名,这个使用通过一个命令行参数传递传递进来。sys.argv[ind],ind=0取的是当前运行的脚本名,1才是第一个参数,依次递推。

使用sys.argv的优点是传递参数很简单,有个问题你都不知道传递的参数什么意思?而且还没发给默认参数?那么怎么解决这写问题呢?python大法说,不要慌,我们还有一个神奇的argparse标准, 用法

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--name", type=str, default="HanMeimei",  help="小伙伴的姓名")
args = parser.parse_args()
print("hello, {}! ".format(args.name))

调用方式就改成了

python say_hello.py  --name LiMing

如果你没有传参数,系统默认所有的人都是HanMeimei!

打印日志

大家在运行程序的时候,如果程序很长,只是傻傻地等待程序运行结束的话,过程往往很煎熬,而且容易出问题。

比如你的程序有bug,中间结果计算并正确?或者你在做机器学习的时候,初始化参数不好,模型一开始就不收敛,我们需要及时止损。即便不止损,我们知道程序的进度,也还安排晚上是去花天酒地呢?还是继续后续的操作。

那么怎么办呢?最简单的直接方案借助print来打印中间结果/进度条,print函数好

from wuliao import ganhuaishi

count = 0
while (True):
	count += 1
	ganhuaishi()
	if count % 100:
		print("hello world!")

每调用ganhuaishi() 函数100次,我们都打印一次hello world!也可以选择打印某些变量,比如在机器学习里面训练模型是往往会打印损失函数、准确率,用来监控模型训练的效果。

但是print函数太简单了,对于大型的应用程序要上日志系统?仅仅用print往往不够用。那么python有木有成熟的日志库呢?python大法又来了,这个必须有啊!它就是logging库,专业日志输出神器。logging不仅能输出到控制台,还能写入文件,使用TCP协议,将日志信息发送到网络等等,功能十分强大, 具体大家参考[4],我不展开了,以后有机会单独讲解(言外之意我还没有搞透!)。可以参考以下代码:

# -*- coding: UTF-8 -*-
import os
import logging
import time

def logger_init(log_dir):
    """初始化日志模块"""
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    # 定义输出路径
    rq = time.strftime("%Y%m%d%H%M", time.localtime(time.time()))
    log_path = os.path.join(log_dir, "{}.log".format(rq))
    fh = logging.FileHandler(log_path, mode="w")
    fh.setLevel(logging.INFO)

    # 定义输出格式
    formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
    fh.setFormatter(formatter)

    # 输出到屏幕
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    console.setFormatter(formatter)
    logger.addHandler(fh)
    logger.addHandler(console)

    return logger

if __name__ == "__main__":
    logger = logger_init("../logs")
    logger.info("hello logger!")

异常处理

最早是在学生阶段知道了异常处理这个东西,但年自己也不是计算机专业,写代码纯粹是为了处理点数据,水个文章。但是总是有的代码跑一半就掉了,但是也不是什么大问题,我就想怎么跳过这些问题呢?某一天有个师兄说,你可以试试try/catch语句(当时还只会用matlab)!

在python中try/except来进行异常捕获,捕获异常后,我们可以进行异常处理,如果不跳出程序,就不会影响后续的代码运行。

try:
	ganhuaishi()
except Exception:
	print("时候未到!")

print("hello world!")	

try的语法

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常:

  • 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
  • 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印默认的出错信息)。
  • 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。[5]

当然用try时候很危险啊,因为你把一些异常跳过去了,这个时候except中必须加提示和处理,此次是重点!!!

除了try/except语句,python还提供assert断言语句,用来做一些异常检查,一旦不满足assert语句,程序会立马中断并报错。

比如程序要求输入名字为LiMing,结果输入了HanMeimei,那么

assert name=="LiMing", "请输入LiMing,{} 是乖宝宝".format(name)

assert断言语句个人感觉很好,当你写一个功能的时候对输入、中间结果、输出必须正确把握,做测试的时候就可以用assert来检查一些中间结果,及时止损,免得输掉面包钱![6]

至此你已经学会了python的地基(基础语法,好像还缺函数和面向对象编程,回头补哈)和 砖瓦水泥,能建成怎样的高楼大厦(茅草屋),就看个人修行了。来开始你的表演。

参考

  1. https://www.liaoxuefeng.com
  2. https://www.runoob.com/python/python-files-io.html
  3. https://www.cnblogs.com/dengtou/p/8413609.html
  4. https://blog.csdn.net/zgf605506394/article/details/88595135
  5. https://www.runoob.com/python/python-exceptions.html
  6. https://blog.csdn.net/qq_39247153/article/details/81082313

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!