python基础学习

第一阶段

你好 python

阶段、章节、小节

初识python

底层:C++ 性能

上层:python 简单高效

什么是编程语言

人类语言翻译成计算机能够听懂的语言→人类与计算机进行交流

image-20250129202419725

计算机只认识0和1的二进制

由程序(解释器or翻译器)将代码翻译为二进制→计算机get了

(思考:为什么存在十进制呢?)

为什么不直接把中文翻译为二进制?

image-20250129202824404

人类的语言有不同的语气、表达,翻译起来更为复杂。

Python环境安装

Python官方网站地址:python.org

image-20250129203446138

image-20250129203504208

image-20250129203529765

image-20250129203549995

image-20250129203610564

安装完成,验证安装:win-cmd-python

第一个Python程序

image-20250129205202000

image-20250129205212291

cmd→python→出现三个向右的箭头,表示可以写代码→回车是运行程序

命令指示符:win+r

python解释器

image-20250129210306157

因为计算机只能读懂0和1,配置环境,本质上就是安装python解释器程序

python解释器:计算机程序,用来翻译python代码,并提交给计算机执行。

解译器功能:1.翻译代码 2.提交给计算机运行

python解译器的位置:

image-20250129210711800

.py文件是什么?python语言的代码文件,里面记录了python的代码。

python开发环境

python开发环境

(也就是在哪写)

image-20250129212253215

下载

www.jetbrains.com

image-20250129212832838

community社区版

PyCharm文件管理

pycharm是以工程做基本的管理单位的

image-20250129214513302

venv:虚拟环境

base conda:人工智能相关的包

custom envrionment 自定义环境

(为什么在.venv界面下,新建文件会出现一个外部库?)

鼠标滚轮改变字号:

image-20250130143715941

pycharm常用快捷键:

image-20250130154126628

python基础语法

字面量

含义:在代码中,被写下来的固定的值

image-20250131175235296

整数(int) 现实写法一致

浮点数(float) 现实写法一致

字符串(string)字符串需用双引号””包围

注释

含义:对代码解释说明的文字

分类:单行注释 #

​ 多行注释:一对三个双引号 “”” 多行注释”””

image-20250131185830376

变量

image-20250131190528720

1.变量就是在程序运行时,记录数据用的

2.特征是变量的值可以改变

3.格式:变量名称=变量值

4.print可以输出多份内容

5.做减法(+、-、*、/)(变量记录数据,可以重复使用它,尤其是数据量极大时,能够减少工作量)

数据类型

三类数据类型:string (str)、int、float

type()语句得到数据的类型

1.print(type()),直接输出类型信息

2.用变量存储type()的结果(返回值)

image-20250131200636159

3.查看变量中存储的数据类型

image-20250131200802354

数据类型转换

# 将数字类型转换成字符串
num_str = str(666)
print(type(num_str), num_str)

float_str = str(13.14)
print(type(float_str), float_str)
# 将字符串转换成数字
num1 = int("11")
print(type(num1), num1)

num2 = float("11.345")
print(type(num2), num2)

# 错误示例,想要将字符串转换成数字,必须要求字符串内的内容都是数字
# num3 = int("黑马程序员")
# print(type(num3), num3)

# 万物皆可转字符串,只要加上双引号就可以,但是字符串不可以转数字

# 整数转浮点数
float_num = float(11)
print(type(float_num), float_num)

# 浮点数转整数
int_num =int (11.234)
print(type(int_num), int_num)

标识符

在编程的时候所使用的一系列名字,用于给变量、类、方法命名

1.内容限定(英文、中文<不推荐>、数字<不可以用在开头>、下划线_)

2.大小写敏感

3.不可使用关键字

image-20250210152937447

变量的命名规范:

1.见名知意

2.下划线命名法

3.英文字母全小写

运算符

image-20250210154059690

赋值运算符

image-20250210154908512

例子:

"""
演示Python中各类运算符
"""
# 算术运算符
print("1+1=" , 1+1)
print("2-1=" , 2-1)
print("3*3=" , 3*3)
print("9/3=" , 9/3)
# 整除
print("9//2=" , 9//2)
# 取余
print("13%4=" , 13%4)
# 指数
print("2**4=" , 2**4)

# 赋值运算符
num = 1*2+4

# 复合赋值运算符
# += 将右侧的值加到左侧的变量上,然后将结果重新赋值给左侧的变量
num = 1
num +=1 # num = num + 1
print("num += 1:",num)

# -= 将右侧的值减到左侧的变量上,然后将结果重新赋值给左侧的变量
num -=1 # num = num - 1
print("num -= 1:",num)

# *=
num *= 4 # num = num * 4
print("num *= 4:",num)

num /= 2 # num = num / 2
print("num /= 2:",num)

num = 3
num %= 2
print("num %= 2:",num)

num **= 2
print("num **2:",num)

num = 9
num //= 2  # 将num整除2 结果赋值给num,也就是num//2=4
print("num //2:",num)

字符串拓展

字符串的三种定义方式

image-20250210162432668

如果想要定义字符串本身,是包含:单引号、双引号自身呢?如何写?

单引号定义法,可以内含双引号

双引号定义法。可以内含单引号

可以使用转移字符(左斜杠)来将引号解除效用,变成普通字符串)

  1. 字符串拼接

  2. 字符串格式化

  3. 格式化精度控制

  4. 字符串格式化方式2

  5. 对表达式进行格式化

字符串拼接

image-20250210164112902

image-20250210165047202

字符串格式化

字符串格式化

image-20250210165225824

数字类型占位

image-20250210165341419

image-20250210170139759

格式化的精度控制

image-20250210171056689

字符串格式化的方式2

字符串格式化-快速写法

image-20250210172450411

对表达式进行格式化

数据输入(input语句)

image-20250210175901572

总结

image-20250210181114198

Python的判断语句

布尔类型和比较运算符

image-20250210182721139

比较运算符

image-20250210182840566

image-20250210184508451

if语句的基本格式

if的注意点

image-20250210194158180

总结

image-20250210194224539

案例

"""
成年人判断
"""

# 通过input语句,获取键盘输入,为变量age赋值(注意转换数字类型)。因为input所有输出内容都是字符串
age = int(input("请输入你的年龄:"))

# 通过if判断是否是成年人,满足条件则输出提示信息
if age >= 18:
    print("欢迎来到黑马儿童游乐场,儿童免费,成人收费")
    print("您已成年,游玩需要补票10元")
print("祝您游玩愉快")

if else组合判断语句

image-20250210195818500

总结

image-20250210200342727

案例

"""
我要买票吗
"""
print("欢迎来到黑马动物园")
height = int(input("请输入你的身高(cm):"))
if height > 120:
    print("您的身高超出120cm,游玩需要购票,10元")
else:
    print("您的身高未超过120cm,可以免费游玩")

print("祝您游玩愉快")

if _elif_else组合使用的语法

多个条件

image-20250210201445583

课程讲解案例

"""
组合用法
"""
height = int(input("请输入你的身高(cm):"))
vip_level = int(input("请输入你的VIP等级(1-5):"))
day = int(input("请告诉我今天是几号:"))

# 通过if判断,可以使用多条件判断的语法

if height < 120:
    print("身高小于120cm,可以免费")
elif vip_level >3:
    print("vip级别大于3,可以免费")
elif day ==1:
    print("今天是1号免费日,可以免费")
else:
     print("不好意思,条件都不满足,需要买票10元")

# 节省代码量
print("欢迎来到黑马动物园")
if int(input("请输入你的身高(cm):")) < 120:
    print("身高小于120cm,可以免费")
elif int(input("请输入你的VIP等级(1-5):")) > 3:
    print("vip级别大于3,可以免费")
elif int(input("请告诉我今天是几号:")) == 1:
    print("今天是1号免费日,可以免费")
else:
     print("不好意思,条件都不满足,需要买票10元")

image-20250210203644844

练习案例

image-20250210204821262

"""
猜猜心里数字
"""
# 定义一个变量
num = 6

if (int(input("请输入第一个猜想的数字:"))) == num:
    print("恭喜第一次猜对了")
elif (int(input("猜错了,再猜一次:"))) == num:
    print("猜对了")
elif (int(input("猜错了,再猜一次:"))) == num:
    print("恭喜,最后一次猜对了")
else:
    print("sorry,猜错了")

判断语句的嵌套

自由组合的形式,分不同层次的形式就是判断语句的嵌套了

image-20250210205444964

总结

image-20250210211951150

判断语句的综合案例

image-20250210212217461

"""
终极猜数字
"""
# 1.构建一个随机的数字变量
import random
num = random.randint(1,10)

guess_num = int(input("输入你要猜测的数字:"))

# 2.通过if判断语句进行数字的猜测
if guess_num == num:
    print("恭喜,第一次就猜对了")
else:
    if guess_num > num:
        print("你猜测的数字大了")
    if guess_num < num:
        print("你猜测的数字小了")
    guess_num = int(input("输入你要猜测的数字:"))
    if guess_num == num:
            print("恭喜,第二次猜对了")
    else:
        if guess_num > num:
            print("你猜测的数字大了")
        if guess_num < num:
            print("你猜测的数字小了")
        guess_num = int(input("输入你要猜测的数字:"))
        if guess_num == num:
             print("恭喜你,第三次猜对了")
        else:
             print("你都猜错了" )

Python循环语句

image-20250210214625957

while循环的基础语法

image-20250210215019653

image-20250210215817711

练习案例没审好题,以为是循环列出1到100的值,但其实是求和)

image-20250210220929690

案例

image-20250210221126410

"""
猜数字
"""
# 获取范围在1-100的随机数字
import random
num = random.randint(1,100)

# 定义一个变量,记录总共猜测了多少次
count = 0
# 通过一个布尔类型的变量,做循环是否继续的标记

flag = True
while flag:
    guess_num=int(input("请输入你猜测的数字"))
    count +=1
    if guess_num == num:
        print("你猜对了")
        flag = False
    else:
        if guess_num > num:
            print("你猜的大了")
        else:
            print("你猜的小了")

print(f"你总共猜测了{count}次")

while循环的嵌套使用

image-20250211124941903

注意点

image-20250211130359197

image-20250211130436705

while循环案例—九九乘法表

print输出不换行

image-20250211130815530

制表符

image-20250211131008715

九九乘法表

# print("hello",end='')
# print("world",end='')
# print("hello\tworld")
# print("itheima\best")

"""
九九乘法口诀
"""
# 定义外层循环的控制变量
i = 1
while i <= 9:
    # 定义内层循环的控制变量
    j = 1
    while j <= i:
        print(f"{j} * {i} = {j * i}\t",end='')
        j += 1

    i += 1
    print()  # print空内容,就是输出一个换行

for循环的基础语法

for循环:对待办事项一个一个处理

image-20250211133250180

总结

image-20250211134110493

range 语句

image-20250211135730330

range语句

image-20250211135904942

image-20250211140050090

总结

image-20250211141050549

for循环临时变量作用域

总结

image-20250211150435344

for循环的嵌套使用

"""
嵌套应用for循环
"""
# 坚持表白100天,每天都送10朵花

i = 1
for i in range(1,101):
    print(f"今天是跟小美表白的第{i}天,加油坚持")
    # 内层循环
    for j in range(1,11):
        print(f"给小美送的第{j}朵玫瑰花")
    print("小美,我喜欢你")
print(f"第{i}天,表白成功")

for循环打印九九乘法表

"""
for循环打印九九乘法表
"""
# 外层循环控制行数
for i in range(1,10):
    # 定义内层循环控制变量,为什么要+1呢?因为range语句,是不包含右括号旁边的数值的,在这里也就是不包含i+1
    for j in range(1,i+1):
        print(f"{j}*{i} = {j*i}\t",end='')
    # 外层循环可以通过print输出一个回车符
    print()

continue和break

image-20250211165553529

continue循环

image-20250211165651203

break循环

image-20250211171413698

两者都只在循环内使用

image-20250211172129744

循环综合案例

image-20250211172301467

# 某公司,账户余额有1W元,给20名员工发工资。
# 员工编号从1到20,从编号1开始,依次领取工资,每人可领取1000元领工资时,财务判断员工的绩效分(1-10)(随机生成),如果低于5,不发工资,换下一位
# 如果工资发完了,结束发工资。

# 定义账户余额变量
money = 10000

# for循环给员工发工资,随机生成绩效
for i in range(1,21):
    import random
    score = random.randint(1,10)
    if score < 5:
        print(f"员工{i}绩效分{score},不满足,不发工资,下一位")
        # continue跳过发放
        continue
    # 要判断余额足不足
    if money >= 1000:
        money -= 1000
        print(f"员工{i},满足条件发放工资1000,公司账户余额{money}")
    else:
        print(f"余额不足,当前余额:{money}元,不足以发放工资,不发了,下个月发")
        break

python函数

函数的初体验

函数:可以得到一个针对特定需求、可供重复利用的代码块,提高程序复用性,减少重复性代码,提高开发效率。

image-20250211180026358

函数的基础定义语法

image-20250211195931322

image-20250211195949222

函数的传入参数

传入参数的作用

image-20250211200615783

语法解析

image-20250211201232540

image-20250211201517948

参数练习案例

image-20250211203036498

"""
升级版自动查核酸
"""

def check(num):
    print("欢迎来到黑马程序员!请出示您的健康码以及72小时核酸证明,并配合测量体温!")
    if num <= 37.3:
        print(f"体温测量中,您的体温是:{num},体温正常请进")
    else:
        print(f"体温测量中,您的体温是:{num},需要隔离")
check(38)

函数的返回值定义语法

image-20250211203333196

返回值语法

image-20250211203409573

总结

image-20250211210313329

函数的返回值之None类型

None含义

image-20250211210946698

None应用场景(3个)

image-20250211212044444

总结

image-20250211213240122

函数的说明文档

image-20250211214237977

函数的嵌套调用

定义

image-20250211214345682

执行过程

image-20250211214956382

总结

image-20250211215042028

变量在函数中的作用域

局部变量

image-20250211215329580

全局变量

image-20250211215724359

总结

image-20250211220343579

函数综合案例

image-20250212155555939

image-20250212155619040

"""
函数综合案例 控制台ATM
"""
# 定义全局变量 money name
money = 5000000
name = None
# 要求客户输入姓名
name = input("请输入您的姓名")

#定义查询余额函数
def query(show_header):
    if show_header:
        print("----------查询余额----------")
    print(f"{name},您的余额剩余:{money}")

# 定义存款函数
def saving(num):
    global money  # money 在函数内部定义为全局变量
    money += num
    print("----------存款----------")
    print(f"{name},您好,您存款{money}元成功")

    # 通过query函数查询余额
    query(False)


# 定义取款函数
def get_money(num):
    global money
    print("----------取款----------")
    print(f"周杰伦,您好,您取款{num}元成功")

    # 通过query函数查询余额
    query(False)


# 定义主菜单函数
def main():
    print("----------主菜单----------")
    print(f"{name},您好,欢迎来到黑马程序员ATM,请选择操作")
    print("查询余额\t[输入1]")
    print("存款\t\t[输入2]") # 通过\t制表符对齐
    print("取款\t\t[输入3]")
    print("退出\t\t[输入4]")
    return input("请输入你的选择")


# 退出(设置无限循环,确保程序不退出)
while True:
    keyboard_input = main()
    if keyboard_input == "1":
        query(True)
        continue # 通过continue继续下一次循环,一进来就是进入了主菜单
    elif keyboard_input == "2":
        num = int(input("您想要存多少钱?请输入:"))
        saving(num)
    elif keyboard_input == "3":
        num = int(input("您想要取多少钱?请输入:"))
        get_money(num)
        continue
    else:
        print("程序退出了")
        break

python数据容器

数据容器入门

数据容器

image-20250212165958994

总结

image-20250212170057226

数据容器-列表

list列表的定义语法

列表定义

image-20250213140004467

案例演示

image-20250213140145697

总结

image-20250213164457105

列表的下标索引

从列表中取出想要取的元素

语法:列表[下标索引]

image-20250213164809785

反向取值元素

image-20250213164924587

嵌套索引

# 取出嵌套列表的元素
my_list = [(1, 2, 3), [4, 5, 6]]
print(my_list[1][1])

总结

image-20250213170104223

列表的常用操作方法

列表常用操作

image-20250213171608354

列表的查询功能

将函数定义为class(类)的成员,函数就被称之为:方法

image-20250213171928376

详细操作方法:

1.查找某元素在列表内的下标索引

语法:列表.index(元素)

index = mylist.index("itheima")
print(f"itheima在列表中的下标索引值是:{index}")

index就是列表对象(变量)内置的方法(函数)

2.修改特定下标索引的值

语法:列表[下标] = 值

mylist = ["itcast","itheima","python"]
mylist[0] = "传智教育"
print(f"列表被修改元素后,结果是:{mylist}")

3.插入元素

语法:列表.insert(下标,元素),在指定的下标位置,插入指定的元素

mylist = ["itcast","itheima","python"]
mylist.insert(1,"best")
print(f"列表插入元素后,结果是:{mylist}")

5.追加元素

①语法:列表.append(元素),将指定元素,追加到列表尾部

mylist = ["itcast","itheima","python"]
mylist.append("黑马程序员")
print(f"列表在追加了元素后,结果是:{mylist}")

②语法:列表extend(其它数据容器), 将其它数据容器的内容取出,依次追加到列表尾部

mylist2 = [1,2,3]
mylist.extend(mylist2)
print(f"列表在追加了新的列表后,结果是:{mylist}")

4.删除元素

  • del列表[下标]

python
mylist = ["itcast","itheima","python"]
del mylist[2]
print(f"列表删除元素后的结果是:{mylist}")

  • 列表.pop(下标)

python
mylist = ["itcast","itheima","python"]
mylist.pop(0)
element = mylist.pop(0)
print(f"通过pop方法取出元素后列表内容:{mylist},取出的元素师:{element}")

  • 删除某元素在列表中的第一个匹配项:列表.remove(元素)

python
mylist = ["itcast","itheima","itcast","itheima","python"]
mylist.remove("itheima")
print(f"通过remove方法移除元素后,列表的结果是:{mylist}")

  • 清空列表内容,语法:列表.clear()

python
mylist.clear()
print(f"列表被清空了,结果是:{mylist}")

5 统计某元素在列表内的数量

语法:列表.count(元素)

mylist = ["itcast","itheima","itcast","itheima","python"]
count = mylist.count("itheima")
print(f"列表中的itheima的数量是:{count}")

6 统计列表内,有多少元素

语法:len(列表)

mylist = ["itcast","itheima","itcast","itheima","python"]
count = len(mylist)
print(f"列表的元素数量总共有:{count}")

image-20250215172613842

说明-格局

image-20250215172824342

列表的特点

image-20250215172918734

列表的循环遍历

列表的遍历-while循环

遍历:将容器内的元素依次取出进行处理的行为

image-20250215175646348

列表的遍历-for循环

image-20250215181654697

两者对比

image-20250215182120850

总结

image-20250215182137036

课后练习(第一次独立写那么长的代码,疯狂鼓掌,另感谢gpt的特别出席!)

"""
列表的遍历应用:取出列表内的偶数
"""
# 定义一个列表
mylist = [1,2,3,4,5,6,7,8,9,10]
mylist2 =[]

# while循环
index = 0
def list_while_func():

    """
    使用while循环遍历列表的演示函数
    :return: None
    """
    global index
    while index < len(mylist):
        element = mylist[index]
        if element % 2 == 0:
            mylist2.append(element)

        index += 1



# for 循环
def list_for_func():
    """
      使用for循环遍历列表的演示函数
      :return: None
      """
    for element in mylist:
        if element % 2 == 0:
            mylist2.append(element)



# 清空 mylist2 后运行两个函数
mylist2.clear()
list_while_func()
# 在调用完 while 循环后,打印结果
print(f"通过while循环,从列表:{mylist}中取出偶数,组成新列表{mylist2}")

mylist2.clear()  # 清空 mylist2,避免重复
list_for_func()
print(f"通过for循环,从列表:{mylist}中取出偶数,组成新列表{mylist2}")

元组的定义和操作

image-20250218100221699

元组定义

image-20250218100329582

元组特点

image-20250218142409494

总结

练习

image-20250218142545670

字符串的定义和操作

字符串

image-20250218150122171

字符串的常用操作

image-20250218151205424

字符串的分割:字符串.split(分隔符字符串)

注意:字符串本身不变,而是得到一个列表对象

# split方法  分隔字符串后,得到一个新的列表
my_str = "hello python itheima itcast"
my_str_list = my_str.split(" ")
print(f"将字符串{my_str}进行split切分后得到:{my_str_list},类型是:{type(my_str_list)}")
# 结果:将字符串hello python itheima itcast进行split切分后得到:['hello', 'python', 'itheima', 'itcast'],类型是:<class 'list'>

image-20250218151546621

字符串的规整操作

image-20250218152255268

# strip方法 字符串的规整,自动去掉字符串前后的空格
my_str = " itheima and itcast "
new_my_str_list = my_str.strip()  # 不传入参数,取出首尾空格
print(f"字符串{my_str}被strip后,结果是{new_my_str_list}")

字符串常用操作

image-20250218153512270

字符串的遍历

"""
字符串遍历
"""
my_str = "黑马程序员"
index = 0
while index < len(my_str):
    print(my_str[index])
    index += 1

my_str = "黑马程序员"
for i in my_str:
    print(i)

字符串的特点

image-20250218154951593

总结

image-20250218155034084

数据容器(序列)切片

定义

image-20250218202923301

切片定义

从一个序列中,取出一个子序列

语法:序列[起始下标:结束下标:步长]

image-20250218204026556

"""
对序列进行切片,从1开始,4结束,步长1
"""
# 对列表list进行切片,从1开始,4结束,步长1

my_list = [0, 1, 2, 3, 4, 5, 6]
result1 = my_list[1:4]
print(f"结果1:{result1}")

# 对元组tuple进行切片,从头开始,到最后结束,步长1
my_tuple = (0, 1, 2, 3, 4, 5, 6)
result2 = my_tuple[:]   # 起始和结束不写表示从头到尾,步长为1
print(f"结果1:{result2}")

# 对字符串str进行切片,从头开始,到最后结束,步长2
my_str = "01234567"
result3 = my_str[::2]
print(f"结果1:{result3}")

# 对str进行切片,从头开始,到最后结束,步长-1
my_str = "01234567"
result4 = my_str[::-1]   #-1表示从后向前取  等于将序列翻转了
print(f"结果1:{result4}")

# 对列表进行切片,从3开始,到1结束,步长-1
my_list = [0, 1, 2, 3, 4, 5, 6]
result5 = my_list[3:1:-1]
print(f"结果1:{result5}")

# 对元组进行切片,从头开始,到尾结束,步长-2
my_tuple = (0, 1, 2, 3, 4, 5, 6)
result6 = my_tuple[::-2]
print(f"结果1:{result6}")

总结

练习案例:序列的切片实践

image-20250218210306381

"""
序列的切片实践
"""

# 请使用学过的任何方式,得到"黑马程序员”
my_str = "月过万薪, 员序程马黑来, nohtyp学"

# 可用方式参考:
# 1、倒序字符串,切片取出或切片取出,然后倒序
# 2、split分隔","replace替换"来"为空,倒序字符串

# 倒序字符串,切片取出
result1 = my_str[::-1][9:14]
print(result1)

# 切片取出,然后倒序:从10开始到4结束,步长为-1 ? 也是可以滴 反向步长的切片可以从右往左取字符串
# result = my_str[9:4:-1]
# print(result)

result3 = my_str[5:10][::-1]
print(result3)


# split分隔","replace替换"来"为空,倒序字符串
my_str = "月过万薪, 员序程马黑来, nohtyp学"
result4 = my_str.split(", ")[1].replace("来","")[::-1]
print(result4)

集合的定义和操作

为什么使用集合(set)?

不支持元素重复,内容无序→所以不支持下标索引

image-20250219155734952

# 定义集合
my_set = {"传智教育","黑马程序员","itheima","传智教育","黑马程序员","itheima","传智教育","黑马程序员","itheima"}
my_set_empty = set()   # 定义空集合
print(f"my_set的内容是:{my_set},类型是:{type(my_set_empty)}")
print(f"my_set_empty的内容是:{my_set_empty},类型是:{type(my_set_empty)}")

集合的常用操作-修改

  • 取出2个集合的差集

image-20250221203607264

  • 消除2个集合的差集

image-20250221203719057

  • 合并

image-20250221204307395

集合常用功能

image-20250221205619719

集合的特点

image-20250221205851089

总结

image-20250221210007149

image-20250221210017775

"""
信息去重
"""

my_list = ['黑马程序员','传智播客','黑马程序员','传智播客',
           'itheima','itcast','itheima','itcast','best']

# 定义一个空集合
my_set = set()
for element in my_list:
    # 直接将元素 element 添加到集合中,而不是将它包装在一个新的集合里
    my_set.add(element)
print(f"有列表{my_list}")
print(f"存入集合后的结果:{my_set}")

数据容器-字典

字典的定义

为什么使用字典?

image-20250222143850442

字典的定义

存储的元素:键值对

字典数据的获取

image-20250222145140657

字典的嵌套

image-20250222145735424

总结

字典的key不可以重复

image-20250222150701381

字典的常用操作

常用操作

image-20250222153235527

"""
演示字典的常用操作
"""

my_dict1 = {"王力宏": 99, "周杰伦": 88, "林俊杰": 77}
# 新增元素  字典.[key] =  [value]
my_dict1["张信哲"] = 66
print(f"字典经过新增元素后,结果是:{my_dict1}")
# 更新元素  新增和更新两者语法一样,主要看key的值
my_dict1["周杰伦"] = 32
print(f"字典经过新增元素后,结果是:{my_dict1}")


# 删除元素  字典.pop()
score = my_dict1.pop("周杰伦")
print(f"字典移除了一个元素后,结果是:{my_dict1},周杰伦的考试分数是{score}")



# 清空元素  clear
my_dict1.clear()
print(f"字典被清空了,内容是{my_dict1}")


# 获取全部的key  字典.keys()

my_dict1 = {"王力宏": 99, "周杰伦": 88, "林俊杰": 77}
keys = my_dict1.keys()
print(f"字典的全部keys,是{keys}")

# 遍历字典:只支持for循环
# 方式1:通过获取全部的key来完成遍历  也就是先 获取全部的key,再用for循环遍历这个全部的keys
for key in keys:
    print(f"字典的key是:{key}")
    print(f"字典的value是:{my_dict1[key]}")
# 方式2 :直接对字典进行for循环,每一次循环都是直接得到key
for key in my_dict1:
    print(f"字典的key是:{key}")
    print(f"字典的value是:{my_dict1[key]}")


# 统计字典内的元素数量,len()函数
num = len(my_dict1)
print(f"字典中的元素数量有:{num}个")

字典的特点

image-20250222153326655

练习 没怎么懂,自己写的时候逻辑不清

"""
升职加薪
"""
All_dict = {
    "王力宏":{
        "部门":"科技部",
        "工资":3000,
        "级别":1
    },"周杰伦":{
        "部门":"市场部",
        "工资":5000,
        "级别":2
    },"林俊杰":{
        "部门":"市场部",
        "工资":6000,
        "级别":3
    },"张学友":{
        "部门": "科技部",
        "工资": 4000,
        "级别": 1
    },"刘德华":{
        "部门": "市场部",
        "工资": 6000,
        "级别": 2
    }
}
print(f"全体员工当前信息如下:{All_dict}")
# for key in All_dict:
#     employee = All_dict[key]
#     if employee["级别"] ==1:
#         employee["工资"] += 1000
#         print(f"全体员工{key}级别为1的员工完成升职加薪操作,操作后{employee}")


# for循环遍历字典
for name in All_dict:
    # if条件判断符合条件员工
    if All_dict[name]["级别"] == 1:
    # 升职加薪操作
    # 获取到员工的信息字典
        employee_All_dict = All_dict[name]  #得到一个新的字典,本身意味着可以用语法 字典.[] 获取key
    # 修改员工的信息
        employee_All_dict ["级别"] = 2
        employee_All_dict ["工资"] += 1000
    # 将员工的信息更新回All_dict
        All_dict[name] = employee_All_dict

# 输出结果

print(f"对员工升职加薪后的结果是{All_dict}")

五类数据容器的总结对比

列表与字典的区别

🔹 取值方式不同

  • 列表索引 取值(位置)

  • 字典 取值(key)

“`python
my_list = [“Python”, “Java”, “C++”]
print(my_list[1]) # Java (索引取值)

my_dict = {“语言”: “Python”, “版本”: 3.10}
print(my_dict[“语言”]) # Python (键取值)
“`

| 列表(List) | 字典(Dict) |
| ———— | ————– |
| 按索引存取 | 按键存取 |
| 存的是一组值 | 存的是键值对 |
| 数据有序 | 键值对有序 |
| 适合存相似项 | 适合存关联数据 |

image-20250222164436255

数据容器特点对比

数据容器的通用操作

  • 遍历

image-20250222164808864

  • 通用统计功能

image-20250222164834119

  • 通用容器转换功能

  • 容器通用排序功能

sorted(序列,[reverse=ture])其中reverse是翻转的意思,也就是选择反向。

容器通用功能总览

image-20250222174324562

拓展-字符串大小比较的方式

ASCII码表

image-20250222174433247

按位比较,一位一位进行对比,只要有一位大,那么整体就大

image-20250222174532024

总结

image-20250222175100501

python函数进阶

函数的多返回值

多个返回值是什么

image-20250222191059079

返回值可以是不同的类型

函数的多种传参方式

位置参数

image-20250222192024847

关键字参数

image-20250222192312028

缺省参数

传递参数时,可以设置默认值

注意:默认值统一放到最后

image-20250222195613718

不定长参数

image-20250222195847877

  • 位置传递

image-20250222200050243

  • 关键字传递

image-20250222200131867

总结

image-20250222201130650

匿名函数

函数作为参数传递

注意:是传入的逻辑,而不是传入的数据

image-20250222202037141

总结

image-20250222202916910

lambda匿名函数

定义

lambda就是一次性函数,用完就没法再调用了

image-20250222203300645

示例

image-20250222203354766

注意:只支持一行代码

总结

image-20250222204139894

python文件操作

文件编码概念

编码技术

image-20250222205045320

UTF-8是目前全球通用的编码格式

除非有特殊需求,否则,一律以UTF-8进行文件编码即可

总结

image-20250222205443148

文件读取操作

什么是文件?

image-20250222205611646

文件操作:打开、关闭、读、写

文件的操作步骤

image-20250222205756542

  • open()打开文件

image-20250222205858033

  • 读取操作

read()

readlines()

readlines()

image-20250222212408892

for循环读取文件行

image-20250223142853837

关闭文件对象 close()

with open() as f :

操作汇总

image-20250223143805995

总结

image-20250223143847409

文件读取的课后练习讲解

忘记count()用法

image-20250223144333948

"""
单词计数
"""
f = open("E:/document/word.txt", "r", encoding="utf-8" )

# 方式1:读取内容,通过字符串count方法统计itheima单词数量
content = f.read()
count = content.count("itheima")
print(f"itheima在文件中出现了{count}次")

# 方式2:读取内容,一行一行读取
count = 0 # 使用count变量累计itheima出现的次数
for line in f:
    line = line.strip()  # 去除开头和结尾的空格以及换行符
    words = line.split(" ")
    for word in words:
        if word == "itheima":  # 如果单词是itheima,进行数量的累加加1
            count += 1

print(f"itheima在文件中出现了{count}次")

文件的写出操作

写操作快速入门

image-20250223165956600

总结

image-20250223171741100

文件的追加写入操作

追加写入操作快速入门

image-20250223171843054

总结

image-20250223172649351

文件操作的综合案例

image-20250223172935429

spilt: 分隔字符串后,得到一个新的列表(字符串的分隔)

"""
文件的综合案例
"""
# 打开文件得到文件对象,准备读取
fr = open("E:/document/bill.txt","r", encoding="utf-8")

# 打开文件得到文件对象,准备写入
fw = open("E:/document/bill.txt.bak", "w", encoding="utf-8")
for line in fr:
    line = line.strip()
    # 判断内容,将满足的内容写出

    if line.split(",")[4] == "测试":
        continue  # continue进入下一次循环,这一次后面的内容就跳过了

        # 将内容写出去
    fw.write(line)
        # 由于前面对内容进行了strip()操作,所以要手动写出换行符‘
    fw.write("\n")

# close 2个文件对象
fr.close()
fw.close()

python异常、模块与包

了解异常

程序运行出现错误

image-20250223200650900

异常的捕获

为什么要捕获异常?

image-20250223201050484

对bug进行提醒,整个程序继续进行

image-20250223201114035

捕获指定异常

image-20250223202053584

捕获多个异常

image-20250223202812608

总结

image-20250223204237811

异常的传递

异常的传递

image-20250223204456649

Python模块

模块的概念和导入

什么是模块?

image-20250223205509174

模块的导入方式

1

image-20250223205623794

2 只使用time模块中的某个功能

image-20250223210607641

总结

image-20250223212110207

自定义模块并导入

个性化模块–自定义模块

image-20250223212304249

注意事项

image-20250224092622347

总结

__main__:只有当程序是直接执行时才会进入

__all__:可以控制import的时候哪些功能可以被导入,当然也可以直接手动去决定导入哪些内容,因为all是控制*的(详细建python文件)

image-20250224093942039

自定义python包

自定义包

只要有__init__.py这个文件

image-20250225150123389

步骤

image-20250225150414045

导入包

image-20250225150524169

安装第三方包

一个包,就是一堆同类型功能的几何体

image-20250227200453256

安装第三方包

image-20250227200613470

pip install numpy

可通过清华大学提供的链接下载包(以下载numpy包为例)

pip inatall-i http://pypi.tuna.tsinghua.edu.cn/simple numpy

也可通过pycharm安装

安装步骤:

image-20250227201545023

image-20250227201616004

image-20250227201651897

image-20250227201451846

总结

image-20250227201515066

异常-模块-包-综合案例讲解

案例

image-20250227201800166

建议多看看这部分内容

python基础综合案例-数据可视化

折线图开发

JSON数据格式的转化

定义

image-20250301152536329

作用

image-20250301152650207

json格式数据格式

就是python语言中的字典,或者是列表(里面是字典格式)

image-20250301152947273

python数据和json数据的相互转化

示例

"""
演示JSON格式的转换
"""
import json
# 准备一个列表,列表内的元素都是字典,将其转换为JSON
data = [{"name":"张大山", "age":11}, {"name":"王大锤", "age":13}, {"name":"赵小虎", "age":16}]
json_str = json.dumps(data, ensure_ascii=False)
print(type(json_str))
print(json_str)

# 准备字典,将字典转换为JSON
d = {"name":"周杰伦", "addr":"台北"}
json_str = json.dumps(d, ensure_ascii=False)
print(type(json_str))
print(json_str)

# 将JSON字符串转化为python数据类型[{k: v, k: v},{k: v, k: v}] ,加单引号是因为json格式本身被看做是一种特殊的字符串格式,只不过之前输出时被省略了
s = '[{"name":"张大山", "age":11}, {"name":"王大锤", "age":13}, {"name":"赵小虎", "age":16}]' # 注意要把列表转换为字符串
l = json.loads(s)
print(type(l))
print(l)

# 将json字符串转化为python数据类型 {k: v, k: v}
s = '{"name":"周杰伦", "addr":"台北"}'
d = json.loads(s)
print(type(d))
print(d)

总结

image-20250301161811658

pyecharts模块简介

pyecharts:pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。

画廊:pyecharts – A Python Echarts Plotting Library built with love.

安装pyecharts包

image-20250301165933881

总结

image-20250301170026791

pyecharts的入门使用

"""
演示pyecharts的基础入门
"""
# 导包
from pyecharts.charts import Line

# 创建一个折线图对象
line = Line()

# 给折线图对象添加x轴的数据
line.add_xaxis(["中国", "美国", "英国"])

# 给折线图对象添加y轴的数据
line.add_yaxis("GDP", [30, 20, 10])

# 通过render方法,将代码生成图像
line.render()
# 设置全局配置项

image-20250301171759147

pyecharts配置选项

  • 全局配置

python
# 设置全局配置项
line.set_global_opts(
title_opts=TitleOpts(title="GDP显示", pos_left="center", pos_bottom="1%"),
legend_opts=LegendOpts(is_show=True),
toolbox_opts=ToolboxOpts(is_show=True),
visualmap_opts=VisualMapOpts(is_show=True),
)

  • 系列配置

总结

全局配置不只以下部分,共有十几个

image-20250301200044980

数据处理(通过json模块对数据进行处理)

复制数据-粘贴到下面网站-简单梳理出数据的层次

https://www.bejson.com/jsonviewernew/#google_vignette

难点在于该数据层级过多,获取数据较为复杂

"""
演示可视化需求1:折线图开发
"""
import json

# 数据准备
f_us = open("E:/document/资料/资料/可视化案例数据/折线图数据/美国.txt", "r", encoding="utf-8")

us_data = f_us.read()  # 读取美国的全部内容

# 去掉文件中不符合json规范的开头
us_data = us_data.replace("jsonp_1629344292311_69436(", "")

# 去掉末尾不符合json规范的结尾,序列的切片
us_data = us_data[:-2]

# JSON转python字典    语法:json.loads(数据)
us_dict = json.loads(us_data)
print(type(us_dict))
print(us_dict)

#  获取trend
trend_data = us_dict['data'][0]['trend']
print(trend_data)
# 获取日期数据,用于x轴,取2020年(到314下标结束数据切片:[:314])
x_data = trend_data['updateDate'][:314]
print(x_data)

# 获取确认数据,用于u轴,取2020年(到314结束)
y_data = trend_data['list'][0]['data'][:314]
print(y_data)

生成折线图(通过pyecharts完成疫情折线图)

"""
演示可视化需求1:折线图开发
"""
import json
from pyecharts.charts import Line
from pyecharts.options import TitleOpts, LabelOpts
# 数据准备
f_us = open("E:/document/资料/资料/可视化案例数据/折线图数据/美国.txt", "r", encoding="utf-8")
us_data = f_us.read()  # 读取美国的全部内容
f_jp = open("E:/document/资料/资料/可视化案例数据/折线图数据/日本.txt", "r", encoding="utf-8")
jp_data = f_jp.read()  # 读取日本的全部内容
f_in = open("E:/document/资料/资料/可视化案例数据/折线图数据/印度.txt", "r", encoding="utf-8")
in_data = f_in.read()  # 读取印度的全部内容
# 去掉文件中不符合json规范的开头
us_data = us_data.replace("jsonp_1629344292311_69436(", "")
jp_data = jp_data.replace("jsonp_1629350871167_29498(", "")
in_data = in_data.replace("jsonp_1629350745930_63180(", "")
# 去掉末尾不符合json规范的结尾,序列的切片
us_data = us_data[:-2]
jp_data = jp_data[:-2]
in_data = in_data[:-2]
print(jp_data[:200])  # 打印前200个字符
print(jp_data[-200:])  # 打印后200个字符


# JSON转python字典    语法:json.loads(数据)
us_dict = json.loads(us_data)
jp_dict = json.loads(jp_data)
in_dict = json.loads(in_data)

#  获取trend  key(也就是字典的键值对的 键)
us_trend_data = us_dict['data'][0]['trend']
jp_trend_data = jp_dict['data'][0]['trend']
in_trend_data = in_dict['data'][0]['trend']

# 获取日期数据,用于x轴,取2020年(到314下标结束数据切片:[:314])
us_x_data = us_trend_data['updateDate'][:314]
print(us_x_data)

jp_x_data = jp_trend_data['updateDate'][:314]
print(jp_x_data)

in_x_data = in_trend_data['updateDate'][:314]
print(in_x_data)

# 获取确认数据,用于u轴,取2020年(到314结束)
us_y_data = us_trend_data['list'][0]['data'][:314]
print(us_y_data)

jp_y_data = jp_trend_data['list'][0]['data'][:314]
print(jp_y_data)

in_y_data = in_trend_data['list'][0]['data'][:314]
print(in_y_data)

# 生成图表
line = Line()
# 添加x轴,共用一个就可以了
line.add_xaxis(us_x_data)
# 添加y轴数据
line.add_yaxis("美国确诊人数", us_y_data, label_opts=LabelOpts(is_show=False))  # 添加美国的y轴数据
line.add_yaxis("日本确诊人数", jp_y_data, label_opts=LabelOpts(is_show=False))  # 添加日本的y轴数据
line.add_yaxis("印度确诊人数", in_y_data, label_opts=LabelOpts(is_show=False))  # 添加印度的y轴数据

# 设置全局变量
line.set_global_opts(
    # 标题设置
    title_opts=TitleOpts(title="2020年美日印确认人数对比折线图",pos_left="center",pos_bottom="1%"),

)
# 调用render方法,生成图表
line.render()

# 关闭文件对象
f_us.close()
f_jp.close()
f_in.close()

运行结果

image-20250301214904943

地图可视化

基础地图使用

image-20250302143238810

"""
地图可视化的基本使用
"""
from pyecharts.charts import Map
from pyecharts.options import VisualMapOpts
# 准备地图对象
map = Map()

# 准备数据
data = [
    ("北京市", 99),
    ("上海市", 199),
    ("湖南省", 299),
    ("台湾省", 399),
    ("广东省", 499)
]

map.add("测试地图", data, "china")


# 设置全局选项
map.set_global_opts(
    visualmap_opts=VisualMapOpts(
        is_show=True,
        is_piecewise=True,  # 开启手动校准范围
        pieces=[
            {"min": 1, "max": 9,"label":"1-9", "color": "#CCFFFF"},
            {"min": 10, "max": 99,"label":"10-99", "color": "#FFFF99"},
            {"min": 100, "max":199 ,"label":"100-199", "color": "#FF9966"},
            {"min": 200, "max": 299,"label":"200-299", "color": "#FF6666"},
            {"min": 300, "max": 399,"label":"300-399", "color": "#CC3333"},
            {"min": 400, "max": 499,"label":"400-499", "color": "#990033"},
        ]

            # 具体的范围是多少了
    )

)

# 绘图
map.render()

疫情地图-国内疫情地图

注意如何取得数据,利用json数据网站,获得数据层级(清楚元组和列表如何获取数据)

在线JSON校检格式化工具网站:https://www.bejson.com/

"""
演示全国疫情可视化地图开发
"""
import json
from pyecharts.charts import Map   # 导包,引入...功能
from pyecharts.options import *
# 读取数据文件
f = open("E:/document/资料/资料/可视化案例数据/地图数据/疫情.txt", "r", encoding="UTF-8")
data = f.read()     # 读取全部数据
# 关闭文件
f.close()
# 取到各省数据
# 将字符串json转换为python的字典
data_dict = json.loads(data)        # 基础数据字典
# 从字典中取出省份的数据
province_data_list = data_dict["areaTree"][0]["children"]
# 组装每个省份和确诊人数为元组,并各个省的数据都封装入列表内
data_list = []      # 绘图需要用的数据列表
for province_data in province_data_list:
    province_name = province_data["name"]                   # 得到省份名称
    # 确保每个省份名称都加上 "省" 字符
    if province_name == "新疆":
        province_name = "新疆维吾尔自治区"
    elif province_name == "西藏":
        province_name = "西藏自治区"
    elif province_name == "内蒙古":
        province_name = "内蒙古自治区"
    elif province_name == "宁夏":
        province_name = "宁夏回族自治区"
    elif province_name == "广西":
        province_name = "广西壮族自治区"
    elif province_name == "北京":
        province_name = "北京市"
    elif province_name == "上海":
        province_name = "上海市"
    elif province_name == "天津":
        province_name = "天津市"
    elif province_name == "重庆":
        province_name = "重庆市"
    elif "省" not in province_name and province_name not in ["澳门", "香港",]:
        province_name += "省"
    province_confirm = province_data["total"]["confirm"]    # 确诊人数
    data_list.append((province_name, province_confirm))   # 封装到列表中,此时定义一个画图要用的列表
print(province_name)

# 创建地图对象
map = Map()
# 添加数据  map.add()
map.add("各省份确诊人数", data_list, "china")
# 设置全局配置,定制分段的视觉映射
map.set_global_opts(
    title_opts=TitleOpts(title="全国疫情地图"),
    visualmap_opts=VisualMapOpts(
        is_show=True,           # 是否显示
        is_piecewise=True,      # 是否分段
        pieces=[
            {"min": 1, "max": 99, "lable": "1~99人", "color": "#CCFFFF"},
            {"min": 100, "max": 999, "lable": "100~9999人", "color": "#FFFF99"},
            {"min": 1000, "max": 4999, "lable": "1000~4999人", "color": "#FF9966"},
            {"min": 5000, "max": 9999, "lable": "5000~99999人", "color": "#FF6666"},
            {"min": 10000, "max": 99999, "lable": "10000~99999人", "color": "#CC3333"},
            {"min": 100000, "lable": "100000+", "color": "#990033"},
        ]  # lable:表示名字
    )
)
# 绘图
map.render("全国疫情地图.html")  # 可以设置生成文件名字

疫情地图-省级疫情地图

"""
演示河南省疫情地图开发
"""
import json
from pyecharts.charts import Map
from pyecharts.options import *

# 读取文件
f = open("E:/document/资料/资料/可视化案例数据/地图数据/疫情.txt", "r", encoding="UTF-8")
data = f.read()
# 关闭文件
f.close()
# 获取河南省数据
# json数据转换为python字典
data_dict = json.loads(data)
# 取到河南省数据
cities_data = data_dict["areaTree"][0]["children"][3]["children"]

# 准备数据为元组并放入list
data_list = []
for city_data in cities_data:
    city_name = city_data["name"] + "市"
    city_confirm = city_data["total"]["confirm"]
    data_list.append((city_name, city_confirm))

# 手动添加济源市的数据
data_list.append(("济源市", 5))  #.append() 是 Python 中 列表(list) 的一个方法,用来将一个元素添加到列表的末尾。

# 构建地图
map = Map()
map.add("河南省疫情分布", data_list, "河南")
# 设置全局选项
map.set_global_opts(
    title_opts=TitleOpts(title="河南省疫情地图"),
    visualmap_opts=VisualMapOpts(
        is_show=True,           # 是否显示
        is_piecewise=True,      # 是否分段
        pieces=[
            {"min": 1, "max": 99, "lable": "1~99人", "color": "#CCFFFF"},
            {"min": 100, "max": 999, "lable": "100~9999人", "color": "#FFFF99"},
            {"min": 1000, "max": 4999, "lable": "1000~4999人", "color": "#FF9966"},
            {"min": 5000, "max": 9999, "lable": "5000~99999人", "color": "#FF6666"},
            {"min": 10000, "max": 99999, "lable": "10000~99999人", "color": "#CC3333"},
            {"min": 100000, "lable": "100000+", "color": "#990033"},
        ]
    )
)

# 绘图
map.render("河南省疫情地图.html")

动态柱状图

基础柱状图

"""
演示基础柱状图的开发
"""
from pyecharts.charts import Bar
from pyecharts.options import LabelOpts

# 使用Bar构建基础柱状图
bar = Bar()
# 添加x轴的数据
bar.add_xaxis(["中国", "美国", "英国"])
# 添加y轴数据
bar.add_yaxis("GDP", [30, 20, 10], label_opts=LabelOpts(position="right"))

# 反转x和y轴  可以通过调用reversal调用这个方法
bar.reversal_axis()
# 绘图
bar.render("基础柱状图.html")



# 设置数值标签在右侧   label_opts=LabelOpts(position="right")

总结

image-20250302170241347

基础时间线柱状图

创建时间线

动态图:实际就是在一个x轴上有非常多的点,每一个点都对应一个图,连起来就像是动图一样。

image-20250302170426622

image-20250302174436213

"""
演示带有时间线的柱状图开发
"""
from pyecharts.charts import Bar, Timeline
from pyecharts.options import LabelOpts
from pyecharts.globals import ThemeType

bar1 = Bar()
bar1.add_xaxis(["中国", "美国", "英国"])
bar1.add_yaxis("GDP", [30, 30, 20], label_opts=LabelOpts(position="right"))
bar1.reversal_axis()

bar2 = Bar()
bar2.add_xaxis(["中国", "美国", "英国"])
bar2.add_yaxis("GDP", [50, 50, 50], label_opts=LabelOpts(position="right"))
bar2.reversal_axis()

bar3 = Bar()
bar3.add_xaxis(["中国", "美国", "英国"])
bar3.add_yaxis("GDP", [70, 60, 60], label_opts=LabelOpts(position="right"))
bar3.reversal_axis()

# 构建时间线对象,设置一个主题,也就是可以设置主题颜色
timeline = Timeline({"theme": ThemeType.LIGHT})

# 在时间线内添加柱状图对象,就是添加对应的点
timeline.add(bar1, "点1")
timeline.add(bar2, "点2")
timeline.add(bar3, "点3")

# 自动播放设置
timeline.add_schema(
    play_interval=1000, # 自动播放时间间隔,单位毫秒
    is_timeline_show=True, # 是否在自动播放的时候,显示时间线
    is_auto_play=True, # 是否自动播放
    is_loop_play=True # 是否循环自动播放
)

# 绘图是用时间线对象绘图,而不是bar对象了,因此就是timeline.render()
timeline.render("基础时间线柱状图.html")

总结

image-20250302174532184

GDP动态柱状图绘制

1.补充列表的sort方法

image-20250302193910905

  • 定义一个函数,choose_sort_key(element) 把列表中的每个元素传进来,然后取1

image-20250302193755479

  • 匿名lambda函数(上图右边)

2.需求分析(分块进行,共分为5块)

image-20250313205211963

3.处理数据

  • 读取数据

image-20250313205420300

  • 把需要的数据转换为所需要的格式

“`python
from pyecharts.charts import Bar, Timeline
from pyecharts.options import *
from pyecharts.globals import ThemeType

# 读取文件,注意文件的编码格式不是utf-8
f = open(“E:/document/资料/资料/可视化案例数据/动态柱状图数据/1960-2019全球GDP数据.csv”, “r”, encoding=”GB2312″)
data_lines = f.readlines() # f.readlines()方法会读取文件的所有行,并返回一个列表
# 关闭文件
f.close()
# 删除第一条数据
data_lines.pop(0)
# 将数据转换为字典存储
# 先定义一个字典对象
data_dict = {}
for line in data_lines:
year = int(line.split(“,”)[0]) # 转换为数字了→年份
country = line.split(“,”)[1] # 国家
gdp = float(line.split(“,”)[2]) # gdp,用float强制将科学计数法转换
# 如何判断字典里面有没有指定的key
try:
data_dict[year].append([country,gdp]) #第一次追加没有年份,所以要捕获异常
except KeyError:
data_dict[year] = [] # 构建一个新的列表,直接给这个赋值 但是这个year不是key吗?赋值后变成什么了呢
data_dict[year].append([country,gdp])

timeline = Timeline(({“theme”: ThemeType.LIGHT}))
# 排序年份
sorted_year_list = sorted(data_dict.keys()) # 把所有的年份拿出来,按照顺序
# print(sorted_year_list)
for year in sorted_year_list:
data_dict[year].sort(key = lambda element: element[1],reverse = True)
# print(data_dict[year])
# 取出前8名的国家
year_data = data_dict[year][0:8]
x_data = []
y_data = []
for country_gdp in year_data:
x_data.append(country_gdp[0]) # x轴追加国家
y_data.append(country_gdp[1]/100000000) # y追加GDP数据

  # 构建柱状图
  bar = Bar()
  bar.add_xaxis(x_data)
  x_data.reverse()  # 反转一下
  y_data.reverse()  # 反转一下让美国在上
  bar.add_xaxis(x_data)
  bar.add_yaxis("GDP(亿)", y_data, label_opts=LabelOpts(position="right"))  # 标签都在最右边
  # 反转x轴和y轴
  bar.reversal_axis()
  # 设置每一年的图表标题
  bar.set_global_opts(
      title_opts=TitleOpts(title=f"{year}年全球前8GDP数据")
  )
  timeline.add(bar, str(year))

# 设置时间线自动播放
timeline.add_schema(
play_interval=1000,
is_timeline_show=True,
is_auto_play=True,
is_loop_play=False
)

# 绘图
timeline.render(“1960-2019全球GDP前8国家2.html”)
“`

第二阶段

初识对象

目标:理解使用对象完成数据组织的思路

image-20250312145930446

除特殊说明,博客文章均为青山原创,依据 CC BY-SA 4.0 许可证进行授权,转载请附上出处链接及本声明。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇