前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python字符串总结大全

Python字符串总结大全

作者头像
全栈程序员站长
发布于 2022-06-28 06:12:51
发布于 2022-06-28 06:12:51
46100
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

目录

操作符

标准类型操作符

对象值的比较

布尔类型

序列操作符切片([]和[:])

成员操作符(in,not in)

连接符(+) 运行时刻字符串连接

编译时字符串连接

普通字符串转化为Unicode字符串

重复操作符(*)

只适用于字符串的操作符

格式化操作符(%)

字符串模板:更简单的替代品

原始字符串操作符(r/R)

Unicode字符串操作符(u/U)

常见的转义字符

字符串索引

编解码

内建函数

序列类型函数

len()

max()和min()

enumerate()

zip()

字符串类型函数

input()

str()和unicode()

chr()和ord()

字符串内建函数

字符串中字符大小写的变换:

去空格和特殊符号

字符串对齐,填充

字符串搜索、统计功能

字符串检测函数

字符串替换、分割

字符串连接

字符串的独特特性

特殊字符串和控制字符(转义字符)

三引号

字符串不变性


字符串类型是 Python里面最常见的类型。我们可以简单地通过在引号间包含字符的方式创建它。Python里面单引号和双引号的作用是相同的。字符串是一种直接量或者说是一种标量,这意味着 Python解释器在处理字符串时是把它作为单一值并且不会包含其他 Python类型的。字符串是不可变类型,就是说改变一个字符串的元素需要新建一个新的字符串。字符串是由独立的字符组成的,并且这些字符可以通过切片操作顺序地访问。

操作符

标准类型操作符

对象值的比较

所有的内建类型均支持比较运算,比较运算返回布尔值True或False。

布尔类型

在做比较的时候,字符串按照ASCII码的大小来进行比较。

序列操作符切片([]和[:])

除了索引,字符串还支持切片。索引可以得到单个字符,而切片可以获取子字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(word[0:2])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(word[2:5])

注意切片的开始总是被包括在结果中,而结束不被包括(半开半闭)。这使得 s[:i] + s[i:] 总是等于s

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(word[:2]+word[2:])

print(word[:3]+word[3:])

切片的索引有默认值;省略开始索引时默认为0,省略结束索引时默认为到字符串的结束:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(word[:2])
print(word[3:])
print(word[-2:])

也可以这么理解切片:将索引视作指向字符之间,第一个字符的左侧标为0,最后一个字符的右侧标为 n ,其中 n 是字符串长度。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1

第一行数标注了字符串0…6的索引的位置,第二行标注了对应的负的索引。那么从i到j的切片就包括了标有i和j的位置之间的所有字符。

对于使用非负索引的切片,如果索引不越界,那么得到的切片长度就是起止索引之差。例如,word[1:3]的长度为2。

试图使用过大的索引会产生一个错误:

但是,切片中的越界索引会被自动处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(word[4:52])

print(word[45:])

成员操作符(in,not in)

成员操作符用于判断一个字符或者一个子串(中的字符)是否出现在另一个字符串中。出现则返回True,否则返回False注意,成员操作符不是用来判断一个字符串是否包含另一个字符串的,这样的功能由find()或者 index(还有它们的兄弟:rfind()和 rindex()函数)来完成。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('bc' in 'abcd')
print('n'in 'abcd')
print('fdf' not in 'abcd' )
print('a'not in 'abcd')

连接符(+) 运行时刻字符串连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('abc'+'de')
print('abc'+' '+'de')

类似于join()方法

str.join(sequence)

sequence — 要连接的元素序列。返回通过指定字符连接序列中元素后生成的新字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s1 = "-"
s2 = ""
seq = ("r", "u", "n", "o", "o", "b") # 字符串序列
print (s1.join( seq ))
print (s2.join( seq ))

编译时字符串连接

在源码中把几个字符串连在一起写,以此来构建新的字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
foo='hello'"world"

通过这种方法,你可以把长的字符串分成几部分来写,而不用加反斜杠。

普通字符串转化为Unicode字符串

如果把一个普通字符串和一个 Unicode字符串做连接处理, Python会在连接操作前先把普通字符串化为 Unicode字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
str='hello'+u' '+'world'+u'!'
print(str)

重复操作符(*)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print( 3 * 'un' + 'ium')

只适用于字符串的操作符

格式化操作符(%)

例:

十六进制输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('%x'%108)
print('%X'%108)
print('%#x'%108)
print('%#X'%108)

浮点型和科学计数法形式输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('%f'%1234.4567890)
print('%.2f'%1234.4567890)
print('%E'%1234.4567890)
print('%e'%1234.4567890)
print('%g'%1234.4567890)
print('%G'%1234.4567890)

整型和字符串输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('%+d'%4)
print('%+d'%-4)
print('we are at %d%%'%100)
print('Your host is:%s'%'earth')
print('Host:%s\tPort:%d'%('mars',80))
num=123
print('dec:%d/oct:%#o/hex:%#X'%(num,num,num))
print('MM/DD/YY:%02d/%02d/%d'%(2,15,67))

字符串模板:更简单的替代品

暂时先不学

原始字符串操作符(r/R)

在原始字符串中,所有的字符都是直接按照字面意思来使用,没有转义特殊或不能打印的字符。能够比较方便创建正则表达式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(r'%d可以显示啦')

Unicode字符串操作符(u/U)

Unicode字符串操作符,大写的(U)和小写的(u)是在 Python16中和 Unicode字符串一起被引入的,它用来把标准字符串或者是包含 Unicode字符的字符串转换成完全的 Unicode字符串对象。

常见的转义字符

  • \’ 转义,单引号
  • \ 在行末时,表示续行符
  • \b 退格
  • \n 换行
  • \r 回车
  • \t 横向制表符
  • \xyy 十六进制,假设yy为0a,\x0a表示换行

字符串索引

字符串是可以被索引(下标访问)的,第一个字符索引是0。单个字符并没有特殊的类型,只是一个长度为一的字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
word = 'Python'
print(word[0])
print(word[5])

索引也可以用负数,这种会从右边开始数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(word[-5])
print(word[-4])
print(word[-3])

注意-0和0是一样的,所以负数索引从-1开始。

编解码

python3中,字符串是用Unicode编码的,在内存中,一个字符对应多个字节,当字符串用来存储和传输时,就需要将字符串转化为字节为单位的bytes

python中的bytes类型用b’xxx’表示

用Unicode编码的字符串可以使用encode()方法转化为bytes

反过来,从存储介质和传输流中获取的bytes类型需要使用decode()方法转化为字符串

内建函数

序列类型函数

len()

返回对象长度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s='jfkhferhgergerugsjfbjha'
print(len(s))
代码语言:javascript
代码运行次数:0
运行
复制

max()和min()

返回字符串中ASCII最大或最小的字符

enumerate()

用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

enumerate(sequence, [start=0])

sequence — 一个序列、迭代器或其他支持迭代对象。

start — 下标起始位置。

返回 enumerate(枚举) 对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
season=['Spring','Summer','Fall','Winter']
print(list(enumerate(season)))
print(list(enumerate(season,start=1))) #下标从1开始

普通for循环和使用enumerate的比较:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
season = ['Spring', 'Summer', 'Fall', 'Winter']
i=0
for _ in season:
    print(i,season[i])
    i+=1
print()
for i,element in enumerate(season):
    print(i,element)

zip()

用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

zip([iterable, …])

iterabl — 一个或多个迭代器; 返回元组列表。 在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a=[1,2,3]
b=[4,5,6]
c=[4,5,6,7,8]
print(list(zip(a,b)))
print(list(zip(a,c)))
print(list(zip(a,b,c)))
zipped=zip(a,c)
print(list(zip(*zipped))) #与zip相反,*zipped可理解为解压,返回二维矩阵式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s,t='fos','jhjh'
print(list(zip(s,t)))

字符串类型函数

input()

Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型

input([prompt]) prompt: 提示信息

str()和unicode()

str()和unicode()函数都是工厂函数,就是说产生所对应的类型的对象。它们接受一个任意类型的对象,然后创建该对象的可打印的或者Unicode的字符串表示。

chr()和ord()

chr():将整数转换成该编码对应的字符串(一个字符)。

ord():将字符串(一个字符)转换成对应的编码(整数)。

字符串内建函数

字符串中字符大小写的变换:

1 str.lower() :转换str中所有大写字符为小写

2 str.upper() :转换str中所有小写字符为大写

3 str.swapcase() :翻转str中的大小写

4 str.title() :返回标题化的字符串。所有单词首字母大写,其余小写

5 str.capitalize() :把字符串的第一个字母大写,其余小写

去空格和特殊符号

1 str.strip() :去掉字符串左边和右边的空格和换行符

2 str.strip(str1) :去掉字符串左边和右边的str1

3 str.lstrip() :去掉字符串左边的空格和换行符

4 str.rstrip() :去掉字符串右边的空格和换行符

字符串对齐,填充

1 str.ljust(width) : 返回width长度的字符串,左对齐,不足的用空格补充

2 str.rjust(width) : 返回width长度的字符串,右对齐,不足的用空格补充

3 str.center(width) : 返回width长度的字符串,居中对齐,不足的用空格补充

4 str.zfill(width) :返回长度为width长度的字符串,原字符串str右对齐,前面补充0

字符串搜索、统计功能

str.find(string,beg=0,end=len(str)) : 检测string是否包含在str中,beg和end指定检测范围,如果找到则返回开始的索引,否则返回-1

str.rfind(string,beg=0,end=len(str)) : 检测string是否包含在str中,beg和end指定检测范围,如果找到则返回开始的索引,否则返回-1,类似find只不过是从右边往左边开始找。

str.count(string,beg=0,end=len(str)) : 返回string在str中出现的次数,在beg-end检测范围内出现则返回出现的次数。

str.index(string,beg=0,end=len(str)) : 和find方法一样,只不过如果string不在str中会报异常。

str.rindex(string,beg=0,end=len(str)):和index方法一样,不过是从右边开始。

字符串检测函数

str.isalnum() :如果str至少有一个字符,并且所有字符都是字母或者数字,则返回true,否则返回false

str.isalpha() : 如果str至少有一个字符,并且所有字符都是字母,则返回true,否则返回false

str.isdigit() :如果str至少有一个字符,并且所有字符都是数字,则返回true,否则返回false

str.isspace() :如果str至少有一个字符,并且所有字符都是空格,则返回true,否则返回false

str.islower() :如果str至少有一个字符,并且所有字符都是小写字母,则返回true,否则返回false

str.isupper() :如果str至少有一个字符,并且所有字符都是大写字母,则返回true,否则返回false

str.istitle(): 如果str每个单词首字母大写其它小写,则返回true,否则返回false

str.startswith(prefix[,start[,end]]) :如果str是以prefix开头,则返回true,否则返回false

str.endswith(suffix[,start[,end]]) :如果str是以prefix结尾,则返回true,否则返回false

字符串替换、分割

str.replace(str1,str2,num=str.count(str1)) //替换指定次数的str1为str2,替换次数不超过num次。

str.split(str1=”“,num=str.count(str1)) :以str1为分隔符,把str分成一个list。num表示分割的次数。默认的分割符为空白字符

str.rsplit(str1=”“,num=str.count(str1)) :和split相似,只是从右边开始分割

str.splitlines(num=str.count(“\n”’)) :把str按行分割符分为一个list,num如果指定则是分割成多少行

字符串连接

str.join(seq) :把seq代表的序列(字符串序列),用str连接起来

字符串的独特特性

特殊字符串和控制字符(转义字符)

三引号

字符串字面值可以跨行连续输入。一种方式是用三重引号:”””…”””或”’…”’。字符串中的回车换行会自动包含到字符串中,如果不想包含,在行尾添加一个\即可。如下例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('''Usage: thingy [OPTIONS]

     -h                        Display this usage message

     -H hostname               Hostname to connect to

""")

将产生如下输出(注意最开始print(“””\的换行没有包括进来):

字符串不变性

字符串不能被修改,是 immutable 的。

向字符串的某个索引位置赋值会产生一个错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
word[0]='J'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
word[2:]='py'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
如果需要一个不同的字符串,应当新建一个:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('J'+word[2:])
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(word[2:]+'py')

更多Python框架梳理,请参考: 【Python学习】Python最全总结

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/132966.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月9,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
从Java小白到收获BAT等offer,分享我这两年的经验和感悟
常想,人生最有趣莫过于前路未知。于是我常常羡慕那些个“金梁古温”笔下随遇而安、随性而为、随缘而爱的浪子们。比如陆小凤,比如叶开。
猿天地
2019/05/15
6650
从Java小白到收获BAT等offer,分享我这两年的经验和感悟
科班和非科班都适用的 Java 学习路线
很多面试官在基础考察的时候都是直接是根据书来问,因为这些面试官也是从学生时代过来的,而他们可能和你看的是同一本书。也就是如果你和面试官的知识体系结构一样的话,面试官问出来的问题,你自然可以回答得很好。下面是书籍推荐:
乔戈里
2019/03/02
1.1K0
小白和进阶都适用! java学习路上必看的书单
男怕入错行,女怕嫁错郎,学java最怕看错书!也是很久之前就想写这篇了,以前也零零星星的推荐过几本书,但是始终没有这样认真的整理一篇出来,这篇文章就是和大家探讨一下哪个阶段,应该看什么书,需要掌握到什么程度。
微笑的小小刀
2021/03/24
6690
Java继承知识点
相关连接 https://www.jianshu.com/u/9fe0904bd4c6 https://note.youdao.com/share/?id=40e70c92e16edf90b6c502
chenchenchen
2022/11/29
3880
Java继承知识点
给Java程序猿们推荐一些值得一看的好书
很多程序员们往往有看书的冲动,但不知道看哪些书,下面我就给各位Java程序猿们推荐一些好书(每本书的作者会加粗标红),其中绝大多数都是我自己平时在看的书,也算是我对于平时读的书做一个小总结和读后感吧。
三哥
2018/06/27
3830
你不可错过的Java学习资源清单(包含社区、大牛、专栏、书籍等)
作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条、网易、滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验、求职心得和成长感悟,以及作为程序员的思考和见解。
程序员黄小斜
2019/03/11
1.4K0
95后妹子面试的那些"套路"(附带个人书籍推荐)
最近有很多朋友问我一些面试题,或者说准备面试了,怎么复习啊. 孔孔老师就上线了…正好趁着早上不想学习, 就再把这一块总结总结. 个人拙见(毕竟我还是很low的…) 夹杂部分书推荐
kirito-moe
2019/04/30
9600
周末再聊聊Java学习路线
我相信这些读者或多或少都有一些 Java 基础,但由于看不到全貌,学了一段时间很容易迷失。所以我在寻思着能不能写一个学习的地图或者路线,让读者能知道下一步该学什么,自己离大厂的 offer还有多远的距离。
Java3y
2020/12/31
7550
周末再聊聊Java学习路线
从零讲JAVA ,给你一条清晰地学习道路!该学什么就学什么!!
1.计算机基础: 1.1数据结构基础: 主要学习: 1.向量,链表,栈,队列和堆,词典。熟悉 2.树,二叉搜索树。熟悉 3.图,有向图,无向图,基本概念 4.二叉搜索A,B,C类熟练,9大排序熟悉。 5.树的前中后,层次,之字,最短路。 6.KMP等字符串算法。 1.2操作系统: 主要学习: 1.进程,线程,进程线程区别。进程间通信 2.进程调度算法理解 3.存储,虚拟内存,分页分段,内存调度算法 4.文件系统,链式,索引 5.死锁:原因,避免,解除k 6.Linux基本操作命令,会一门脚
三哥
2018/06/15
6200
从零讲JAVA ,给你一条清晰地学习道路!该学什么就学什么!!
 原文链接:https://zhuanlan.zhihu.com/p/25296859
黑泽君
2018/10/11
4600
计算机科班Java开发好书推荐
这些书全部都是我看过的,大部分都至少读了一遍到两遍,且还整理了笔记,少部分是挑的重点章节看的。
乔戈里
2019/01/07
7600
Java面试经验+最新BAT面试资料分享给大家
最近3个月一口气面了十几家公司的Java开发岗,大大小小的面试笔试加起来快20场,收获很多。本人即将毕业,在一家国企实习做java开发,感觉自己很水,刚开始面试时发现自己掌握的东西与外面企业流行的技术有些代差,所以一边面试一边总结,感觉面试时问的东西明显和自己平常了解的不太一样,所以给自己做了一个总结,希望对以后的面试有所启发。
用户4447430
2019/05/07
8060
Java学习之路 -- Java怎么学?
当时,作为懵懂的小白,大一学习了c和c++,还有数据结构,后来才自学的java。有了c++的基础,其实学java确实感觉挺容易上手。如果没有c或者c++的基础,建议开始需要先把java的基础打好,基础是指什么?基础的语法,能用!至于源码,不建议在刚刚开始学就看源码,绝对劝退!!!
秦怀杂货店
2021/03/29
1.2K0
java 进阶之路(书籍推荐)
学习Java,书籍是必不可少的学习工具之一,尤其是对于自学者而言。废话不多说,下边就给大家推荐一些Java进阶的好书。
马士兵的朋友圈
2020/09/08
1.7K0
java 进阶之路(书籍推荐)
Java工程师核心书单推荐
书籍是获取知识的最好来源之一。技术书籍浩如烟海,市场上有不少《XXX入门到精通》,《XXX王者归来》,《21天学会XXX》这样的书,当然也有不少经典,个人的精力有限,这些经典不可能都通读。所以·,博主尝试整理一个Java工程师所需知识的核心书单,尽可能优中选优,挑选出Java工程师必备知识的一些最核心、最经典的书籍,希望能一起学习,一起进步。
三分恶
2021/03/16
6370
Java工程师核心书单推荐
读者上岸阿里的硬核经验分享
大家好,我是石头哥,最近正值校招季,这里分享一篇硬核校招面经,希望对大家有帮助。
程序猿石头
2021/09/24
9700
读者上岸阿里的硬核经验分享
Java学习必备书籍推荐终极版!
很早就想把书单更新一下了,昨晚加今天早上花了几个时间对之前的书单进行了分类和补充完善。虽是终极版,但一定还有很多不错的 Java 书籍我没有添加进去,会继续完善下去。希望这篇文章对你有帮助,不要再无书可看。
乔戈里
2019/05/13
1.5K0
如何学Java?求各位指条路吧~
当时,作为懵懂的小白,大一学习了c和c++,还有数据结构,后来才自学的java。有了c++的基础,其实学java确实感觉挺容易上手。如果没有c或者c++的基础,建议开始需要先把java的基础打好,基础是指什么?基础的语法,能用!至于源码,不建议在刚刚开始学就看源码,绝对劝退!!!
秦怀杂货店
2022/02/17
6360
给Java程序猿们推荐一些值得一看的好书
本文介绍了如何利用Java编程实现一个简单的RESTful API,包括定义API端点和请求方法,处理请求和响应,以及使用Spring Boot和Kotlin构建Web应用程序。同时,还向读者推荐了一些值得阅读的书籍,以帮助读者进一步提高自己的Java编程技能。
Java后端工程师
2017/12/14
2.4K0
Java后端工程师必备书单(含大后端方向相关书籍)
作者黄小斜,斜杠青年,某985硕士,阿里研发工程师,于2018 年秋招拿到 BAT 头条、网易、滴滴等 8 个大厂 offer
程序员黄小斜
2019/03/11
3.2K0
推荐阅读
相关推荐
从Java小白到收获BAT等offer,分享我这两年的经验和感悟
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 操作符
    • 标准类型操作符
      • 对象值的比较
      • 布尔类型
    • 序列操作符切片([]和[:])
    • 成员操作符(in,not in)
    • 连接符(+) 运行时刻字符串连接
    • 编译时字符串连接
    • 普通字符串转化为Unicode字符串
    • 重复操作符(*)
  • 只适用于字符串的操作符
    • 格式化操作符(%)
    • 字符串模板:更简单的替代品
    • 原始字符串操作符(r/R)
    • Unicode字符串操作符(u/U)
  • 常见的转义字符
  • 字符串索引
  • 编解码
  • 内建函数
    • 序列类型函数
      • len()
      • max()和min()
      • enumerate()
      • zip()
    • 字符串类型函数
      • input()
      • str()和unicode()
      • chr()和ord()
  • 字符串内建函数
    • 字符串中字符大小写的变换:
    • 去空格和特殊符号
    • 字符串对齐,填充
    • 字符串搜索、统计功能
    • 字符串检测函数
    • 字符串替换、分割
    • 字符串连接
  • 字符串的独特特性
    • 特殊字符串和控制字符(转义字符)
    • 三引号
    • 字符串不变性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文