变量及数据类型(一)

计算机基本组成原理

之前有说到程序的运行,无非就是两种:编译运行和解释运行。
编译与解释的过程中关注的并不是程序如何检错,而是如何编译(或解释);
我们说,编译型的编程语言,在程序开始之前要预先编译;解释型的编程语言,不是预先编译,而是直 接运行,运行过程中是解释一行运行一行。那么,那程序要编译成什么呢?解释成什么呢?非常好,这其实才是编译与解释我们需要真正了解的。 在透彻理解编译与解释之前,我们还是有必要先了解一下计算机的基本组成原理。

冯·诺伊曼体系

美籍匈牙利数学家冯·诺伊曼于1946年提出存储程序原理,把程序本身当作数据来对待,程序和该 程序处理的数据用同样的方式储存。

冯·诺伊曼体系结构、冯·诺伊曼理论的要点是:计算机的数制采用二进制;计算机应该按照程序顺序执行。人们把冯·诺伊曼的这个理论称为冯·诺伊曼体系结构。
冯·诺依曼体系主要由5大部分来组成:

  • 输入数据和程序的输入设备;

  • 记忆程序和数据的存储器;

  • 完成数据加工处理的运算器;

  • 控制程序执行的控制器;

  • 输出处理结果的输出设备。
    其实我们现代计算机,包括4 50年前刚出来的计算机,包括时至今日我们仍然在使用的计算机,仍然在沿用这样的体系进行设计。而冯·诺伊曼体系中控制器控制执行的程序,就是现代计算机技术中软件开发 所研究的方向。
    接下来我们用一张图,描述一台计算机系统的组成结构:
    计算机系统的组成结构
    从上图结合我们日常的计算机使用常识,我们能看出:

    • 首先一台计算机肯定是要有相应的硬件组成部分的;
    • 在硬件之上需要安装操作系统;
    • 在操作系统之上再去安装并使用各种各样的应用程序;

包括日常大家使用电脑的常识,我们知道,操作系统其实承担的角色是:

  • 为用户提供一个可视化的GUI界面,用户可以依靠输入输出设备使用计算机的各种功能;
  • 为应用与硬件之间的交互提供一个媒介;

那么应用与硬件之间到底是怎么交互的呢?
ok,回到Python,我们说: Python是一门高级编程语言
语言,即所谓的一种“形式”,一种表达载体,用于多个事务之间的有效沟通。那啥叫高级编程语言啊? 意思就是让我们人能充分看懂的用于编程开发的语言。 但同时我们又知道:

  • 机器是肯定不懂人的语言的;
  • 机器只知道0和1;

而我们都见过所谓的 code(代码) ,并不是所谓的0和1啊?不都是各种各样的英文、数字和符号么? 其实,机器能看懂的0和1,我们通常称之为 机器码 ,高级编程语言所编写的代码,我们通常称为 源代码

  • 机器码由无数个0和1组成,就是若干位的二进制编码,因为机器只能通过高低电压表示0和1;
  • 源代码可以是任意人为设定的语言模板;

在应用程序与硬件之间的操作系统之上,还安装了一种特殊的应用程序:编译器(或解释器)

编译器或解释器的作用就是将人看得懂的高级编程语言通过编译器或解释器转译为机器能看懂的机器 码,随后计算机相关硬件执行机器码指令,完成对应操作。 所以,编译器或解释器,就是应用程序与计算机硬件交互的“中间角色”。所以应用程序安装在操作系统之上后就可以使用了

  • 如果一个编程语言越高级,就意味着人越能读懂该语言,学习起来更容易上手,由该语言转译为机器码的复杂程度就更高,运行效率越低。
  • 如果一个编程语言越低级,就意味着人很难读懂该语言,学习起来比较费劲,由该语言转译为机器码的复杂程度就越低,因为太贴近机器码,所以运行效率比较高。

在现代常见的高级编程语言中:

  • C++算是高级编程语言中“较低级(比喻)”的编程语言,意思就是更好转译为机器码,所以C++的学习难度比较大,但C++应用程序的执行效率很高。基本上现在软件开发中,几乎所有的面向底层(操作系统&硬件)的开发都选择的是C++;
  • Python、Go等编程语言确实足够“高级”,所以学习起来还是比较容易的,但也大大增加了机器码转译的复杂程度,因此执行效率相比C++来说低了很多
    接下来我们来简单的讲一讲编程语言转译机器码的大致流程:

Python解释器执行流程

C++:运行前一次性编译

   源代码———>编译器———>机器码

JavaScript: 运行时逐行解释

   源代码———>解释器———>机器码  

python:
1.执行.py文件,系统调度Python解释器,开始运行
2.解释器会逐行读取.py源文件,并将其编译成PyCodeObject字节码对象,并写入同名的.pyc文件
3.将其存放于内存中,然后解释器的虚拟机从内存中读取.pyc文件的字节码对象,随后进行逐行读取、解释为机器码并逐行运行机器码;
4.运行结束后Python解释器将PyCodeObject字节码对象写回pyc文件中。当该Python程序需要多次运行时,后续的每次运行前,会先在存储中检索对应的pyc文件,如果找到,直接开始逐行解释;如果没找到,则重复上面的流程。

  	 源代码———>字节码———>解释器———>机器码

那么Python为什么要先编译成字节码呢?为什么不像c++、JavaScript那样直接编译或者解释呢?
这样做主要是出于以下几点好处:

  • 跨平台特性。Python的跨平台特性是非常好的,将Python程序先编译成字节码,同时不同的机器, 机器指令也是不一样的。将代码先编译成解释器能识别的机器码,运行时解释器就可以根据不同机器的不同机器指令执行相应的操作。如此来看,就可以实现Python的跨平台特性;
  • 提升运行性能。因为我们说了,Python属于高级编程语言,距离机器码“比较远”,并且: 其实解释器的效率会比编译器的效率高很多,因为没有预先一次性编译为机器码的过程; 这样情况下,Python源代码只需执行一次编译为字节码并持久化存储,在后期解释器解释为机器码的过程就可以反复使用该字节码而无需再预先编译一次(字节码),这样做的目的就是为了弥补 Python执行效率低的缺点。

PEP-8编码规范

什么是PEP-8:

Python Enhancement Proposal #8(英文直译:第八号Python增强提案),简称PEP-8,用于规范全球开发者所需遵循的统一Python编码风格

也就是说,所谓这个PEP-8,就是用于约束开发者编写Python代码的统一风格。 如果风格不统一,每个人都有自己的风格,那么对于代码阅读者来说是阅读起来是十分痛苦的。所以,有了PEP-8编码规范,全球的Python开发者都来遵循这个规范,那么: 代码的可读性就非常高

这里我们先介绍几个比较基础的编码规范

  • 缩进:代表代码的嵌套,即包含与被包含的关系,通常依据逻辑结构合理使用缩进,缩进即表示代码的逻辑结构。编码时,通常使用tab制表符或空格表示缩进。但,自Python3.x+版本开始,要求不 能同时使用tab制表符与空格表示缩进。一般情况下,我们通过4个空格表示一次缩进。这一点,在 你的Pycharm中已提前设置好了:
    PIC2
  • 所有行限制的最大字数为79;
  • 顶层函数和类的定义,前后用两个换行隔开;
  • 源文件编码统一采用UTF-8;
  • 模块或包导入语句单独一行;

注释及其使用

注释,即注解,说白了就是解释性的文本内容。一般在日常的编码中,注释的作用主要就是注解你的代 码,无论是自己看,还是他人看,有注释的代码往往更容易让读者明白。为代码添加合适的注释,是非 常好的习惯。
在Python中,注释只有单行注释。但其他编程语言,注释可分为单行与多行注释。
Python中单行注释的语法:

#这是注释

Pycharm中快速注释/取消注释代码的快捷键为:ctrl + /

Pycharm常用快捷键

  1. 将光标移动到本行的开头:Home键
  2. 将光标移动到本行的末尾:End键
  3. 快速注释/快速取消注释:Ctrl + /
  4. 复制光标所在行:Ctrl + d
  5. 删除光标所在行:Shift + delete
  6. 移动光标所在行:Shift + Ctrl + 键盘上下箭头
  7. 选中代码的格式化:Ctrl + Alt + l

基本常用函数

函数的基本理解:Python的函数表示一个具体的功能,这个函数(功能)是预先编辑好的,即:函数(功能)的定义者(声明)是提供功能的人,函数(功能)的使用者(调用)是需要使用这个功能的人。

  1. print()
  • 作用:用于输出一定的内容
  • 语法:
    print'hello'#输出hello
    print("hello","world") #同一个print输出多条内容
  • 常用参数:end
    • 作用:每条输出内容以何字符结束;
    • 语法:
print("hello",end='$') #输出hello,以$内容作为结尾。

print默认结束符:

\n # 转义字符,代表以换行结束,即输出一条后换行,后续如果还有输出内容,则自动换到下一行。
  • 常用参数:sep
    • 作用:将多个同时输出的内容之间添加一个连接(也可以理解为间隔)符号
    • 语法
# 输出一句“hei,python!”,同一行间隔一个“&”符号继续输出一句“helloworld”
print('hei,Python!','HelloWorld!',sep=' & ')
  1. input()
  • 作用:接收键盘输入的内容
  • 语法:
num = input("please input a num:")#按照提示输入所需数据
age = input("请输入你的年龄:")
print(age)

变量

定义

我们先来看下变量的标准定义(标准定义描述的比较抽象,初次见面不太好理解):

变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储数据对象。

说通俗点其实就是:

内存中存储一个对象的空间,在起一个名字。

变量定义的理解

首先,我们先来明确第一点:

  • 这里我们所说的“变量”,不是我们数学中所熟知的“变量”,注意奥,此变量非彼变量,一码归一 码,不要去混淆。

那,这里的变量,到底啥意思呢?来先给大家举个例子奥,一说就明白:

  • 比如说:“我要喝水!”,OK,你是不是需要找到一个杯子,然后把水装到杯子里,再喝下去?

  • 比如说:“我要干饭!”,OK,你是不是需要找到一个碗,在碗中盛饭,再把饭吃下去?

也就是:

  • 你要喝的这个水,是不是得有个杯子装着它,你才知道:杯子里的水是能喝的? 如果现在天上下雨了,下的雨也是水啊?可是你会喝吗?
  • 你要吃的这个饭,是不是得有个碗,有个盘装着它,你才知道:碗里的、盘子里的饭是能吃的? 如果现在一碗饭摔地上了,碗破了,饭撒地上了,地上的这个饭也是饭啊?可是你会吃么?

ok,接下来我们先回顾***Python的定义***:

Python是一门面向对象的、解释型的计算机程序设计语言。

定义我们都懂了,这里我们看这个关键词:面向对象
我们知道,Python是支持面向对象思想的。在面向对象思想中,一切问题产生于对象,且一切内容都围绕对象这个概念展开。Python中,一切万物皆对象。
那么问题来了:Python中的任意一个可用的对象该如何在计算机中存储呢?这些对象都是些啥呢?

  • 要么是某个数据对象,比如整数,比如文本信息;
  • 要么是某个文档;
  • 要么是某个图片;
  • 要么是某个音视频;
  • …还有很多种;

那么通过上文的例子其实我们已经明白:

  • 你想喝水,得有个杯子。这个杯子提供了存储一定量水的空间,然后这个空间的名称叫杯子,对吧?
  • 你想吃饭,得有个碗。这个碗提供了存储一定量米饭的空间,然后这个空间的名称叫碗,对吧?

OK引申到我们Python中:

  • Python中你想要存储一个所谓的对象,同理啊?你是不是得先给这个对象提供一定的存储空间啊? 有了这个存储空间后,你才能将这个对象存储进去吧?

还有个问题:存储在哪儿啊?还用问么肯定是内存中啊!
可关键是,我在内存中给一个对象开辟了一块存储空间,然后我把这个对象也存储进来了,可是,我存 这个对象是为了以后使用它的,那我该怎么找到它呢?
给这个***空间起一个名字***不就行了么!通过存储空间的名字,不就能顺利找到这个空间所存储的对象了 么!
所以:这个内存中开辟的一块存储空间,而且还是起了名称之后的存储空间,就是变量!
好总结一下:什么是变量?

  1. 首先,变量是一个存储空间;
  2. 其次,这个存储空间是为了存储一个具体的对象的;
  3. 然后,为了能够方便的找到这个对象,需要给存储这个对象的空间起一个名字

OK至此,对于变量的概念应该是理解了。简单吧!!?

变量的声明赋值语句

理解了什么是变量之后,接下来我们就正式了解变量的基本语法。

  • 语法

变量名 = 数据对象 # 声明单个变量,绑定单个对象
变量名1 = 变量名2 = 变量名3 = … = 变量名n = 数据对象 # 声明多个变量,绑定同一个对象
变量名1,变量名2,变量名3,…,变量名n = 数据对象1,数据对象2,数据对象3,…,数据对象n # 声明多个变量,绑定多个对象

  • 理解
    关于变量的声明赋值语句,在宏观上看着,好像就是左边一个东西“等于”了右边的一个东西,其实不是。
    “变量名= 数据对象”正确的读法为:声明一个变量,命名为xx(“=”号左边的内容),赋值为 xx(“=”号右边的内容); 例如:

a = 1
b = 2
c = 1.5
d = ‘helloworld’

更多情况下,我们在创建一个变量的时候,我们称这个过程为声明一个变量。不要问我为什么,我 也不知道为什么,反正各个年代程序员口口相传到现在都说的是***声明***…;
“=”号表示为:***为声明并完成命名的变量赋值一个数据对象。***注意:在编程语言中,“=”与“==”的含义完全不一样:

  • ”=”表示为赋值,即创建对象与变量之间的引用关系;
  • “==”表示为等于,相等,即为数学中的”=“的含义;

同时我们还需要注意的是***变量的声明与赋值操作的先后顺序***,即:

  • 一定是先声明:即创建一个变量,包含该变量的存储地址及命名的名称;
  • 随后才是赋值:有了创建好的变量,包含了存储地址及命名后,才能将该变量与对象之间创 建引用关系

有关“=”赋值操作的理解

“=”表示赋值,而这里的赋值所表示的含义为:

  • 创建变量与对象间的引用关系,并且一定是变量引用对象

如何理解呢?
当Python解释器解释 teacher = ‘老师’ 时:

  1. 第一步,解释器先向计算机内存申请一块存储空间,该存储空间的地址为 0x901 ;
  2. 第二步,为该存储空间命名;
  3. 第三步,将读取到内存的对象“老师”与该存储空间之间创建引用关系,该引用关系为变量引用对 象,所以箭头指向为:变量==>对象

所以说到这,其实我们应该对于变量“存储”对象的概念做一个再一次细致的理解:

  • 并不是前期我们形象举例描述时所见的,直接将一个所谓的对象塞(存储)到这个变量的存储空间;
  • 真实的情况是:只是在内存中申请一块空间,命名之后只需创建该空间(变量)与对象之间的引用 关系即可。

综上,总结一下:

1.变量的声明赋值本质上是在创建变量与对象之间的引用关系。
2.“=”表示为赋值、创建引用,且一定是变量引用对象,不能反过来。这也就解释了为什么一定是 先声明,再赋值。

变量的命名规则

  • 变量命名可以使用英文大小写、中文、阿拉伯数字、“_”,可随意组合,但不能以数字开头命名;
  • 变量命名尽量采用驼峰命名法、匈牙利命名法;

何谓驼峰命名法?

一个变量的名称可能会有多个英文单词组成,这种情况下每个单词的首字母就需要大写以区分整个 变量命名含义的组成。

驼峰命名法又分为:

  • 大驼峰:即变量的命名无论包含几个单词,每个单词的首字母统统都需要大写;
  • 小驼峰:即变量的命名无论包含几个单词,第一个单词首字母不大写,从第二个单词开始首字母才 需要大写

何谓匈牙利命名法?

一个变量的命名要根据其所引用的对象的含义进行命名,即变量的命名要尽可能的见名知义。

举个例子一看就明白:

a = 1
a2 = 3 # 数字和字母随意组合
ab_1 = 4 # 数字、字母、“_”随意组合
abc = ‘abc’ # 下划线也可以做命名开头
studentInfo = ‘学生信息’ # 小驼峰,匈牙利命名法
SchoolName = ‘湖北汽车工业学院’ # 大驼峰,匈牙利命名法

但,如下的命名是错误的:

1a = 1

难点讲解:多变量赋值与变量交换

先看第一种例子:
a1 = a2 = a3 = 666
此为一次性将同一个数据对象赋值给多个不同的变量。一个对象能被多个变量同时引用??
来举个例子一说就明白:

  • 我:请问大家可以怎么称呼我?
  • 室友A:阳阳
  • 室友B:阳
  • 室友C:小阳
  • 我妈:立阳… …

也就是:

  • 首先我,是一个活生生的人,对吧?
  • 但是,我这个人,可以有很多种称呼我的方式,对吧?
  • 每一种称呼方式,似不似指代的都是我这个人??

所以说:

  • 我这个人,是一个对象;
  • 我(对象)可以有很多种称呼(变量)来指代(引用)我(对象)

现在明白了不?
再看第二种例子:

name,sex,age = '阳阳‘,’女‘,21

此为一次性将不同的数据对象绑定于不同的变量,且会***按照变量声明的先后顺序***依次进行赋值
接下来看看稍微复杂点的:

num = 3.14
num = 3.1415926
number = num
print(number)
print(num)

上述案例中: num 变量被进行了二次赋值,也叫做重新赋值, num 变量被重新绑定到一个新的数据对象
同时, number 变量拷贝了 num 变量的引用关系
此种情况,即为常见的***变量重新赋值***。

  • 原理分析

    首先,我们已经知道:

    • 变量和对象之间仅仅只是引用与被引用的关系;

所以在我们进行各种变量重新赋值操作时,其本质只是:

  • 变量和数据对象间的引用关系在发生改变

del语句

  • 作用:
    del 语句用于删除变量

  • 语法:

del 变量1,变量2,…,变量n

  • 注意:
    • del 删除的不是数据对象,删除的是***变量及变量与对象之间的引用关系***
    • 因为 del 只是删除变量(以及变量与对象间的引用关系),所以从宏观上看, del 能删除已绑 定对象的一切变量,包括删除一个函数(引用了函数对象的变量)、删除一个类(引用了类对 象的变量)。

了解完 del 语句后,针对上述案例,我们做进一步演变。看如下例子:

num1 = 123
num2 = num1
num3 = num2
num1 = 234
print(num2) # ?
del num3
num4 = num2 = 555
print(num2) # ?
print(num3) # ?

代码逻辑分析:

  • 第一步,先声明变量 num1 ,赋值为数字123;
  • 第二步,做变量引用关系拷贝,声明一个变量 num2 ,将其也赋值为数字123;所以此时数字123有 两个变量同时引用;
  • 第三步:再做变量引用关系拷贝,声明一个变量 num3 ,将其也赋值为数字123;所以此时数字123 有三个变量同时引用;
  • 第四步: num1 变量做重新赋值,所以 num1 变量的引用关系要由原本的指向123,改为指向234;
  • 此时测试, num2 变量引用的对象仍然为123;
  • 第五步:删除 num3 变量;此时,该变量直接删除,连带其指向数字123的引用关系也删除;数字 123现在只有 num2 在引用;
  • 第六步:声明变量 num4 ,并与 num2 变量一起,对于 num4 来说是变量声明后赋值为数字555,对 num2 来说是做了变量重新赋值,赋值后引用新数字555

变量的类型

Python中是没有所谓的变量的类型的概念的,因为Python的变量类型是动态的

何谓动态?先说静态。
变量类型的静态是指:

  • 变量在声明时就需要规定好能够存储的数据类型

比如Java、C++,在声明变量的时候必须规定数据类型,比如:

int num = 123; //正确
age = ‘十八岁’; //错误,因为必须规定age变量数据类型为字符串

而对于Python来说,因为声明变量时无需规定数据类型,变量声明后可绑定任意类型的对象,所以 Python中变量的类型是动态的。
怎么去理解Python的变量类型是动态的呢?举个例子一说就明白:

  • 你面前现在有个杯子(变量);
  • 这个杯子(变量)可以倒点水进去吧(对象)?此时这个杯子就是个水杯;
  • 这个杯子(变量)可以插几支笔进去吧(对象)?此时这个杯子就变成了笔筒子;
  • 这个杯子(变量)可以弹点烟灰(对象)进去吧?此时这个杯子就变成了烟灰缸;

也就是说:

  • 这个圆柱体的所谓的“杯子”,里面存放的东西不一样,其用途、含义也不一样
  • 变量所存储的数据对象的类型不一样,变量的类型也就不一样

如此理解,应该OK了吧。
综上,有关变量的声明与赋值所常见的若干细节问题我们就分析、总结完毕了。有关变量的声明及赋值 我们暂时先聊这么些,后期学习到更多数据类型的时候我们会逐步深入了解变量的应用。

数据类型

学习Python,第一步,必须得先搞明白变量,毕竟Python一切皆对象,且所有对象的引用及调用都是通过变量进行;
但变量只是学习Python的第一步。我们知道对象在变量的概念中使用的基本规律之后,接下来我们就必 须要了解Python中到底都有哪些种对象供我们使用,这些对象都具备哪些功能,也就是我们本节所聊的话题:数据类型。
了解数据类型,先了解什么是数据。

数据及数据类型定义

  • 数据
    先看数据的标准解释:

数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号。

看不懂?那你就把它理解为:

  • 一切在计算机中能够存储的信息,都叫数据!

哈哈哈简单粗暴~
其实这里我们所说的数据,不仅指狭义上的数字,还可以是具有一定意义的文字、字母、数字符号 的组合、图形、图像、视频、音频等,也是客观事物的属性、数量、位置及其相互关系的抽象表 示。例如,“0、1、2…`”、“阴、雨、下降、气温”“学生的档案记录、货物的运输情况”等都是数据。
在计算机科学中,数据是指所有能输入到计算机并被计算机程序处理的符号的介质的总称,是用于输入电子计算机进行处理,具有一定意义的数字、字母、符号和模拟量等的通称。现在计算机存储和处理的对象十分广泛,表示这些对象的数据也随之变得越来越复杂。 实质上,数据是对广大现实存在的个体一种抽象化的概念,一种统称。数据是一种广义上的概括。在计算机编程语言中,数据 就是指一切能存入变量的对象。

  • 数据类型

因为一切都可以称作为数据,但数据的个体与个体之间是存在的差异的,但同时又具备诸多相似性,所以,把一类相似的数据放在一起集中管理,就形成了数据类型。也就是说,数据类型是用来划分数据的。而分类标准可以有很多种,所以数据的划分也可以有很多种标准, 但具体的,数据类型的种类是固定的。

Python中支持的数据类型

Python因为是一门高级编程语言,在数据类型的支持上相对其他编程语言会比较简化、多样。
Python目前支持的数据类型如下:

  • 整型 - int
  • 浮点型 - float
  • 复数 - complex
  • 布尔类型 - bool
  • 空值 - None
  • 字符串 - str
  • 列表 - list
  • 元组 - tuple
  • 字典 - dict
  • 集合与固定集合 - set&frozenset
  • 字节串 - bytes

Python基本数据类型的划分

  • 类型查看函数: type()
    • 语法:
type(object) # parmas:需要查看类型的对象
  • 作用:返回一个对象的类型
  • 实例代码
a = 123
b = '123'
print(type(a)) # <class 'int'>
print(type(b)) # <class 'str'>
  • 按照是否为数字类型进行划分
    按照是否为数字类型,可将数据类型划分为以下几种:

    • 数字类型:整型、浮点型、复数、布尔类型
    • 其他类型:None、序列、容器
  • 按照是否为序列和容器进行划分
    对于除数字类型之外的其他类型,按照是否为序列或容器,可将数据类型划分为以下几种:

    • 序列类型:字符串、列表、元组、字节串
    • 容器类型:字典、集合与固定集合
  • 综上,目前公认的数据类型划分标准为:

    • 数字类型:整型、浮点型、复数类型、布尔类型
    • 序列类型:字符串、列表、元组、字节串
    • 容器类型:字典、集合与固定集合
    • 其他类型:None
  • 当然,按照Python中对象的可变性与不可变性,也可划分为:

    • 可变类型:列表、字典、集合
    • 不可变类型:数字类型、字符串、元组、固定集合、字节串

ok,今天就先整到这了
goodnight~

如有错误,欢迎指出~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值