学习Python:零基础从入门到精通

学习完本篇文章,您将掌握python以下知识点

1.变量...

2.控制流程:条件语句...

3.循环/迭代器...

4.清单:收藏| 数组| 数据结构...

5.词典:键值数据结构...

6.迭代:循环数据结构...

7.类和对象...

8.Python面向对象编程模式:ON..

9.封装:隐藏信息...

10.公共实例变量...

11.非公共实例变量...

12.公共方法...

13.非公开方法...

14.封装摘要...

15.继承:行为和特征...

学习Python:零基础到精通

首先,什么是Python?根据它的创建者Guido van Rossum,Python是:

“高级编程语言,其核心设计理念是代码可读性和语法,它允许程序员用几行代码表达概念。”

对我来说,学习Python的第一个原因因为他是一种优美的 编程语言。他可以在编写代码的同时很自然的表达我的想法。

另一个原因是我们可以通过运用Python在各种用途:数据科学,Web开发和机器学习都在这里发挥作用。Quora,Pinterest和Spotify都使用Python进行后端Web开发。让我们来了解一下。

1.变量

您可以将变量视为存储值。

在Python中,定义变量并为其设置值非常容易。想象一下,你想将1号存储在一个名为“one”的变量中。我们可以这样做:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

one=1

是不是很简单?您刚刚将值1赋给变量“one”。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

two = 2
some_number = 10000

您可以将任何其他分配给您想要的任何其他变量。如上表所示,变量“ two”存储整数2,“ some_number ”存储10,000

除了整数之外,我们还可以使用布尔值(True / False),字符串,float和许多其他数据类型。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

# booleans
true_boolean = True
false_boolean = False

# string
my_name = "youyongit"

# float
book_price = 15.80

2.控制流程:条件语句

If ”用来评估输入语句是True还是False。如果为True,则执行“if”语句中的内容。例如:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

If True:
Print (“Hello Python If”)
If 2>1:
    Print (“2 is greater than 1”)

2大于1,因此执行“ print ”代码。

如果“ if ”表达式为false,则将执行“ else ”语句。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

If 1>2:
Print (“1 is greater than 2”)
else:
    Print (“1 is not greater than 2”)

1不大于2,因此将执行“ else ”语句中的代码。

您还可以使用“ elif ”语句:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

If 1>2:
Print (“1 is greater than 2”)
elif: 2>1:
    Print (“1 is not greater than 2”)
else:
    Print (“1 is equal to 2”)

3.循环/迭代器

在Python中,我们可以以不同的形式进行迭代。这谈论:whilefor

循环时:当说法是正确的,该块中的代码会被执行。因此,此代码将打印从110的数字。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

num =1
while num <=10:
       print (num)
       num+=1

同时循环需要一个“ 循环条件。“如果它保持为True,它会继续迭代。在这个例子中,当num11循环条件等于False

另一个基本的代码来更好地理解它:

循环条件True如此它保持迭代-直到我们将其设置为False

对于循环:将变量“ num ”应用于块,“ for ”语句将为您迭代它。而使用while代码可以做到一样:从110

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
loop_condition = True

while loop_condition:
    print("Loop Condition keeps: %s" %(loop_condition))
    loop_condition = False 

范围从第一个元素开始,1直到第11个元素(10是第10个元素)。

4.清单:收藏| 数组| 数据结构

想象一下,您希望将整数1存储在变量中。但也许你现在要存储2.和3,4,5 ......

我是否有另一种方法可以存储我想要的所有整数,而不是存储数百万个变量?确实存在另一种存储它们的方法。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

my_integers = [1, 2, 3, 4, 5]    

List是一个集合,可用于存储值列表(如您想要的这些整数)。所以让我们用它:

我们创建了一个数组并将其存储在my_integer上。

但也许你在问:“我如何从这个阵列中获取一个值?”

List有一个叫做索引的概念。第一个元素获得索引0。第二个得到1,依此类推。

为了更清楚,我们可以用它的索引表示数组和每个元素。如图:

v2-9ec2399583437a4d1c05e4d8970da257_hd.png

使用Python语法,也很容易理解:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
my_integers = [5, 7, 1, 3, 4]
print(my_integers[0]) # 5
print(my_integers[1]) # 7
print(my_integers[4]) # 4    

想象一下,你不想存储整数。您只想存储字符串,例如亲戚姓名列表。看起来像这样:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
relatives_names = [
  "Toshiaki",
  "Juliana",
  "Yuji",
  "Bruno",
  "Kaio"
]
 
print(relatives_names[4]) # Kaio

它的工作方式与整数相同。

我们刚学会了列表如何运作。但我仍然需要向您展示如何向List数据结构添加元素(。

添加新值的最常用方法是append。让我们看看它是如何工作的:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

bookshelf = []
bookshelf.append("The Effective Engineer")
bookshelf.append("The 4 Hour Work Week")
print(bookshelf[0]) # The Effective Engineer
print(bookshelf[1]) # The 4 Hour Work Week

append非常简单。您只需要将值(例如“ 有效工程师 ”)作为append参数。

我们来谈谈另一种数据结构。

5.词典:键值数据结构

现在我们知道Lists用整数编号索引。但是,如果我们不想使用整数作为索引呢?我们可以使用的一些数据结构是数字,字符串或其他类型的索引。

Dictionary数据结构。Dictionary是一组键值对。这是它的样子:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

dictionary_example = {
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

key是指向索引的value。我们如何获取Dictionary 内的value呢?用key

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

dictionary_tk = {
  "name": "Leandro",
  "nickname": "Tk",
  "nationality": "Brazilian"
}

print("My name is %s" %(dictionary_tk["name"])) # My name is Leandro
print("But you can call me %s" %(dictionary_tk["nickname"])) # But you can call me Tk
print("And by the way I'm %s" %(dictionary_tk["nationality"])) # And by the way I'm Brazilian

我创造了一个关于我的Dictionary。我的名字,昵称和国籍。这些属性是Dictionary 的key。

当我们学会了如何使用索引访问List,我们还可以使用索引(keysDictionary)来访问存储在Dictionary的value

在这个例子中,我使用存储在字典中的所有值打印了一个关于我的短语。很简单吧?

另一个关于字典很酷的事情是我们可以使用任何东西作为value。在我创建的Dictionary 中,我想在其中添加key “年龄”和我的实际整数年龄:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
dictionary_tk = {
  "name": "Leandro",
  "nickname": "Tk",
  "nationality": "Brazilian",
  "age": 24
}

print("My name is %s" %(dictionary_tk["name"])) # My name is Leandro
print("But you can call me %s" %(dictionary_tk["nickname"])) # But you can call me Tk
print("And by the way I'm %i and %s" %(dictionary_tk["age"], dictionary_tk["nationality"])) # And by the way I'm Brazilian

这里我们有一个key(年龄)value(24)对,使用字符串作为,整数作为

正如我们所做的那样Lists,让我们学习如何添加元素Dictionaryvaluekey 是什么使我们学习Dictionary的重要部分。当我们谈论向其添加元素时也是如此。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
dictionary_tk = {
  "name": "Leandro",
  "nickname": "Tk",
  "nationality": "Brazilian"
}

dictionary_tk['age'] = 24

print(dictionary_tk) # {'nationality': 'Brazilian', 'age': 24, 'nickname': 'Tk', 'name': 'Leandro'}

6.迭代:循环数据结构

List迭代非常简单。我们Python 开发人员通常使用For循环。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
bookshelf = [
  "The Effective Engineer",
  "The 4 hours work week",
  "Zero to One",
  "Lean Startup",
  "Hooked"
]

for book in bookshelf:
    print(book)

因此,对于书架中的每本书,我们(可以用它做任何事情)打印它。

对于哈希数据结构,我们也可以使用for循环,但我们应用key

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
dictionary = { "some_key": "some_value" }

for key in dictionary:
    print("%s --> %s" %(key, dictionary[key]))

# some_key --> some_value    

这是一个如何使用它的示例。对于每一个在dictionary中德key ,我们print key及其相应value

另一种方法是使用该iteritems方法。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
dictionary = { "some_key": "some_value" }

for key, value in dictionary.items():
    print("%s --> %s" %(key, value))

# some_key --> some_value

我们将两人的名字作为参数keyvalue,当然这不是必须的。我们可以为它们命名。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
dictionary_tk = {
  "name": "Leandro",
  "nickname": "Tk",
  "nationality": "Brazilian",
  "age": 24
}

for attribute, value in dictionary_tk.items():
    print("My %s is %s" %(attribute, value))

我们可以看到我们使用属性作为Dictionary key的参数,并且它可以正常工作。

7.类和对象

一点理论:

对象是汽车,狗或自行车等现实世界物体的代表。对象共享两个主要特征:数据行为

汽车有数据,如车轮数量,车门数量和座位容量。它们还表现出行为:它们可以加速,停止,显示剩余多少燃料,以及许多其他东西。

我们在面向对象的编程中确定数据属性行为方法

数据→属性和行为→方法

而一个是从中创建单个对象的模板。在现实世界中,我们经常发现许多具有相同类型的对象。比如汽车。都有品牌和型号(都有发动机,车轮,车门等)。每辆车都是使用相同的模板构建的,并且具有相同的组件。

8.Python面向对象编程模式:ON

Python作为面向对象的编程语言,具有以下概念:对象

类是模板,是其对象的模型。

再说一次,类只是一个模型,或者是一种定义属性行为的方法(正如我们在理论部分所讨论的那样)。作为示例,车辆具有其自己的属性,其定义哪些对象是车辆。车轮的数量,油箱的类型,座位容量和最大速度都是车辆的属性。

考虑到这一点,看一下类的 Python语法:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Vehicle:
    pass    

我们用类声明定义类- 就是这样。

对象类的实例。我们通过命名类来创建实例。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

car = Vehicle()
print(car) # <__main__.Vehicle instance at 0x7fb1de6c2638>       

这里carVehicle类的一个对象

请记住,我们的车辆有四个属性:车轮数量,油箱类型,座位容量和最大速度。我们在创建车辆对象时设置所有这些属性。所以在这里,我们定义我们的在它启动时接收数据:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Vehicle:
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.type_of_tank = type_of_tank
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity

我们使用这种init 方法。我们称之为构造方法。因此,当我们创建车辆对象时,我们可以定义这些属性。想象一下,我们喜欢特斯拉模型S,我们想要创造这种对象。它有四个轮子,以电能运行,有五个座位的空间,最大速度为250公里/小时(155英里每小时)。让我们创建这个对象:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
tesla_model_s = Vehicle(4, 'electric', 5, 250)        

四轮+电动“坦克式”+五个座位+ 250km /小时最高速度。

所有属性都已设置。但是我们如何才能获得这些属性的价值呢?我们向对象发送消息询问他们。我们称之为方法。这是对象的行为

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Vehicle:
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.type_of_tank = type_of_tank
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity

    def number_of_wheels(self):
        return self.number_of_wheels        

这是两种方法的实现:number_of_wheelsset_number_of_wheels。我们称之为gettersetter。因为第一个获取属性值,第二个为属性设置新值。

在Python中,我们可以使用@propertydecorators)来定义getterssetters

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Vehicle:
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.type_of_tank = type_of_tank
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity

    @property
    def number_of_wheels(self):
        return self.__number_of_wheels

我们可以使用这些方法作为属性:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
tesla_model_s = Vehicle(4, 'electric', 5, 250)
print(tesla_model_s.number_of_wheels) # 4
tesla_model_s.number_of_wheels = 2 # setting number of wheels to 2
print(tesla_model_s.number_of_wheels) # 2        

这与定义方法略有不同。这些方法作为属性。例如,当我们设置新的轮数时,我们不会将两个作为参数应用,而是将值2设置为number_of_wheels。这是编写pythonic gettersetter编码的一种方法。

但我们也可以使用其他方法,比如“ make_noise ”方法。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Vehicle:
    def __init__(self, number_of_wheels, type_of_tank, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.type_of_tank = type_of_tank
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity

    def make_noise(self):
        print('VRUUUUUUUM')

当我们调用此方法时,它只返回一个字符串 VRRRRUUUUM。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
tesla_model_s = Vehicle(4, 'electric', 5, 250)
tesla_model_s.make_noise() # VRUUUUUUUM        

 

9.封装:隐藏信息

封装是一种对对象数据和方法的直接访问的限制机制。与此同时,它有助于对数据(对象的方法)进行操作。

“封装可用于隐藏数据成员和成员的功能。在这个定义下,封装意味着对象的内部在对象定义之外的视图中隐藏。“ - 维基百科

对象的所有内部表示都是从外部隐藏的。只有对象可以与其内部数据进行交互。

首先,我们需要了解变量和方法的工作方式publicnon-public实例。

10.公共实例变量

对于Python类,我们可以在构造函数方法中初始化public instance variable

在构造函数方法中:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

class Person:
    def __init__(self, first_name):
        self.first_name = first_name

这里我们将first_name值作为参数应用于public instance variable

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
tk = Person('TK')
print(tk.first_name) # => TK       

在类中:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Person:
    first_name = 'TK'

在这里,我们不需要将first_name参数作为参数应用,并且所有实例对象都将class attribute初始化为TK

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
tk = Person()
print(tk.first_name) # => TK    

我们现在已经知道我们可以使用public instance variablesclass attributes。关于该public部分的另一个有趣的事情是我们可以管理变量值。object可以管理其变量值:GetSet变量值。

Person,记住这个类,我们想要为它的first_name变量设置另一个值:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
tk = Person('TK')
tk.first_name = 'Kaio'
print(tk.first_name) # => Kaio

我们只是为first_name实例变量设置了另一个值kaio并更新了值。由于它是一个public变量,我们可以做到这一点。

11.非公共实例变量

我们在这里不使用术语“私有”,因为在Python中没有属性是真正私有的

作为public instance variable ,我们可以non-public instance variable在构造函数方法或类中定义二者。语法差异是:for non-public instance variables_variable名称前使用下划线(_)。

“在Python中不存在除对象内部之外无法访问的'私有'实例变量。但是,大多数Python代码都遵循一个约定:以下划线(例如_spam)为前缀的名称应被视为API的非公共部分(无论是函数,方法还是数据成员)“ - Python软件基金会

这是一个例子:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Person:
    def __init__(self, first_name, email):
        self.first_name = first_name
        self._email = email

你看到email变量了吗?这就是我们定义的方式non-public variable

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
tk = Person('TK', 'tk@mail.com')
print(tk._email) # tk@mail.com       

我们可以访问和更新它Non-public variables只是一个惯例,应该被视为API的非公开部分。

所以我们使用一种允许我们在类定义中完成它的方法。让我们实现两种方法(emailupdate_email)来理解它:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Person:
    def __init__(self, first_name, email):
        self.first_name = first_name
        self._email = email

    def update_email(self, new_email):
        self._email = new_email

    def email(self):
        return self._email

现在我们可以使用这些方法更新和访问non-public variables

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

tk = Person('TK', 'tk@mail.com')
print(tk.email()) # => tk@mail.com
# tk._email = 'new_tk@mail.com' -- treat as a non-public part of the class API
print(tk.email()) # => tk@mail.com
tk.update_email('new_tk@mail.com')
print(tk.email()) # => new_tk@mail.com        

1. 我们用first_nameTK和emailtk@mail.com 发起了一个新对象

2. 通过访问non-public variable方法打印电子邮件

3. 试图在类之外设立一个新的email

4. 我们需要将其non-public variable视为non-publicAPI的一部分

5. 用我们的实例方法更新了non-public variable

6. 成功!我们可以使用helper方法在我们的类中更新它

12.公共方法

有了public methods,我们也可以在类外使用它:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

class Person:
    def __init__(self, first_name, age):
        self.first_name = first_name
        self._age = age

    def show_age(self):
        return self._age 

我们来测试一下:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
tk = Person('TK', 25)
print(tk.show_age()) # => 25       

13.非公开方法

但是non-public methods我们无法做到。让我们使用相同的Person类,但现在show_age non-public method使用下划线(_)。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Person:
    def __init__(self, first_name, age):
        self.first_name = first_name
        self._age = age

    def _show_age(self):
        return self._age

现在,尝试non-public method,用对象来调用它:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
tk = Person('TK', 25)
print(tk._show_age()) # => 25        

我们可以访问和更新它。Non-public methods只是一个惯例,应该被视为API的非公开部分。

示例:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
class Person:
    def __init__(self, first_name, age):
        self.first_name = first_name
        self._age = age

    def show_age(self):
        return self._get_age()

    def _get_age(self):
        return self._age

在这里,我们有一个_get_age non-public method和一个show_age public method。所述可以通过我们的对象使用(我们的类的)show_age,并且仅在使用我们的类定义内(内show_age法)可使用_get_age

14.封装摘要

通过封装,我们可以确保对象的内部表示,对外部隐藏。

15.继承:行为和特征

某些对象有一些共同点:它们的行为和特征。

例如,我从父亲那里继承了一些特征和行为。我继承了他的眼睛和头发作为特征,以及他作为行为的不耐烦和内向。

在面向对象的编程中,类可以从另一个类继承公共特征(数据)和行为(方法)。

让我们看看另一个例子,并在Python中实现它。

想象一辆车。车轮数量,座位容量和最大速度都是汽车的属性。我们可以说ElectricCar类从常规Car类继承了这些相同的属性。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

class Car:
    def __init__(self, number_of_wheels, seating_capacity, maximum_velocity):
        self.number_of_wheels = number_of_wheels
        self.seating_capacity = seating_capacity
        self.maximum_velocity = maximum_velocity        

我们的Car类实现了:

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
my_car = Car(4, 5, 250)
print(my_car.number_of_wheels)
print(my_car.seating_capacity)
print(my_car.maximum_velocity)       

一旦启动,我们就可以使用所有instance variables创建的。

在Python中,我们将从parent classchild class作为参数。一个ElectricCar类可以从我们的继承汽车类。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com

class ElectricCar(Car):
    def __init__(self, number_of_wheels, seating_capacity, maximum_velocity):
        Car.__init__(self, number_of_wheels, seating_capacity, maximum_velocity)

。我们不需要实现任何其他方法,因为这个类已经有了它(继承自Car类)。

# 请在Python命令行、Pycharm、Jupyter里运行以下代码,Powered by www.youyongit.com
my_electric_car = ElectricCar(4, 5, 250)
print(my_electric_car.number_of_wheels) # => 4
print(my_electric_car.seating_capacity) # => 5
print(my_electric_car.maximum_velocity) # => 250

我们学到了以下Python基础知识的东西:

· Python变量的工作原理

· Python条件语句如何工作

· Python循环(while&for)如何工作

· 如何使用列表:集合| 排列

· 字典键值集合

· 我们如何迭代这些数据结构

· 对象和类

· 属性作为对象的数据

· 方法作为对象的行为

· 使用Python getter和setter以及属性装饰器

· 封装:隐藏信息

· 继承:行为和特征

 

有用教育(上海荣隆教育科技有限公司)是一家专业培养资深IT工程师并让学员高薪就业、专注于Python开发、AI人工智能的教育机构,公司总部设立在上海,为IT人员提供到岗即用式的实战培训。

免费Python技术答疑QQ群 174240809

更多资源请关注微信公众号哦

转载于:https://my.oschina.net/u/4130150/blog/3049043

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值