Python在工作中的应用

👉  梓料领取方式:只需【点击这里】,即刻解锁您的Python学习新篇章!让我们携手并进,在编程的海洋里探索无限可能

实例1:文件批量处理

如对文件进行批量重命名,将文件夹中所有的文件名的”scroll_1”替换为”scroll_00”

文件批量重命名

import os

path = 'C:\\Users\\tylerzhu\\Desktop\\icon'

for file in os.listdir(path):

    if os.path.isfile(os.path.join(path,file))==True:

     newname = file.replace("scroll_1", "scroll_00")

        os.rename(os.path.join(path,file),os.path.join(path,newname))

        print(file)

 

 实例2:xml与excel互转

Excel转xml

Excel,info_fight_monster.xls包含3个sheet,分别表示怪物的基本信息、技能信息、奖励信息。

clip_image004[4]

 

XML,info_fight_monster.xml包含怪物的所有信息,格式如下:

<monster attack="84" attrib="2" classId="20" define="37" desc="" frameRate="24" icon="cdn/imageres/pets/pet_56_20.png" level="4" luck="0" monsterSID="1024" name="被驯服的小火猴" skill="74" speed="0" strength="447" type="0" url="cdn/flashres/pets/pet_20.swf">

  <skill skillLevel="2" skillSID="30048"/>

  <skill skillLevel="2" skillSID="30034"/>

  <prize desc="" gameID="0" infoType="27" itemSID="80001" itemType="0" level="小火猴的魔法棒" name="" num="1" plusSID="400001" prizeSID="1" type="1"/>

</monster>

编写脚本将Excel转换为XML格式。

Excel转XML

#! /usr/bin/env python

#coding=utf-8

'''

Created on 2013-3-31

info_fight_monster.xls转换为XML格式。转换分为以下几步:

step1 读取xml文件,info_fight_monster.xls

step2 解析出怪物基本信息,在base这个sheet里面,并放到一个xml文件中

step3 解析出怪物的技能信息,并将技能信息插入到对应的xml

step4:解析出怪物的奖励信息,并插入到对应XML

step5:保存xml文件

@author: tylerzhu'''

from lxml import etree

import xlrd3, codecs

 

attrib = ["monsterSID""classId""type""level""attrib"#

          "attack""skill""define""speed""strength"#

          "luck""name""desc""icon""url""frameRate"];

         

prize = ["monsterSID""prizeSID""type""infoType""gameID""itemType",  #

         "itemSID""num""plusSID""level""name""desc""icon"];

        

skill = ["monsterSID""skillSID""skillLevel"];

 

info_fight_monster_xml = etree.ElementTree(etree.Element("data"));

 

def openxls():

    excel = xlrd3.open_workbook("xls/info_fight_monster.xls");

    base = excel.sheet_by_name("base");

    monster = excel.sheet_by_name("skill");

    prize = excel.sheet_by_name("prize");

    return (base, monster, prize);

 

def buildMonsterBase(xls):

    sheet = xls[0];

    for row in range(1, sheet.nrows):

        monsterAttr = {};

        for col in range(0, sheet.ncols):

            if sheet.cell(row, col).value != None and col < len(attrib):

                monsterAttr[attrib[col]] = sheet.cell(row, col).value;

                if type(monsterAttr[attrib[col]]) == float:

                    #print(str(round(monsterAttr[attrib[col]])))

                    monsterAttr[attrib[col]] = str(round(monsterAttr[attrib[col]]));

        sub = etree.SubElement(info_fight_monster_xml.getroot(), "monster", monsterAttr);

        sub.tail = "\n"

        #input()

 

def buildMonsterSkill(xls):

    sheet = xls[1];

    for row in range(1, sheet.nrows):

        skillAttr = {};

        for col in range(1, sheet.ncols):

            if sheet.cell(row, col).value != None and col < len(attrib):

                skillAttr[skill[col]] = sheet.cell(row, col).value;

                if type(skillAttr[skill[col]]) == float:

                    skillAttr[skill[col]] = str(round(skillAttr[skill[col]]));

        monsterSID = str(int(sheet.cell(row, 0).value));

        monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']");

        monster.text = ("\n\t");

        sub = etree.SubElement(monster, "skill", skillAttr);

        sub.tail = "\n\t"

 

def buildMonsterPrize(xls):

    sheet = xls[2];

    for row in range(1, sheet.nrows):

        prizeAttr = {};

        for col in range(1, sheet.ncols):

            if sheet.cell(row, col).value != None and col < len(attrib):

                prizeAttr[prize[col]] = sheet.cell(row, col).value;

                if type(prizeAttr[prize[col]]) == float:

                    prizeAttr[prize[col]] = str(round(prizeAttr[prize[col]]));

        monsterSID = str(int(sheet.cell(row, 0).value));

        monster = info_fight_monster_xml.find("*[@monsterSID='" + monsterSID + "']");

        monster.text = ("\n\t");

        sub = etree.SubElement(monster, "prize", prizeAttr);

        sub.tail = "\n\t"

 

def build():

    xls = openxls();

    buildMonsterBase(xls);

    buildMonsterSkill(xls);

    buildMonsterPrize(xls);

 

    #输出合并之后的配置

    ouput = codecs.open('output/info_fight_monster.xml''w''utf-8');

    ouput.write(etree.tounicode(info_fight_monster_xml.getroot()))

    ouput.close();

 

if  __name__ == '__main__':

    build();

是不是很简单!

Xml转Excel

下面的例子将技能书info_fight_book.xml的数据转换为excel格式,例子只包含一个sheet的,如果有多个sheet同样处理即可。

XML转Excel

#! /usr/bin/env python

#encoding=utf-8

'''

Created on 2013-5-6

将技能书info_fight_bookxml转换为excel格式。

例子只包含一个sheet,如果有多个sheet同样处理。

@author: tylerzhu

'''

from lxml import etree

import xlwt3 as xlwt

#excel标题

#。。。

wb = xlwt.Workbook()

ws = wb.add_sheet("技能书")

 

tree = etree.parse('../xls/info_fight_book.xml')

root = tree.getroot()

row = 0

col = 0

for item in root:

    if len(item.attrib) == 0:

        continue

    row = row + 1

    col = 0

    for attr in item.attrib:

        ws.write(row, col, item.attrib[attr])

        col = col + 1

 

wb.save('../output/技能书.xls')

 

    总结

通过上面例子,发现Python代码有以下特点:

l  第一行是特殊形式的注释:它被称作 组织行 ——源文件的头两个字符是#!,后面跟着一个程序。这行告诉你的Linux/Unix系统当你 执行 你的程序的时候,它应该运行哪个解释器。建议使用这种形式——#!/usr/bin/env python,而不是——#!/usr/bin/python。

l  缩进很重要。Python使用缩进而不是一对花括号来划分语句块。

l  文档字符串,__doc__,没多大用。但是一个好的Python程序,应该要有文档字符串,且一般遵循:“文档字符串的惯例是一个多行字符串,它的首行以大写字母开始,句号结尾。第二行是空行,从第三行开始是详细的描述。”

l  python中引入模块后(import)首先就要执行模块的主块,当然模块中可能全是函数。如果要避免使用模块名称:from 模块名 import 符号名,那麽使用该符号名就不用使用模块名+点号+符号名,但是不推荐,容易造成程序不容易读,而且容易出错(特别是在python简洁而简单的语法的基础上)import... as ...起一个别名

l  模块的__name__属性,相当有用,解决了import的缺点,可以实现如果不是运行的本模块而被调用,不调用主块

l  如果你已经厌烦了java、c++的读写文件,那么python会让你重新喜欢上文件读写,python主张解决问题的方案越少越好,写文件就一个f = file(name, 'w'),f.write(...)读文件也一样,f = file(name),f.read或readline,最后close

l  ……

 

    前途!钱途!

clip_image006[4]

图:据说几年之前,有公司因为提高跳槽门槛而使用Python(摘自:知乎)

上面那截图只是2玩笑而已:-)。不管怎样,现在Python已经成为最受欢迎的程序设计语言之一,完全不用担心这个了。

TIOBE编程语言排行榜,2007、2011两年被TIOBE编程语言排行榜评为年度语言

clip_image007[4]

图:TIOBE编程语言(2002~2012 Python索引)

PYPL(Popularity of Language Index)编程语言流行指数,它对各种语言的流行指标进行了二次发掘。在过去的十年里,Python语言获得了最大的增长幅度——十年语言之冠。

clip_image008[4]

图:编程语言流行指数(http://goo.gl/Nku0I

  开发效率极高

据说豆瓣开发只用了3个月时间就上线了。开发效率高,有以下几方面原因。

丰富的内置类型及相关操作

clip_image010[4]

l  String:字符串放在单引号、双引号、三引号(多行时)中,从0开始索引,支持

n  查:find、index、

n  切片: s[0:2]、s[1:]

n  连接:“abc”+“ef” => “abcdef”、join

n  分割:split

n  格式化: format

n  。。。大小写转换、编码等操作

l  list, []:names=[“Dave”, “Mark”, “Ann”],列表从0开始索引,索引元素names[1]。列表可以包括任意类型的对象,可以嵌套。支持增、删、查、分片。

n  增:insert、append

n  删:del、remove、pop

n  查:search

n  切片: names[0:2]、[1:]

n  连接:[1,2,3]+[4,5] => [1,2,3,4,,5]、extend

n  反转:reverse

l  tuple, ():address=(“www.python.org”, 80),a = (80,)。元组语法与list相似,意义相当于枚举,可以为空,如果只含有一个元素,需要加逗号以区别于表达式(“one”, )。元组创建之后不可修改,即无法替换、删除、插入,但支持

n  索引:address[0] => www.python.org

n  切片:address[0:] => ('www.python.org', 80)

n  连接:(“www.python.org”,) + (80,) => ('www.python.org', 80)

n  host,port=address:host => www.python.orgport => 80

l  字典: dict(), {}:address={"host":"www.python.org", "port":80},支持

n  索引:address[“host”] => “www.python.org”,

n  get:address.get("host") => “www.python.org”

n  键:address.keys() => ['host', 'port']

n  in:"host" in address =>True

n  删除:del address["host"] => {'port': 80}

l  集合:set(),a=set([1,2,3,4]);一个数值集合 b=set(“hello”),一个唯一字符集合。与列表、元组不同,集合中的元素是无序的,无法通过数字索引,且元素不能重复。

n  并集:a|b => set([1, 2, 3, 4, 'h', 'l', 'o', 'e'])

n  交集:a&b => set([])

n  差集:a-b => set([1, 2, 3, 4]),即在a中不在b中元素

n  对称差集:a^b => set([1, 2, 3, 'e', 'h', 'l', 'o', 4])

n  add:a.add(5) => set([1, 2, 3, 4, 5]) #添加一项

n  update: a.update([6,7,8]) =>set([1, 2, 3, 4, 5, 6, 7, 8])#添加多项

n  remove: a.remove(5) =>set([1, 2, 3, 4, 6, 7, 8])#删除一项

 

强大的标准库

clip_image011[4]

Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数,而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能。Python标准库命名接口清晰、文档良好,很容易学习和使用。

Python标准库的主要功能有:

  • 文本处理,包含文本格式化、正则表达式匹配、文本差异计算与合并、Unicode支持,二进制数据处理等功能
  • 文件处理,包含文件操作、创建临时文件、文件压缩与归档、操作配置文件等功能
  • 操作系统功能,包含线程与进程支持、IO复用、日期与时间处理、调用系统函数、写日记(logging)等功能
  • 网络通信,包含网络套接字,SSL加密通信、异步网络通信等功能
  • 网络协议,支持HTTP,FTP,SMTP,POP,IMAP,NNTP,XMLRPC等多种网络协议,并提供了编写网络服务器的框架
  • W3C格式支持,包含HTML,SGML,XML的处理。
  • 其它功能,包括国际化支持、数学运算、HASH、Tkinter等

无所不包的第三方库

如果说强大的标准库奠定了python发展的基石,丰富的第三方库则是python不断发展的保证,随着python的发展一些稳定的第三库被加入到了标准库里面。

“There are currently 30630 packages here.”—— PyPI · The Python Package Index

clip_image013[4]

    总而言之

用下图可以表示Python的强大。

clip_image014[4]

图:Python(来自:xkcd,xkcd: Python

看Python在我工作中的应用,好像没什么说服力,证明不了啥。下面让我们看看有哪些大公司或有名的应用在使用Python,使用了哪些技术。

4.1.      国外

clip_image016[4]

图:谁用在用Python

上图只是列举了部分具有典型代表的公司,要列出所有的实在太困难的,因为太多国外在使用Python了。

Python Google的三大编程语言之一

在Google,C++、Java、Python是使用率排名前三的编程语言,使用Python的开发团队也是Google的第三大研发部门。

在Google内部的很多项目,例如Google Engine使用C++编写性能要求极高的部分,然后用Python或Java/Go调用相应的模块。

groups.google.comcode.google.com就是运行于Python之上的。此外,Python还广泛的用于基础维护部门。Guido Van Rossum加入Google的第一个项目Google Mondrian,是一个在线的代码预览系统,基于Perforce、BigTable(back-end)以及Python(front-end)。它使用了以下Python相关技术(http://goo.gl/3f5sy):

The application is built on top of Python open source libraries such as the Django frameworksmtpd.py mail service, and the wsgiref web server software

Google雄心勃勃的云计算平台Google App Engine最早支持的Python编程语言。

YouTube主要是Python写的

l  Apache

l  Python

l  Linux(SuSe)

l  MySQL

l  psyco,一个动态的Python到C的编译器

l  lighttpd代替Apache做视频查看

most of the lines of code for YouTube are still in Python. Everytime you watch a YouTube video you are executing a bunch of Python code.

YouTube解决问题的哲学只有一个词:简单。许多YouTube的产品最初只是源于一个简单的Python脚本。

在线视频王者YouTube的技术哲学,http://goo.gl/PHMUE7 Years Of YouTube Scalability Lessons In 30 Minutes

Quora - Python 驱动

下面内容主要摘自并加入了自己的注释:Quora - Python 驱动,http://goo.gl/28RGq

Quora 是使用什么语言和框架做的?

What languages and frameworks were used to code Quora?

创始人 Charlie 的回复:

  • 后端使用 Python 语言,Pylons 框架,但是框架一半左右被自己的系统替换(LiveNode/webnode2)
  • 前端 JavaScript 基于 jQuery
  • Thrift做后端服务器之间通信(thrift最初由facebook开发,07年四月开放源码,thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。)
  • Comet Server 使用Tornado
  • hosting 主要使用 Amazon EC2S3
  • 目前数据库使用 MySQL,memcached 做缓存,还有两个用 C++ 写的服务一起作为 data store
  • 版本控制用 Git

为什么 Quora 选择 Python 作为开发语言

Why did Quora choose Python for its development?下文只是简单整理,不是翻译。

创始人 Adam 的回复里,提到两个创始人正好都比较熟悉 Python. 另外他说明了排除其它语言的过程:

  • PHP 根本不考虑。Facebook 陷进去无法脱身,不代表它是目前最好的选择,由此得到的经验是编程语言的选择非常重要而且改变的代价非常大。Adam 此处给了其它几个链接,其中有指出 PHP 一大堆弱点的,也包括一个问题 "Do Facebook engineers enjoy programming in PHP?". 我很赞同 Facebook 的工程师说的,familiarity breeds contempt. 没有完美的语言,每一种语言都有长有短,当把它用到极限的时候,短处就变得很显眼并让人烦恼。我个人认为 PHP 也仍然是不差的选择。
  • C# - 看起来不错但是 -
    1. 他们不想把基础搭建在微软的技术平台上。SQL Server 很好,不过 Quora 需要一大堆开源软件,这些代码即使支持 .NET, 也支持得比较差。
    2. 不想冒险使用 Mono,因为不知道它能撑多久,而且据说有性能问题
  • Java 程序因为一些原因很容易变得更长,写起来比 Python 痛苦多了。
  • Scala 太新,也是一种冒险,另外虽然不像 Java 那么差,它也天生继承 JVM 的一些弱点。

Python 虽然有性能问题,但是 Quora 一些性能很关键的代码都用 C++ 写(Python 的优势,Java 做起来相对困难)。至于类型检查的缺乏,Quora 通过完善的单元测试来弥补。

Quora 另一位创始人 Charlie 加了几点:

  • 创立 Quora 的时候,Python 有许多很好的 web framework
  • Python 的数据结构跟 JavaScript 映射很好,这样 CS 之间交互数据很方便
  • Python 代码更易读
  • Python 在各方面有很多成熟的 library

为什么 Quora 要用 Pylons 做开发

Why did Quora choose to develop in Pylons?. Charlie 说他们想把 Pylons 的很多东西替换成自己的,比如他们不需要模版和 ORM. 在这方面,Pylons 比 Django 之类的要好。

Facebook九项工程改变科技产业之一——开源网络服务框架 Tornado

其他八项可以查看:http://goo.gl/nzFCy

Facebook九项工程改变科技产业之一——开源网络服务框架 Tornado,是用 Pyhton 语言开发的实时网络服务器,它支持上万的不间断连接,也支持以长轮询(long-polling)方式发布实时数据。

Tornado 最初是由 FriendFeed 公司开发出来的,而 FriendFeed 在 2009 被 Facebook 收购。随后 Facebook 发布 Tornado 开源工程,现在包括 Quora 在内的多家网站已使用 Tornado。

Reddit使用Python重写

Reddit(美国最大的网上社区)最早是用 Common Lisp 开发,随之用 Python 进行了重写(2005年底完成)。著名的Python 框架 Web.py 就是 Reddit 当时的员工 Aaron Swartz 开发的,现在 Reddit 的 Web 框架则使用了 Pylons 。在 2009 年 11 月,Reddit 迁移到 Amazon 的云计算平台。前端框架现在用的是 jQuery。或许你早就知道,Reddit 网站程序现在已经开源https://github.com/reddit/reddit,如果你感兴趣的话,不妨下载研究。

Dropbox

Dropbox 的99.9%的代码是用Python写的。Python使用在服务器端、桌面客户端、网站控制逻辑,后端的 API 和分析。

使用 Python 语言编写的代码,通过使用PyObjs,WxPython,types,py2exe, py2ap,PyWin32等工具,让Dropbox运行在Windows,Mac和Linux系统。

6 Lessons From Dropbox - One Million Files Saved Every 15 Minutes,http://goo.gl/Qj5sJ

Instagram

10亿美元被Facebook收购的Instagram,主要使用Python等开源技术。

应用服务器:

l  使用Django框架。

l  使用Gunicorn作为 WSGI 服务器(过去曾用过 Apache 下的 mod_wsgi 模块,不过发现 Gunicorn 更容易配置并且节省 CPU 资源)。

l  使用 Fabric 加速部署。

任务队列/发布通知

队列服务使用Gearman,工作实例(都用Python写的)在给定的时间内对队列中的任务进行消费,并分发给不同的服务;对于消息推送,找到的最划算的方案是,一个开源的Twisted 服务 pyapnsA universal Apple Push Notification Service (APNS) provider来实现,已经为Instagram处理了超过10亿条通知,并且绝对可靠。

参考:What Powers Instagram: Hundreds of Instances, Dozens of Technologies,http://goo.gl/mkfQN;中文版:http://goo.gl/Dkymt

OpenStack

OpenStack是一个美国国家航空航天局Rackspace合作研发的云端运算‎软件,以Apache许可证授权,并且是一个自由软件和开放源代码项目。

OpenStack是IaaS(基础设施即服务)组件,让任何人都可以自行建立和提供云端运算服务。此外,OpenStack也用作建立防火墙内的“私有云(Private Cloud),提供机构或企业内各部门共享资源。

    国内

clip_image018[4]

腾讯

腾讯游戏运营支撑体系的开发团队,在使用django/celery/rabitmq/mongodb开发了一个已广泛使用的内部开放平台。

Django:是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。

Celery:(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。celery用于生产系统每天处理数以百万计的任务。celery是用Python编写的,但该协议可以在任何语言实现。它也可以与其他语言通过webhooks实现。celery是易于集成Django, Pylons and Flask,使用 django-celerycelery-pylons and Flask-Celery 附加包即可。

豆瓣

豆瓣最初使用Python开发,只是用了3个月。洪强宁,《Python于web2.0网站的应用》,http://goo.gl/ZaI9s;《Python在豆瓣的应用》,http://goo.gl/IgeGe

clip_image020[3]

最早的豆瓣就完全使用 Python 开发,后台索引基于 twisted,GUI 使用 Quixote,还用到了 cElementTree,数据库是 MySQL。所以豆瓣天生就有着 Python 的文化。在豆瓣,开发环境正逐步从 Subversion 向 mercurial 迁移,还使用了 Python 编写的 trac 和 IRC,之所以选择 IRC 是因为 IRC 有很大的灵活性,可以编写 Bot 自动化很多东西。除此之外:

l  m.douban.com使用:Pylons

l  内部管理系统使用: Django

l  DPark系统:使用Python编写,支持迭代计算的MapReduce框架

l  DAE(douban app engine):使用Python编写,类似于GAE、SAE,定位为内部的 PaaS 平台。

新浪SAE

新浪Sina App Engine Python,是新浪研发的PaaS(平台即服务)平台,已经开始支持Python了。陈正《Introduction to SAE Python》, http://goo.gl/0lkRm

搜狐邮箱

2007年,搜狐邮件中心基于webpy除了webpy,还用了优秀的WEB框架 – Tornado,发布了"搜狐闪电邮"的第一个Python版本。之后,Python就在搜狐邮件中心蓬勃的发展起来。到今天,搜狐邮箱已经成为国内最大的Python应用之一。而Python也成为了搜狐邮箱使用最广泛的语言。从运维到开发,从业务系统到基础服务,到处都存在它的影子。

知乎

(摘自知乎官方解答)知乎开发主要用的是friendfeed的框架tornado。Tornado异步非阻塞的I/O模型的确让人耳目一新,Tornado的优势主要在于对大量Comet长轮询连接的维护上。这也是FriendFeed开发Tornado的原因-----因为FriendFeed需要实时更新Timeline,而Comet又是目前最好,最流行的方法。由于知乎也有大量长轮询连接需要维护,所以选择Tornado也就在情理之中了。

但是我们也要看到,Tornado不是万金油,由于Tornado的WEB服务器为单线程,一个Request如果阻塞了I/O,那么这个进程将一直挂起,既无法接受新的Request,也无法Finish正在阻塞的其它Request。虽然可以Spawn多个Tornado进程,但是进程这种重量级的东西,Spawn太多会消耗大量的内存资源。这种感觉很像PHP的FastCGI进程那种味道。所以如果是会阻塞I/O的Request一般都是利用Tornado内置的异步HTTP Client交给其它动态后端来做。

所以Tornado在生产中一般前面都要包一层nginx做反向代理,用nginx来做静态文件等大数据量的I/O操作。Tornado的I/O时间实在是太金贵了,在这上面耗不起。

各种游戏公司

国内一些游戏后台使用Python开发,特别是一些网页游戏。可以搜索下有哪些公司在招聘Python游戏开发,会发现有很多公司在招聘。

下面是几篇在PyCon会议上的文章:

l  王健,《中型角色扮演游戏服务器的Python应用》,http://goo.gl/b2R6M

l  赖勇浩,《Python于 webgame 的应用》,http://goo.gl/1QMOT

l  林伟(skywind),《Python游戏开发探索与发现》中告诉大家Python已经足够简化到让策划人员也能写代码,用Python来描述一个游戏的场景。国内WebGame已经超过国外,在网易大量游戏项目用Python相关内容开发。

通过上面的介绍,是不是迫不及待的想学习下Python了。下面推荐学习Python相关工具与文章。

入门资料

l  wiki:http://zh.wikipedia.org/zh/Python

l  Chinaunix的Python论坛资料

l  《OReilly-Learning-Python-4th-Edition-Oct-2009》

l  《简明 Python 教程》(中文),对应的英文版是《A Byte of Python》

l  深入 Python 3,http://goo.gl/cyrUY

工具

l  UliPad 代码编辑工具(本身由python编写)

l  Pydev:eclipse + pydev插件

l  Eric:基于PyQt的自由软件,功能强大。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值