python基础学习-2进阶

本文介绍了Python编程的基础知识,包括斐波纳契数列、猜数字游戏的实现,详细讲解了while和for循环的用法。接着深入到函数的定义、实例化、初始化方法以及返回值。文章还探讨了面向对象编程的三大特性:封装、继承和多态,并通过示例进行解释。此外,文章还涵盖了文件读写操作,如按行读取、写入,以及文件路径处理。最后,提到了异常处理机制和使用requests库进行简单网络请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.编程第一步

1.1斐波纳契数列。

#coding utf-8
#author ****
a = 0
b = 1
while b < 10:           #进入while后上方初始变量无意义
    print(b)
    a, b = b, a+b       #a的定义不会影响当前a+b的值,只能影响下一次
#特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。

等同于
#coding utf-8
#author ****
a = 0
b = 1
while b < 10:
    print(b)
    n = b              
    m = a + b          ##第一次是0+1,调用外部变量,所以会出现俩次1
    a = n
    b = m

result:  
1                       
1                         
2                         
3                         
5
8

#coding utf-8
#author ****
a = 0
b = 1
while b < 10:
    print(b)
    a = b
    b = a+b
result:
1
2
4
8

1.2 猜数字

#coding utf-8
#author ****
target = random.randint(1,100)
fail = 1
success = False
while fail <= 3:
    print("*" * 20)
    user_num = int(input(f"这是{fail}次,请输入心中所想数字:"))
    if not str(user_num).isnumeric():              #判断输入内容是否为整形
        print("你输入的不是数字,请重新输入。")
        continue
    if  user_num == target:
        print("恭喜猜对了")
        success = True
        break
    elif user_num < target:
        print("猜小了")
    else:
        print("猜大了")

    fail += 1                                #不能写在if判断体系内就是结束一次加一次
if  not success:
    print(f"遗憾没有猜对,正确数字为:{target}")

1.3 while 循环

语法:
while <expr>:
    <statement(s)>
else:
    <additional_statement(s)>
--案例
#!/usr/bin/python3
 
count = 0
while count < 5:
   print (count, " 小于 5")
   count = count + 1
   #count的大小+1
else:
   print (count, " 大于5")
   #当count大于五时输出else的内容

1.4 for循环

Python for 循环可以遍历任何可迭代对象,如一个列表或者一个字符串。

for循环的一般格式如下:
for <variable> in <sequence>:
    <statements>
else:
    <statements>
    
--案例
for x in range(6):
  print(x)
else:
  print("Finally finished!")


--案例
#!/usr/bin/python3
sites = ["Baidu", "Google","Runoob","Taobao"]
for site in sites:
    if site == "Runoob":
        print("菜鸟教程!")
        break
        #如果site得到的列表内容为"Runoob".则结束循环
    print("循环数据 " + site)
    #不匹配if条件的都会输出此内容+为输出site内容
else:
    print("没有循环数据!")
    #此内容不会输出,因为循环没有结束,但是无法结束.因为site匹配ruoob时已经结束.无法进行最后一项的循环
print("完成循环!")

2.函数

2.1 函数定义

"""
函数,就是给一段代码起一个名字,可以独立的调用、可以重复的使用这段代码
使用函数,让程序的编写、阅读、升级都更加的容易
"""
def print_hello():
    """
    这是一个函数体
    """
    print("hello world")

print_hello()

"""
可以给函数提供参数(形参)
"""
def introduce(name):
    print(f"大家好我的名字是:{name}")
introduce("****")
introduce("小王")             #此处执行函数时传入的是实参,调用函数就等于name=""

#!/bin/env python
"""
编写一个函数:
名字叫做 sum_numbers
有一个参数叫做 number
函数内,实现 1~number 之间,所有数字的加和
打印加和的结果
调用多次这个函数,传入不同的number查看结果
"""
def sum_numbers(number):
	sum_value = 0
	for i in range(1,number):
		sum_value += i
	print(f"1--{number}的加和为:{sum_value}")

sum_numbers(int(input("请输入加和的最大数:")))

2.2 函数返回值

"""
函数可以具有返回值
函数可以具有一个或者一组值,将逻辑“封装”在函数中,会让简化整个程序
"""
def add(x,y):
    x = int(x)
    y = int(y)
    return (x+y)              #执行函数体返回的内容

result = add(3,4)                #定义result为函数的执行动作
print(result)
print(add("7",3))

"""
函数可以具有一个或者一组值,将逻辑“封装”在函数中,会让简化整个程序
"""
students = {
    "xiaoming": {"id": 101, "age": 18, "gender": "boy"},
    "xiaohuang": {"id": 102, "age": 19, "gender": "girl"},
    "xiaowang": {"id": 103, "age": 17, "gender": "girl"},
}
def get_studen(name):
    if name in students:
        return students[name]
    else:
        return None
print(get_studen("xiaoming"))
print(get_studen("xiaowang"))

"""
返回多个值
"""
students = {
    "xiaoming": {"id": 101, "age": 18, "gender": "boy"},
    "xiaohuang": {"id": 102, "age": 19, "gender": "girl"},
    "xiaowang": {"id": 103, "age": 17, "gender": "girl"},
}
def get_student(name):
    if name in students:
        return students[name]["id"],students[name]["gender"]   #只返回name字典中的id_key对应value已经gender对应value
    else:
        return None,None      #多次调用字典内容,需要俩个None否则报错
#可以分开变量进行接收
id,gender = get_student("xiaoming")
print(id,gender)            #id则接收的是xiaoming——id_key,gender接收的是gender对应value
#可以接收为元组
info = get_student("xiaowang")
print(info,type(info))

2.3 lambda函数

"""
lambda函数:称为匿名函数,函数的定义直接使用,不用起名字;又称为一句话函数、逻辑简单到一行代码就能表达逻辑;用于一些简单的、不会重复多次调用的情景
"""
"""
定义形式:lambda 参数:操作(参数)
定义举例:sum = lambda x,y: x+y          #lambda替代函数名
相当于
def func(x,y):
  return x+y
调用举例:sum(1,2)
"""
##案例
sgrades=[("xiaoming",89),("xiaozhao",77),("xiaoxiaozhang",99)]          #列表套元组
#如何将列表内容安装分数进行排序
sgrades.sort(key=lambda x:x[1],reverse=True)        #key:比较元素 等同于def hh(x): return x[1]。
#此sort获取到的是sgrades中每个元组中的下标为1的值,也就是分数然后进行排序
#默认列表加元组的排序方式为元组的第一个元素即名字
print(sgrades)
def mfun(m):
    return m[1]
print(sorted(sgrades,key=mfun))       #效果于lambda完全一致
##m为列表中获取到的内容即每个元组,m1为元组中的分数

2.4 函数source

def add(x,y):
    return x+y

def sub(x,y):
    return x-y

def mul(x,y):
    return x*y

def div(x,y):
    return x/y
#定义函数体的文件不调用最好


#1.导入变量文件的内容不改动
import compute                        #compute为文件名.py文件
print(compute.add(3,5))
print(compute.sub(10,20))
print(compute.mul(3,5))
print(compute.div(10,2))

#2.导入变量的文件环境变量并起别名
import compute as cm
print(cm.add(3,5))
print(cm.sub(10,20))
print(cm.mul(3,5))
print(cm.div(10,2))

#3.导入变量文件用from
from compute import add,sub,mul       #from方式不需要写函数名可以直接调用
print(add(3,5))
print(sub(10,20))
print(mul(3,5))

二.面向对象

1.基本概念

1.1 类class(基本概念)

1.class(基本概念)
#类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合。
#用计算机的语言描述类,是属性和方法的集合
2.对象instance(例子)/object(对象)
--对象是类的具象,是一个实体。
--对于我们每个人这个个体,都是抽象概念人类的不同的实体。
--对象属性:它是对象状态的抽象,用数据结构来描述
--对象操作:它是对象行为的抽象,用操作名和实现该操作的方法来描述
3.三剑客
--封装
组装:将数据和操作组装到一起
隐藏数据:对外只暴露一些接口,通过接口访问对象
--继承
多复用,继承来的就不用自己写了
多继承少修改,OCP(open-closed principle--开闭原理),使用继承来改变,来体现个性
--多态
面向对象编程最灵活的地方,动态绑定
4 哲学思想
##一切皆对象
#对象是数据和操作的封装
#对象是独立的,但是对象之间可以相互作用
#目前OOP(Object-oriented programming--面向对象编程)是最接近人类认知的编程范式

###"""面向对象的思想主要是以对象为主,将一个问题抽象出具体的对象,并且将抽象出来的对象和对象的属性和方法封装成一个类。"""
##面向过程是一种以事件为中心的编程思想,编程的时候把解决问题的步骤分析出来,并且按步骤实现。##

1.2 类的定义

1.定义
--必须使用class()关键字
--类名必须是用大驼峰命名(大小写集合的命名规则)例:ClassName
--类定义完成后,就产生了一个类对象,绑定到了标识符ClassName==类对象
#用法:
class ClassName:
   语句块

1.3 类对象及属性

1.类对象及类属性
#类对象,类的定义执行后会生成一个类对象
#类的属性,类定义中的变量和类中定义的方法都是类的属性
#类变量,直接定义在类中的属性;一般来讲,类变量可使用全大写来命名

1.4 类的实例化

1.类的实例化
#在类对象名称后面加上一个括号,就是调用类的实例化方法,完成实例化
#实例化就是真正的创建一个该类的对象(实例)
#每次实例化后获得的实例,都是不同的实例
#即使是使用同样的参数实例化,也得到不一样的对象
#Python类实例化后,会自动调用 __init__ 方法,这个方法的第一个形式参数必须留给self(自己),其它参数随意

1.5 _init_方法

1.__init__ 方法
#类的实例化,实际上就是调用的 __init__(self) 方法
#这个方法可以不定义,如果没有定义会在实例化后隐式调用
#作用:对实例进行初始化
#初始化参数可以多个参数,但是第一个位置必须是self(实例本身)
#此方法不能有返回值,也就是只能 return None
#实例化调用__init__魔术方法来进行初始化-出厂配置,对生成的实例进行属性配置,__init__ 定义的是实例的属性

1.6 实例对象instance

1.实例对象instance
--类实例化后一定会获得一个类的实例,就是实例对象
--__init__方法的第一参数self就是指代某一个实例自身
--类实例化后,得到一个实例对象,调用类方法时,采用 instance.class_method() 的方式,实例对象就会绑定到方法上
--调用类方法时,类方法的self参数,就是实例自身
--__init__ 中所定义的变量,是保存在实例上的,并不是类上,所以,称为实例变量
--实例变量是每一个实例自己的变量,是自己独有的
--类变量是类的变量,是类的所有实例共享的属性和方法
#调用实例中的变量,只能通过调用self或其他实例参数,才能使用其实例中的变量
#类中的变量供所有实例使用

1.7 实例

"""
面向对象的目的,用代码模拟现实世界的事物和情景,让代码的编写、组织、理解都更加容易
"""
"""
类class:描述一类事物
相当于一个事物模板
"""
"""
对象:一个具体的类的实例
"""
#例如动物是类的名称叫做事物模板
#具体动物类中存在了猫、狗、猪等称之为类的实例
class Student:                                   #class定义一个类模板,驼峰命名类的名称
    """ 类注释,这是学生类 """

    def __init__(self, name, age):                    #初始化构造函数,self为类本身,初始化后生成类的对象
        """ 初始化方法 """
        """类定义中的变量和类中定义的方法都是类的属性"""
        # 普通实例变量,每个实例独有
        self.hh = name                        #定义俩个初始变量(类的属性)
        self.aa = age

    def introduce(self):                            #定义普通方法调用init定义的初始属性变量即name和age(类属性)
        """ 普通方法 """
        return f"大家好,我叫{self.hh},我{self.aa}岁了"
xiaoming = Student("小明", 18)                  #()中的属性会被传入到初始化init中的变量进行赋值
#xiaoming就是一个实例化的类对象
xiaozhang = Student("小张", 17)                 #Student("小张", 17)  为class中的init本身
xiaozhao = Student("小赵", 19)
# 使用对象.属性来访问属性;使用对象.方法来调用方法
print(xiaoming.introduce())             #此处的小明为self,hh为name,后面的intoduce方法就是
#xiaoming.introduce访问的就是类的属性和类的introduce方法
#introduce(小明,18)进行的位置参数传入
print(xiaozhang.hh, xiaozhang.aa, xiaozhang.introduce())
print(xiaozhao.hh, xiaozhao.aa, xiaozhao.introduce())

2.面向对象三大特性

2.1 封装

1.封装:把客观事物封装成抽象的类,隐藏属性和方法的实现细节,仅对外公开接口
#封装可以把计算机中的数据跟操作这些数据的方法组装在一起,把他们封装在一个模块中,也就是一个类中。
例子:
class Box():
	"""盒子类实现了开关功能"""
	def open_door(self):
		return ("open")

	def close_door(self):
		return ("close")
#将开关功能函数集合到Box类中,实现类管理功能
open_cloes = Box()                        #定义类的实例化对象
print(f"打开门:{open_cloes.open_door()}")         #可以通过实例化对象直接调用封装好的Box类中的方法
print(f"关门:{open_cloes.close_door()}")

2.2 继承

1.继承:子类可以使用父类的所有功能,并且对这些功能进行扩展。继承的过程,就是从一般到特殊的过程。
#继承简单地说就是一种层次模型,这种层次模型能够被重用。层次结构的上层具有通用性,但是下层结构则具有特殊性。在继承的过程中类则可以从最顶层的部分继承一些方法和变量。类除了可以继承以外同时还能够进行修改或者添加。通过这样的方式能够有效提高工作效率
例子:
#!/bin/env python
class Father():
	#定义父类.不介入初始化构造函数,不设置传入属性
        def talk(self):
        	#定义函数方法,交给类self内置属性管理
                return "讲中文!"
        def breather(self):
                return "张嘴呼吸!"
class Children(Father):
	#继承父类属性和方法
        def new_talk(self,language):
        	#定义子类中的函数方法,并设置新参数属性language
                self.language = language
                #纳入类管理
                return f"讲{self.language}:食べましたか"
                #函数结束返回内容中调用language属性

me = Children()
#定义me对象为调用class类
language = "日语"
#定义子类中需要引入的参数
print(f"我会:{me.talk()}也会{me.breather()}还会:{me.new_talk(language)}")
#调用函数必须加().包括内置函数

2.组合继承
class P1():
	def __init__(self):
		pass

	def talk(self):
		return "this is p1"

class P2():
	def talk(self):
		return "this is p2"

class Person(P1,P2):               #P1在最前面所以实例对象在调用继承类Person时会引用P1父类的方法和属性
	pass

class Animal(P2,P1):                #P2在最前面所以实例对象在调用继承类Person时会引用P1父类的方法和属性
	pass

man = Person()
women = Animal() 
print(f"这是多组继承:{man.talk()}")            #此处回显的时父类P1的内容
print(f"这是多组继承:{women.talk()}")          #此处回显的时父类P2的内容
#这里注意一个小细节,当我继承自多个父类,多个父类都有相同的方法。那我调用的时候会调用谁的呢?
#其实,是按照继承参数的顺序来的,谁排在第一个就调用谁的方法

2.3 多态

##多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)##
案例:
class Father():
        def __init__(self):
                pass

        def talk(self):
                return "讲中文:你好python"

class Son(Father):
        def son_talk(self):              
        """起新的方法名称不更改父类继承下来的方法"""
                return "我是儿子会讲英语:hello,world"

class Daughter(Father):
        def daughter_talk(self):
                return "我是女儿会讲俄语:Всем привет"

class Sister(Father):
        def sister_talk(self):
                return "我是妹妹会讲韩语:전 세계 여러분 안녕하세요"

son=Son()
daughter=Daughter()
sister=Sister()

print(f"父类--{son.talk()},子类:{son.son_talk()}")
####son.talk继承父类本身方法,将父类内容输出###
print(f"父类--{daughter.talk()},子类:{daughter.daughter_talk()}")
print(f"父类--{sister.talk()},子类:{sister.sister_talk()}")

####一个抽象的父类,再不更改父类中的方法拥有多个子类,叫做多态####
案例2class Father:
    def talk(self):
        return "我会讲话,我讲的是中文"

# 继承自爸爸类
class Me(Father):
    def talk(self):
        """直接继承修改父类方法,实现多态"""
        return "我是哥哥,我讲英语:hello,world"

# 继承自爸爸类
class Son(Father):
    def talk(self):
        return "我是弟弟,我讲俄语:Всем привет"

# 继承自爸爸类
class Sister(Father):
    def talk(self):
        return "我是妹妹,我讲韩语:전 세계 여러분 안녕하세요"

me = Me()
son = Son()
sister = Sister()

print(f"{me.talk()}")
print(f"{son.talk()}")
print(f"{sister.talk()}")

四.文件写入写出操作

4.1 基础知识

背景问题:
如果不加存储,程序关闭后数据就丢失了,下次打开程序需要重新获取/输入数据

数据存储到多个解决办法
将数据存储到纯文本文件中,例如txt文件
将数据存储到Excel文件中
将数据存储到数据库例如MySQL中

本章介绍最简单直接的文本文件的存储和读取
使用方法
来自爬虫、用户输入等外部数据,直接存储到文件中并保存
每次使用时,从文件读取已保存的数据,基于这些数据做处理
每次打开程序,都能读取到之前的数据,实现固化存储的效果

4.2 读取文件内容

"""
问题:
怎样读取文件的整个内容?
怎样按行读取数据?
怎样把所有行读取到一个列表?
"""
f = open("访客列表.txt",encoding="utf-8")
#f方法名称,open打开文件,如果目标文件包含中午需要设定字符集
conent = f.read()
#新变量为打开文件
print(conent);print("")
f.close()
#最后需要关闭文件不然可能数据丢失报错等问题

4.3 with读取文件

"""
怎样用with语法读取文件
"""
with open("访客列表.txt",encoding="utf-8") as fin:
#with为with是python关键字表示接管“资源自动关闭”等事宜.as起别名
    conent = fin.read()
    #.read内置函数就是读取文件内容
    print(conent)
#with的语法更加简洁会更多的使用.with读取文件后自动做关闭处理

4.4 逐行读取文件`

"""
按行读取文件
"""
with open("访客列表.txt",encoding="utf-8") as hh:
    for i in hh:
        i = i[:-1]
        #遵循左开右闭合原则,去掉文件列表最后的换行符
        #i = i.rstrip()
        #restrip会去除字符右边的空格
        print(i)

4.5 将行读取到列表中

"""
怎么把所有行读取到列表
fin.readlines()可以读取到列表
"""
with open("访客列表.txt",encoding="utf-8") as fin:
    lines = fin.readlines()
    lines = [x[:-1] for x in lines]
    #使用列表推导式,将内容进行修饰.去掉内置换行符
    print(lines)

4.6 文件读取练习

"""
新建一个文件,叫做 英汉词典.txt
每行是一个中英文对照,逗号分隔
例如:
sheep,羊
tiger,老虎
duck,鸭子
fish,鱼
用python读取文件,建立一个字典
key是英语词语,value是汉语词语
编写while循环
输入quit退出循环
输入英语,返回汉语
如果不存在,说没有这个词语
"""
#!/bin/env python
dict = {}
#定义空字典,用来接收文件中的内容
with open("英汉词典.txt",encoding='utf-8') as fin:
	for i in fin:
		i = i[:-1]
		#通过列表推导式去除换行符,读取文件默认生成的都为列表
		fieds = i.strip().split(",")
		#格式化内容为fieds
		if len(fieds) == 2:
			#fieds按照,号进行分割,那么读取每行文件,那么就会是俩个参数
			en,cn = fieds
			dict[en] = cn
		else:
			continue
	print(f"字典已生成:{dict}")
	#for循环读取文成后,循环次数为文件行数.打印生成的字典
while True:
	key = input("输入你要查询的单词对应的英文:")
	if key == "exit":
		break
	elif key not in dict.keys():
		#如果要查询的key不在字典的key中则无法查询
		print(f"没有找对{key}这个key!")
	else:
		print(f"你查询的{key}的内容为:{dict[key]}")

4.7 文件写出

"""
怎样把一个大字符串写到文件里面
怎样按行写出文件?
"""
with open("数字列表.txt", "w", encoding="utf8") as fout:
    ##"w"意思是write写文件的意思
    number = 1998
    fout.write(str(number))
    #fin.write可以写入内容
    # #注意,它只能写入字符串,数字不可以需要转换

4.8 按行写入文件

"""
怎样按行写出文件内容?
"""
with open("数字列表.txt",'w',encoding="utf-8") as new_fin:
    #w操作,每次会将输出文件清空再写入,无法追加
    for number in range(1,101):
        #输出1-100的值
        new_fin.write(str(number) + "\n")
        #\n换行符,即输出每个数字换行一次
        #输出完number对应数字后换行

with open("数字列表.txt",encoding="utf-8") as read_fin:
    for i in read_fin:
        i=i[:-1]
        print(i)

4.9 文件写入练习

"""
改进婚礼礼金程序
用”w”模式,打开一个文件“婚礼礼金.txt”文件
写一个while true
请输入“姓名 礼金”,例如“小明 1000”
将数据存储到文件中,每行一个数据
输入quit退出循环

退出循环后
重新读取文件,按行读取
把礼金读取到list中
输出list的统计数据,加和、最高、最低、平均值
"""
----方法1
with open("婚礼礼金.txt","w",encoding="utf-8") as gift:
    #此操作每次都会将文件进行格式化,也就是清空后在赋值
    while True:
        print("*" * 20)
        gift1 = input("请输入姓名礼金。用空格分隔:")
        if gift1 == "exit":
            break
        else:
            fieds = gift1.split()
            if len(fieds) == 2:
                #必须输入的内容为2个元素才能写出到文件中
                name,money = fieds
                gift.write(f"{name},{money}\n")
            else:
                continue
list = []
with open("婚礼礼金.txt",encoding="utf-8") as new_gift:
        for line in new_gift:
            line = line[:-1]
            #因为上方定义输出文件时,每行结尾加换行符,进行格式化
            fileds = line.split(",")
            #split函数拆分文本内容。默认以空格分隔
            if len(fileds) != 2:
                #判断列表内容是否为2个元素组成
                continue
                #如果是则丢弃这个数据,则脏数据
            else:
                name,money = fileds
                #否则就进行拆包,根据占位获取元素值
                money = int(money)
                #格式化money的数据类型,默认为str
                list.append(money)
                #将money追加到列表中
print(f"总金额:{sum(list)}")
print(f"最高金额:{max(list)}")
print(f"最小金额:{min(list)}")
print(f"平均金额:{sum(list) // len(list)}")


----方法2
filename = "婚礼礼金.txt"
with open(f"{filename}",'w',encoding='utf-8') as gift:
 while True:
    print("*" * 20)
    info = input("输入名称和礼金:")
    if  info == "exit":
        break
    else:
        fields = info.split()
        if  len(fields) == 2:
            name,money = fields
            #拆解list内容
        else:
            continue
        money = int(money)
        gift.write(f"{name},{money}\n")
        #只有满足条件(拆解内容为名称和礼金的)才会被输出到文件中.

with open(f"{filename}",encoding="utf-8") as gift:
    list = []
    for line in gift:
        line = line[:-1]
        fields = line.split(",")
        #此时文件内容为逗号分割开
        if len(fields) == 2:
            name,money = fields
            list.append(int(money))
        else:
            continue
print(f"总金额:{sum(list)}")
print(f"最高金额:{max(list)}")
print(f"最小金额:{min(list)}")
print(f"平均金额:{sum(list) / len(list)}")

五.文件路径

5.1.文件路径

"""
问题:读写文件的时候,怎样指定文件的路径?
问题:如果文件不在当前目录下,怎么指定电脑任何一个位置的路径?
"""
file_path ="英汉词典.txt"       #此为相对路径代表文件在统计目录下
file1_path = "E:\py-资料\py学习\文件处理操作\文件处理\hhh.txt"     #此为绝对路径

import os
print(os.path.exists(file_path))
print(os.path.exists(file1_path))
#返回ture和false

访问电脑的任何 一个文件的路径
绝对路径:从D:等盘符开始写,叫做绝对路径;
相对路径:如果不是从D:盘符开始写,那么默认从当前目录找文件和子目录,叫相对路径
# 因为\n、\t在python中有特殊含义
# 所以如果反斜线\分割路径,就前面加一个r,代表raw-string,不解析反斜线
file_path = r"D:\workbench\ant-python-zero\临时代码\数据目录\访客目录\访客列表.txt"

# 也可以直接改成正斜线,就不用考虑转义问题
file_path = "D:/workbench/ant-python-zero/临时代码/数据目录/访客目录/访客列表.txt"

5.2 练习

"""
新建一个python文件,叫做判断 “文件路径是否存在.py”

当前目录下新建一个txt文件,叫做 “文件路径是否存在.txt”
用os.path.exists方法,输出这个文件是否存在

在当前目录新建一个子目录,叫做“文件路径是否存在”,在目录中新建一个文件叫“测试路径.txt”
用os.path.exists方法,自己编写这个文件的路径,判断是否存在

在pycharm中,文件路径是否存在.txt 这个文件上,右键,复制路径,复制绝对路径
用反斜线的方式得到文件路径,自己加r前缀,用os.path.exists方法,输出这个文件是否存在

随便写一个文件名字,用os.path.exists方法,输出这个文件是否存在
"""
import os

file = "文件路径是否存在.txt"
print(os.path.exists(f"{file}"))
new_file = "文件处理/hhh.txt"
print(os.path.exists(f"{new_file}"))
new_file_path = r"E:\py-资料\py学习\第一章-基础\input和while死循环\while&input练习.py"
print(os.path.exists(new_file_path))

5.3 json文件格式

背景问题:
前面的办法,是每行的方式写一个数据
有没有办法,把python的list、dict这样的数据结构,直接存到.txt文件中,实现格式化保存和读取?
#json是一个这样的库和格式:
#data可以是str、list、dict
#import json,引入这个库
#json.dumps(data),可以把python的对象,转换成一个字符串,你可以把这个字符串写到文件
#json.loads(str),可以把大字符串读取成python对象,例如成为python的list和dict
-----code
import  json
data = [1,2,3,4,5]
#定义列表形式的数据内容
new_date = json.dumps(data)
##json.dumps(data),可以把python的对象,转换成一个字符串,你可以把这个字符串写到文件
#定义新的内容为json格式化后的文件
print(new_date,type(new_date))
#data数据形式转换为了str,将对象转换为了字符串
data = {
    "xiaoming":[1,2,3,4],
    "xiaowang":[1,3,5,7],
    "xiaoli":[2,4,6,8],
}
new_date = json.dumps(data)
print(new_date,type(new_date))
#data数据形式转换为了str,将对象转换为了字符串
#数据的展示不会变

data_str = """
{"xiaoming":[1,2,3,4,5],"xiaowang":[1,3,5,7],"xiaoli":[2,4,6,8]}
"""
#"""输入数据形式的内容"""".type为字符串类型
new_date = json.loads(data_str)
#将字符串转换为根据内容的数据类型
print(new_date,type(new_date))

--result
[1, 2, 3, 4, 5] <class 'str'>
{"xiaoming": [1, 2, 3, 4], "xiaowang": [1, 3, 5, 7], "xiaoli": [2, 4, 6, 8]} <class 'str'>
{'xiaoming': [1, 2, 3, 4, 5], 'xiaowang': [1, 3, 5, 7], 'xiaoli': [2, 4, 6, 8]} <class 'dict'>

5.4 json格式练习

"""
学生成绩录入与保存程序
新建代码“成绩录入json.py”
加载文件的词典文件:成绩录入json.txt
如果文件存在,加载到字典 grade_dict
如果文件不存在,新建一个成绩字典,例如grade_dict = {}
while true,输入多个成绩
每行成绩,形如“小明 80”、“小李 90”
使用str.split拆分成name和grade
存入字典中,name是Key,grade是Value
输入quit,退出循环
将grade_dict更新保存到json文件中:成绩录入json.txt
类似用f.write(json.dumps(grade_dict))即可
"""
import os
import json
import time
file = "json.txt"
grade_dict = {}
if os.path.exists(file):
    with open(f"{file}",encoding="utf-8") as f1:
        grade_dict = json.loads(f1.read())
        #将文本中的内容json格式化后输出为python的数据类型
    print("准备读取文件内容!")
else:
    print("文件不存在!!")

print("读取文件后的内容")
for key,value in grade_dict.items():
    print(f"名字:{key},分数:{value}")
    time.sleep(0.5)

while True:
    print("*" * 20)
    info = input("输入姓名和成绩:")
    if  info == "exit":
        break
    else:
        fieds = info.split()
        if  len(fieds) != 2:
            continue
        else:
            name,grade = fieds
            grade = int(grade)
            grade_dict[name] = grade

with open(f"{file}","w",encoding="utf-8") as f1:
    #数据会被更新和写入追加
     f1.write(json.dumps(grade_dict))
##json.dumps(data),可以把python的对象,转换成一个字符串,你可以把这个字符串写到文件

5.4 异常处理Exception

"""
什么是异常? 
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
 一般情况下,在Python无法正常处理程序时就会发生一个异常。 
异常是Python对象,表示一个错误。 
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。 
"""
"""
你会在运行代码时,遇到这种类似的报错:
Exception	常规错误的基类
ZeroDivisionError	除(或取模)零(所有数据类型)
IOError	输入/输出操作失败 
ImportError	导入模块/对象失败 
KeyError	映射中没有这个键
SyntaxError	Python语法错误
ValueError	传入无效的参数 
"""

5.5 案例

grades = []
while True:
    grade = input("输入成绩:")
    try:
        grade = int(grade)
    except Exception as e:
        print("你输入的信息有误,请检查后输入.报错信息为:",e)
        break
    grades.append(grade) #如果上方直接报错,那么程序是无法到达这一步,也就是append内容到列表中
print(grades)

---stdion
输入成绩:199
输入成绩:ee
你输入的信息有误,请检查后输入.报错信息为: invalid literal for int() with base 10: 'ee'
[199]


案例2try:
    with open("123123.txt",encoding='utf-8') as f:
        print(f.read())
        #打印读取的内容
except Exception as e:
    print("读取文件错误,错误信息为:",e)
   
   输出为: 
   读取文件错误,错误信息为: [Errno 2] No such file or directory: '123123.txt'

5.6 练习1

"""
升级成绩录入程序:
while true录入姓名和成绩,存入“学生成绩带异常处理.txt”文件
增加成绩不是数字的异常处理
如果输入内容抛异常,不要暂停程序;
提示用户“发生的异常是什么”
提示“当前的信息是什么,继续可以继续录入”
一个经验:如果捕获了异常,一定至少打印点日志,方便排查问题
不然会出现情况:程序不符合预期(例如输入了成绩为abc不生效也不提示),不知道哪里有问题
"""
file = "学生成绩带异常处理.txt"
with open(f"{file}","w",encoding="utf-8") as f:
    while True:
        info = input("输入姓名和成绩:")
        try:
            if  info == "exit":
                break
            name,grade = info.split()
            #如果输入的信息不够拆包,会报错
            grade = int(grade)
            #拆出来的int不是整形会报错
        #tab整体向后缩进,shift tab向左缩进
        except Exception as e:
            print("格式错误,错误信息为:", e, f"你输入的是:{info}")
            continue
            #如果是脏数据则提前结束循环。
        f.write(f"{name},{grade}\n")
       #写在while循环内,成功一次写入一次.防止数据丢失

六.开源技术库

6.1 安装技术库

1.win + r 打开cmd
2.复制python虚拟环境绝对路径
3.C:\Users\xxq\AppData\Local\Programs\Python\Python37\python.exe -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
#安装pandas库
"""
其中:
C:\Python310\python.exe:来自你的pycharm运行代码的python.exe的路径
-m:意思是要使用后面pip这个模块,m是module的意思
pip:是python安装软件的一个命令,可以从网上下载和安装包
install:意思是安装包的意思
-i https://pypi.tuna.tsinghua.edu.cn/simple:意思是国内有一个技术库的地址,用这个安装更快(国内地址的软件和国外的一样,每5分钟同步一次)
some-package:要安装的包,例如requests
其中 -i https://pypi.tuna.tsinghua.edu.cn/simple 可以省略,用的就是国外的包
"""

6.2 爬虫requests介绍

requests是Python的一个开源类库
用代码请求网页、接口,获取返回的数据
--案例
import requests
url = "http://qqkj.gitlab.com/"
r = requests.get(url)
print(r.status_code)
print(r.text)
##首先要确保当前环境存在requests库

--练习
import requests
url = "http://qqkj.gitlab.com/"
r = requests.get(url)
print(r.status_code)
#返回状态码
info = r.text
#info为url对应内容
with open("antpython.html","w",encoding="utf-8") as file:
    file.write(str(info))
    #打开文件并写入,写入内容为info

6.3 数据分析pandas

"""
Pandas:
Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
提供高性能、易于使用的数据结构和数据分析工具。
Pandas 可以对各种文件格式比如 CSV、JSON、SQL、Excel 导入/导出数据。
Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。
Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。
"""
--案例
data = [
    ["s001", "小明", 89],
    ["s002", "小张", 90],
    ["s003", "小找", 66],
]
#格式为二维行列表的格式

import pandas as pd
#导入pandas模块别名为pd
df = pd.DataFrame(data,
    #DataFrame放数据
    columns=["学号", "姓名", "成绩"])
    #coulemns放列名
df.to_excel("学生成绩excel文件.xlsx")
#导出文件名和格式


--练习
import pandas as pd
datas = []
while True:
    print("*" * 20)
    info = input("输入姓名和礼金:")
    try:
        if  info == "exit" or info == "quit":
            break
        fields = info.split()
        #用fields来接收拆包内容。方便判断
        if  len(fields) == 2:
            name,money = fields
            datas.append([name,money])
            #append追加为列表嵌套列表,组成二维列表
    except Exception as e:
         print("错误信息为:",e,f"你输入的是:{info}.")
         continue
        #如果抛错则不要此处的数据
print(datas)
df = pd.DataFrame(datas,columns=["姓名","礼金"])
#df为变量名,内容为pd(pandas),dataframe源数据,columns列
df.to_excel("婚礼礼金.xlsx",index=False)
#输出为excel文件,且生成文件中不要序号列

6.4 Falak网页开发

flask
一个轻量级Web应用框架,非常适用于开发小型网站,以及开发web服务的API;
--code
from flask import  Flask
#导入falsk框架的Flask类
app = Flask("我的网页")
#创建服务器对象
@app.route("/qqkj")
#声明访问的url
def hello():
    return "这是强强科技的首页!!!"
#返回访问url的内容
app.run()
#运行服务器,浏览器就可以访问
--访问http://127.0.0.1:5000/qqkj即可.默认falsk端口为5000
        
--练习题
"""
新建一个自己的英汉翻译词典文件“英汉翻译.txt”,复制过去,包含如下内容:
sheep,羊
tiger,老虎
duck,鸭子
fish,鱼

制作一个网页返回
URL地址设置成:/english
读取文件内容:f.read()
返回给网页前端

启动服务器
打开网页,展示词典数据
"""
from flask import Flask

app = Flask("动物网站")
#app的名称
@app.route("/english")
#设置路由
def hello():
    with open("英汉翻译.txt",encoding="utf-8") as f:
        return f.read()
app.run()
#运行服务器,根据--http://127.0.0.1:5000/english访问浏览器即可

6.5 linux运行request等模块

1.[root@client Advanced]# yum -y install python3-pip
#安装pip工具,可以下载第三方模块
2.[root@client Advanced]# pip3 install requests
#下载requests爬虫模块
3.[root@client Advanced]# python3 pachong.py
#用python3执行带有request模块的文件
4.[root@client Advanced]# pip3 list
#列出安装了的第三方模块
5.[root@client ~]# pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
#指定清华源安装pandas模块
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维神经科主任

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值