Python基础(3)

面向对象编程

根据类来创建对象称为实例化。这里只过一下大概的面向对象的内容,不做细讲。可以直接查阅资料。https://www.runoob.com/python3/python3-class.html

创建和使用类及实例

给出一个类的使用例子:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def sit(self):
        printf(f"{self.name} is now sittig.")
        
  	def roll_over(self)
		print(f"{self.name} rolled over!")
        
my_dog = Dog("willie", 6)	#实例化一个对象

注意:__init__() 是一个特殊的方法,当类创建一个新的实例时,会自动运行该方法。类似于C++里的构造函数。而self是指向实例本身的引用。每个函数默认第一个参数都是self。每个与实例相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。以 self 为前缀的变量可供类中的所有方法使用,可以通过类的任何实例来访问。

继承

在既有类的基础上编写新类时,通常要调用父类方法__init()__。这将初始化在父类__init()__ 方法中定义的所有属性,从而让子类包含这些属性。给出一个例子:

动物基类代码:

class Animal:
    def __init__(self, ptype, sound, color):
        self.ptype = ptype
        self.sound = sound
        self.color = color
        
	def get_sound(self):
        print(f"这只{self.ptype}的叫声是{self.sound}")
    
    def get_color(self):
        print(f"这只{self.ptype}的颜色是{self.color}")
        

狗派生类实现代码:

class Dog(Animal): #子类继承父类,是需要将父类放在子类括号中
    def __init__(self, ptype, sound, color):
        #初始化父类属性
        super().__init__(ptype, sound, color) #特殊方法,可以在子类中调用父类方法
        
    def get_sound(self):
        print(f"这只{self.ptype}它竟然不叫")
        
my_tesla = Dog("狗", "汪汪汪", "黑色")
my_tesla.get_color()
my_tesla.get_sound()

对于父类的方法,只要它不符合子类模拟的实物的行为,都可以进行重写。为此,可在子类中定义一个与要重写的父类方法同名的方法。这样,Python将不会考虑这个父类方法,而只关注在子类中定义的相应的方法。

导入模块

在 python 用 import 或者 from...import 来导入相应的模块。

将整个模块(Allmodule)导入,格式为: import Allmodule

从某个模块中导入某个函数,格式为: from Allmodule import somefunction

从某个模块中导入多个函数,格式为: from Allmodule import firstfunc, secondfunc, thirdfunc

将某个模块中的全部函数导入,格式为: from Allmodule import *

使用别名导入函数,格式为: from Allmodule import firstfunc as Func

Python标准库

https://pymotw.com/3/

读取读取数据

读取整个文件

先给出一个例子,对这个例子进行解释分析。读取一个文件,内容是圆周率的后30位的数值,且在小数点后每10位处换行。

with open("pi_digits.txt") as file_object:
    contents = file_object.read()
print(contents)
#文件内容
/*
3.1415926535
  8979323846
  2643383279
*/
  • open() 在当前目录下查找指定文件。返回一个对象,用as对这个返回值起别名为 file_object
  • 关键字 with 在不再需要访问文件后将其文件对象进行关闭
  • 文件对象调用read()方法读取文件内容,当到达文件末尾时返回一个空字符串,而将这个空字符串显示出来就是一个空行

注意:可以调用 open()close() 来打开和关闭文件,但这样做时,如果程序存在bug导致方法 close() 未执行,文件将不会关闭。所以使用上面的结构读取文件时,Python会在合适的时候自动将其关闭。

删除多余的空行可以使用 rstrip() contents.rstrip()

对了open函数里既可以填写绝对路径和相对路径,这点就不说了,简单。不懂上网查。

逐行读取文件

filename = "pi_digits.txt"

with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())

注意:文件中每一行的末尾都是有一个换行符的。因此要对读取的每一行字符串内容进行删除多余的空白行,使用 rstrip()

创建一个包含文件各行内容的列表:
readlines() 从文件中读取每一行,并将其存储在一个列表中

filename = "pi_digits.txt"

with open(filename) as file_object:
    lines = file_object.readlines()

for line in lines:
    print(line.rstirp())

使用文件内容组成完整字符串:

filename = "pi_digits.txt"

with open(filename) as file_object:
    lines = file_object.readlines()

pi_string = ""
for line in lines:
    pi_string += line.rstrip()
    
print(pi_string)	# 结果为 3.1415926535 8979323846 2643383279
print(len(pi_string))	# 32

由于pi_string指向的字符串包含原来位于每行左边的空格,为删除这些空格,可使用 strip()。读取文本文件时,Python将其中的所有文本都解读为字符串。

写入文件数据

写入空文件

filename = "programming.txt"

with open(filename, "w") as file_object:
    file_object.write("I love programming.")

open()函数的第二个实参是告诉python,要以写入模式打开这个文件。

打开文件时,可指定读取模式("r")写入模式("w")附加模式("a")读写模式("r+")。如果省略了模式参数,Python将以默认的只读模式打开文件。如果要写入的文件不存在,函数open()将自动创建它;若该文件存在,则会清空该文件内容。

注意:Python只能将字符串写入文本文件中。若要将数值数据存储到文本文件中,必须使用函数str(),将其转换为字符串格式。

写入多行

函数write()不会在写入的文本末尾添加换行符,因此需要我们在调用write()函数时,手动添加换行符。

filename = "programming.txt"

with open(filename, "w") as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love creating new games.\n")

附加到文件

如果要给文件添加内容,而不是覆盖原有的内容,可以用附加模式打开文件。写入文件的行添加到文件末尾。若指定文件不存在,将会创建新的文件。

filename = "programming.txt"

with open(filename, "a") as file_object:    
    file_object.write("I also love finding meaning in large datasets.\n")    
    file_object.write("I love creating apps that can run in a browser.\n")

异常

Python使用称为异常的特殊对象来管理程序运行期间发生的错误。每当发生一个错误时,便会自动创建一个异常对象。

异常是使用 try-except 代码块处理的。

try-except 代码块

任何数值除以0,都是会报错的。报错结果如下:

ZeroDivisionError: division by zero 	#ZeroDivisionError是个异常对象

处理ZeroDivisionError异常的try-except代码块如下:

try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero!")

else 代码块

依赖 try 代码块成功执行的代码都应放到 else 代码块中:

first_number = input("请输入第一个数:\n")
second_number = input("请输入第二个数:\n")
try:
    answer = int(first_number) / int(second_number)
except ZeroDivisionError:
    print("You can't divide by zero!")
else:
    print(answer)

分析文本

方法 split() 以空格为分隔符将字符串分拆成多个部分,并将这些部分都存储到一个列表中。结果是一个包含字符串中所有单词的列表。
使用 split() 函数对多个文本进行分析获取单词数量。

def count_words(filename):
    try:
        with open(filename, encoding = "utf-8") as f:
            contents = f.read()
    except FileNotFoundError:
        print(f"Sorry, the file {filename} does not exist.")
    else:
        words = contents.split()
        num_words = len(words)
        print(f"The file {filename} has about {num_words} words.")
  
filename = ["alice.txt", "siddhartha.txt", "moby_dick.txt", "little_women.txt"]
for filename in filename:
    count_words(filename)

静默失败

在前面的示例中,假设有一个文件找不到。但并非每次捕获到的异常都需要告诉用户,而是希望程序在发生异常时保持静默,就像什么都没有发生过一样继续运行。那需要在 except 代码块中明确什么也不做,可使用 pass 语句。

def count_words(filename):
    try:
        # -- snip --
    except FileNotFoundError:
        pass	#pass也充当这个占位符,提醒这个地方什么也不做
    else:
        # -- snip --

存储数据

程序会将用户提供的信息存储到列表或者字典等数据结构中,保存于内存。但程序结束关闭时,内存中的数据就会消失。所以模块 JSON能够将内存中的数据结构与信息数据转储到文件中,并在程序再次运行时加载该文件中的数据。同时JSON格式能够方便不同程序之间的数据分享。

JSON基本函数

json.dump() :接受两个实参:1、要存储的数据 2、可用于存储数据的文件对象 。然后存储到文件中。

import json	#导入json模块

numbers = [2, 3, 5, 7, 11, 13]
filename = "numbers.json"
with open(filename, "w") as f:
    json.dump(numbers, f)	#存储数据

json.load() :只接收一个数据存储的文件对象,将文件内容加载到内存中。

import json	#导入json模块

filename = "numbers.json"
with open(filename) as f:
    numbers = json.load(f)
    
print(numbers)

保存和读取用户生成的数据

可以写一个例子,加强对 json 的使用理解。这样一个程序:提示用户首次运行程序时,输入自己的名字,并在再次运行程序时记住他。

import json

filename = "username.json"
try:
    with open(filename) as f:	#如果文件存在,将会打开文件,内容加载到内存
        username = json.load(f)
except FileNotFoundError:	#打开失败,就重新输入文件的名字,写入文件内容
    username = input("What is your name? ")
    with open(filename, "w") as f:
        json.dump(username, f)
        print(f"We'll remember you when you come back,{username}!")
else:
    print(f"Welcome back,{username}!")
        

重构

代码能够正确运行,但是通过将其划分为一系列完成具体工作的函数,还可以改进。这样的过程叫做重构。重构让代码更清晰、更易于理解、更容易扩展。

对上面的例子进行重构,从而获得以下重构后的代码。

import json
#如果存储了用户名,就获取它
def get_stored_username():
    filename = "username.json"
    try:
    	with open(filename) as f:	#如果文件存在,将会打开文件,内容加载到内存
       		username = json.load(f)
	except FileNotFoundError:	#打开失败,就重新输入文件的名字,写入文件内容
    	return None
    else:
        return username
    
#提示用户输入用户名    
def get_new_username():
    username = input("What is your name? ")
    filename = "username.json"
    with open(filename, "w") as f:
        json.dump(username, f)
    return username

#问候用户,并指出其名字
def greet_user():
    username = get_stored_username()
    if username:
        print(f"Welcome back,{username}!")
    else:
        username = get_new_username()
        print(f"We'll remember you when you come back,{username}!")

greet_user()        
posted @ 2023-07-18 17:21  雪国北风  阅读(84)  评论(0编辑  收藏  举报