python中字符串对象提供了很多方法来操作字符串,功能相当丰富。

print(dir(str))

[..........'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

这些方法的使用说明见官方文档:string methods,本文对它们进行详细解释,各位以后可将本文当作手册。

这里没有模式匹配(正则)相关的功能。python中要使用模式匹配相关的方法操作字符串,需要import re导入re模块。关于正则模式匹配,参见:re Module Contents

注意,python中字符串是不可变对象,所以所有修改和生成字符串的操作的实现方法都是另一个内存片段中新生成一个字符串对象。例如,'abc'.upper()将会在划分另一个内存片段,并将返回的ABC保存在此内存中。

下文出现的"S"表示待操作的字符串。本文没有对casefold,encode,format,format_map进行介绍,前两者和unicode有关,后两者内容有点太多。

1.大小写转换

1.1 lower、upper

S.lower()

S.upper()

返回S字符串的小写、大写格式。(注意,这是新生成的字符串,在另一片内存片段中,后文将不再解释这种行为)

例如:

  1. >>> print('ab XY'.lower())
  2. ab xy
  3. >>> print('ab XY'.upper())
  4. AB XY

1.2 title、capitalize

S.title()

S.capitalize()

前者返回S字符串中所有单词首字母大写且其他字母小写的格式,后者返回首字母大写、其他字母全部小写的新字符串。

例如:

  1. >>> print('ab XY'.title())
  2. Ab Xy
  3. >>> print('abc DE'.capitalize())
  4. Abc de

1.3 swapcase

S.swapcase()

swapcase()对S中的所有字符串做大小写转换(大写-->小写,小写-->大写)。

  1. >>> print('abc XYZ'.swapcase())
  2. ABC xyz

2.isXXX判断

2.1 isalpha,isdecimal,isdigit,isnumeric,isalnum

S.isdecimal()

S.isdigit()

S.isnumeric()

S.isalpha()

S.isalnum()

测试字符串S是否是数字、字母、字母或数字。对于非Unicode字符串,前3个方法是等价的。

例如:

  1. >>> print('34'.isdigit())
  2. True
  3. >>> print('abc'.isalpha())
  4. True
  5. >>> print('a34'.isalnum())
  6. True

2.2 islower,isupper,istitle

S.islower()

S.isupper()

S.istitle()

判断是否小写、大写、首字母大写。要求S中至少要包含一个字符串字符,否则直接返回False。例如不能是纯数字。

注意,istitle()判断时会对每个单词的首字母边界判断。例如,word1 Word2word1_Word2word1()Word2中都包含两个单词,它们的首字母都是"w"和"W"。因此,如果用istitle()去判断它们,将返回False,因为w是小写。

例如:

  1. >>> print('a34'.islower())
  2. True
  3. >>> print('AB'.isupper())
  4. True
  5. >>> print('Aa'.isupper())
  6. False
  7. >>> print('Aa Bc'.istitle())
  8. True
  9. >>> print('Aa_Bc'.istitle())
  10. True
  11. >>> print('Aa bc'.istitle())
  12. False
  13. >>> print('Aa_bc'.istitle())
  14. False
  15. # 下面的返回False,因为非首字母C不是小写
  16. >>> print('Aa BC'.istitle())
  17. False

2.3 isspace,isprintable,isidentifier

S.isspace()

S.isprintable()

S.isidentifier()

分别判断字符串是否是空白(空格、制表符、换行符等)字符、是否是可打印字符(例如制表符、换行符就不是可打印字符,但空格是)、是否满足标识符定义规则。

例如:

1.判断是否为空白。没有任何字符是不算是空白。

  1. >>> print(' '.isspace())
  2. True
  3. >>> print(' \t'.isspace())
  4. True
  5. >>> print('\n'.isspace())
  6. True
  7. >>> print(''.isspace())
  8. False
  9. >>> print('Aa BC'.isspace())
  10. False

2.判断是否是可打印字符。

  1. >>> print('\n'.isprintable())
  2. False
  3. >>> print('\t'.isprintable())
  4. False
  5. >>> print('acd'.isprintable())
  6. True
  7. >>> print(' '.isprintable())
  8. True
  9. >>> print(''.isprintable())
  10. True

3.判断是否满足标识符定义规则。

标识符定义规则为:只能是字母或下划线开头、不能包含除数字、字母和下划线以外的任意字符。

  1. >>> print('abc'.isidentifier())
  2. True
  3. >>> print('2abc'.isidentifier())
  4. False
  5. >>> print('abc2'.isidentifier())
  6. True
  7. >>> print('_abc2'.isidentifier())
  8. True
  9. >>> print('_abc_2'.isidentifier())
  10. True
  11. >>> print('_Abc_2'.isidentifier())
  12. True
  13. >>> print('Abc_2'.isidentifier())
  14. True

3.填充

3.1 center

S.center(width[, fillchar])

将字符串居中,左右两边使用fillchar进行填充,使得整个字符串的长度为width。fillchar默认为空格。如果width小于字符串的长度,则无法填充直接返回字符串本身(不会创建新字符串对象)。

例如:

1.使用下划线填充并居中字符串

  1. >>> print('ab'.center(4,'_'))
  2. _ab_
  3. >>> print('ab'.center(5,'_'))
  4. __ab_

2.使用默认的空格填充并居中字符串

  1. >>> print('ab'.center(4))
  2. ab
  3. >>> print(len('ab'.center(4)))
  4. 4

3.width小于字符串长度

  1. >>> print('abcde'.center(3))
  2. abcde

3.2 ljust和rjust

S.ljust(width[, fillchar])

S.rjust(width[, fillchar])

ljust()使用fillchar填充在字符串S的右边,使得整体长度为width。rjust()则是填充在左边。如果不指定fillchar,则默认使用空格填充。

如果width小于或等于字符串S的长度,则无法填充,直接返回字符串S(不会创建新字符串对象)。

例如:

  1. >>> print('xyz'.ljust(5,'_'))
  2. xyz__
  3. >>> print('xyz'.rjust(5,'_'))
  4. __xyz

3.3 zfill

S.zfill(width)

用0填充在字符串S的左边使其长度为width。如果S前有正负号+/-,则0填充在这两个符号的后面,且符号也算入长度。

如果width小于或等于S的长度,则无法填充,直接返回S本身(不会创建新字符串对象)。

  1. >>> print('abc'.zfill(5))
  2. 00abc
  3. >>> print('-abc'.zfill(5))
  4. -0abc
  5. >>> print('+abc'.zfill(5))
  6. +0abc
  7. >>> print('42'.zfill(5))
  8. 00042
  9. >>> print('-42'.zfill(5))
  10. -0042
  11. >>> print('+42'.zfill(5))
  12. +0042

4.子串搜索

4.1 count

S.count(sub[, start[, end]])

返回字符串S中子串sub出现的次数,可以指定从哪里开始计算(start)以及计算到哪里结束(end),索引从0开始计算,不包括end边界。

例如:

  1. >>> print('xyabxyxy'.count('xy'))
  2. 3
  3. # 次数2,因为从index=1算起,即从'y'开始查找,查找的范围为'yabxyxy'
  4. >>> print('xyabxyxy'.count('xy',1))
  5. 2
  6. # 次数1,因为不包括end,所以查找的范围为'yabxyx'
  7. >>> print('xyabxyxy'.count('xy',1,7))
  8. 1
  9. # 次数2,因为查找的范围为'yabxyxy'
  10. >>> print('xyabxyxy'.count('xy',1,8))
  11. 2

4.2 endswith和startswith

S.endswith(suffix[, start[, end]])

S.startswith(prefix[, start[, end]])

endswith()检查字符串S是否以suffix结尾,返回布尔值的True和False。suffix可以是一个元组(tuple)。可以指定起始start和结尾end的搜索边界。

同理startswith()用来判断字符串S是否是以prefix开头。

例如:

1.suffix是普通的字符串时。

  1. >>> print('abcxyz'.endswith('xyz'))
  2. True
  3.  
  4. # False,因为搜索范围为'yz'
  5. >>> print('abcxyz'.endswith('xyz',4))
  6. False
  7.  
  8. # False,因为搜索范围为'abcxy'
  9. >>> print('abcxyz'.endswith('xyz',0,5))
  10. False
  11. >>> print('abcxyz'.endswith('xyz',0,6))
  12. True

2.suffix是元组(tuple)时,只要tuple中任意一个元素满足endswith的条件,就返回True。

  1. # tuple中的'xyz'满足条件
  2. >>> print('abcxyz'.endswith(('ab','xyz')))
  3. True
  4.  
  5. # tuple中'ab'和'xy'都不满足条件
  6. >>> print('abcxyz'.endswith(('ab','xy')))
  7. False
  8.  
  9. # tuple中的'z'满足条件
  10. >>> print('abcxyz'.endswith(('ab','xy','z')))
  11. True

4.3 find,rfind和index,rindex

S.find(sub[, start[, end]])

S.rfind(sub[, start[, end]])¶

S.index(sub[, start[, end]])

S.rindex(sub[, start[, end]])

find()搜索字符串S中是否包含子串sub,如果包含,则返回sub的索引位置,否则返回"-1"。可以指定起始start和结束end的搜索位置。

index()和find()一样,唯一不同点在于当找不到子串时,抛出ValueError错误。

rfind()则是返回搜索到的最右边子串的位置,如果只搜索到一个或没有搜索到子串,则和find()是等价的。

同理rindex()。

例如:

  1. >>> print('abcxyzXY'.find('xy'))
  2. 3
  3. >>> print('abcxyzXY'.find('Xy'))
  4. -1
  5. >>> print('abcxyzXY'.find('xy',4))
  6. -1
  7. >>> print('xyzabcabc'.find('bc'))
  8. 4
  9. >>> print('xyzabcabc'.rfind('bc'))
  10. 7
  11. >>> print('xyzabcabc'.rindex('bcd'))
  12. Traceback (most recent call last):
  13. File "<stdin>", line 1, in <module>
  14. ValueError: substring not found

可以使用in操作符来判断字符串S是否包含子串sub,它返回的不是索引位置,而是布尔值。

  1. >>> 'xy' in 'abxycd'
  2. True
  3. >>> 'xyz' in 'abxycd'
  4. False

5.替换

5.1 replace

S.replace(old, new[, count])

将字符串中的子串old替换为new字符串,如果给定count,则表示只替换前count个old子串。如果S中搜索不到子串old,则无法替换,直接返回字符串S(不创建新字符串对象)。

  1. >>> print('abcxyzoxy'.replace('xy','XY'))
  2. abcXYzoXY
  3. >>> print('abcxyzoxy'.replace('xy','XY',1))
  4. abcXYzoxy
  5. >>> print('abcxyzoxy'.replace('mn','XY',1))
  6. abcxyzoxy

5.2 expandtabs

S.expandtabs(N)

将字符串S中的\t替换为一定数量的空格。默认N=8。

注意,expandtabs(8)不是将\t直接替换为8个空格。例如'xyz\tab'.expandtabs()会将\t替换为5个空格,因为"xyz"占用了3个字符位。

所以,在替换"\t"为空格时,会减掉"\t"前面的字符数量。如果"\t"的前面正好没有字符,则直接将"\t"替换为N个空格。

另外,它不会替换换行符(\n\r)。

例如:

  1. >>> '01\t012\t0123\t01234'.expandtabs(4)
  2. '01 012 0123 01234' --> 2个空格、1个空格、4个空格
  3. >>> '01\t012\t0123\t01234'.expandtabs(8)
  4. '01 012 0123 01234' --> 6个空格、5个空格、4个空格
  5. >>> '01\t012\t0123\t01234'.expandtabs(7)
  6. '01 012 0123 01234' --> 5个空格、4个空格、3个空格
  7. >>> print('012\t0123\n01234'.expandtabs(7))
  8. 012 0123 --> 4个空格
  9. 01234

5.3 translate和maketrans

S.translate(table)

static str.maketrans(x[, y[, z]])

str.maketrans()生成一个字符一 一映射的table,然后使用translate(table)对字符串S中的每个字符进行映射。

如果你熟悉Linux,就知道tr命令,translate()实现的功能和tr是类似的。

例如,现在想要对"I love Fairy"做一个简单的加密,将里面部分字符都替换为数字,这样别人就不知道转换后的这句话是什么意思。

  1. >>> in_str='abcxyz'
  2. >>> out_str='123456'
  3. # maketrans()生成映射表
  4. >>> map_table=str.maketrans(in_str,out_str)
  5. # 使用translate()进行映射
  6. >>> my_love='I love Fairy'
  7. >>> result=my_love.translate(map_table)
  8. >>> print(result)
  9. I love F1ir5

注意,maketrans(x[, y[, z]])中的x和y都是字符串,且长度必须相等。

如果maketrans(x[, y[, z]])给定了第三个参数z,则这个参数字符串中的每个字符都会被映射为None。

例如,不替换"a"和"y"。

  1. >>> in_str='abcxyz'
  2. >>> out_str='123456'
  3. >>> map_table=str.maketrans(in_str,out_str,'ay')
  4. >>> my_love='I love Fairy'
  5. >>> result=my_love.translate(map_table)
  6. >>> print(result)
  7. I love Fir

6.分割

6.1 partition和rpartition

S.partition(sep)

S.rpartition(sep)

搜索字符串S中的子串sep,并从sep处对S进行分割,最后返回一个包含3元素的元组:sep左边的部分是元组的第一个元素,sep自身是元组的二个元素,sep右边是元组的第三个元素。

partition(sep)从左边第一个sep进行分割,rpartition(sep)从右边第一个sep进行分割。

如果搜索不到sep,则返回的3元素元组中,有两个元素为空。partition()是后两个元素为空,rpartition()是前两个元素为空。

例如:

  1. # 只搜索到一个sep时,两者结果相同
  2. >>> print('abcxyzopq'.partition('xy'))
  3. ('abc', 'xy', 'zopq')
  4. >>> print('abcxyzopq'.rpartition('xy'))
  5. ('abc', 'xy', 'zopq')
  6. # 搜索到多个sep时,分别从左第一个、右第一个sep分割
  7. >>> print('abcxyzxyopq'.partition('xy'))
  8. ('abc', 'xy', 'zxyopq')
  9. >>> print('abcxyzxyopq'.rpartition('xy'))
  10. ('abcxyz', 'xy', 'opq')
  11. # 搜索不到sep
  12. >>> print('abcxyzxyopq'.partition('xyc'))
  13. ('abcxyzxyopq', '', '')
  14. >>> print('abcxyzxyopq'.rpartition('xyc'))
  15. ('', '', 'abcxyzxyopq')

6.2 split、rsplit和splitlines

S.split(sep=None, maxsplit=-1)

S.rsplit(sep=None, maxsplit=-1)

S.splitlines([keepends=True])

都是用来分割字符串,并生成一个列表。

split()根据sep对S进行分割,maxsplit用于指定分割次数,如果不指定maxsplit或者给定值为"-1",则会从左向右搜索并且每遇到sep一次就分割直到搜索完字符串。如果不指定sep或者指定为None,则改变分割算法:以空格为分隔符,且将连续的空白压缩为一个空格。

rsplit()split()是一样的,只不过是从右边向左边搜索。

splitlines()用来专门用来分割换行符。虽然它有点像split('\n')split('\r\n'),但它们有些区别,见下文解释。

首先是split()的示例分析(rsplit()示例略)。

  1. # sep为单个字符时
  2. >>> '1,2,3'.split(',')
  3. ['1', '2', '3']
  4. >>> '1,2,3'.split(',',1)
  5. ['1', '2,3'] # 只分割了一次
  6. >>> '1,2,,3'.split(',')
  7. ['1', '2', '', '3'] # 不会压缩连续的分隔符
  8. >>> '<hello><><world>'.split('<')
  9. ['', 'hello>', '>', 'world>']
  10. # sep为多个字符时
  11. >>> '<hello><><world>'.split('<>')
  12. ['<hello>', '<world>']
  13. # 不指定sep时
  14. >>> '1 2 3'.split()
  15. ['1', '2', '3']
  16. >>> '1 2 3'.split(maxsplit=1)
  17. ['1', '2 3']
  18. >>> ' 1 2 3 '.split()
  19. ['1', '2', '3']
  20. >>> ' 1 2 3 \n'.split()
  21. ['1', '2', '3']
  22. # 显式指定sep为空格、制表符、换行符时
  23. >>> ' 1 2 3 \n'.split(' ')
  24. ['', '1', '', '2', '', '3', '', '\n']
  25. >>> ' 1 2 3 \n'.split('\t')
  26. [' 1 2 3 \n']
  27. >>> ' 1 2\n3 \n'.split('\n')
  28. [' 1 2', '3 ', ''] # 注意列表的最后一项''
  29. >>> ''.split('\n')
  30. ['']

再是splitlines()的示例分析。

splitlines()中可以指定各种换行符,常见的是\n\r\r\n。如果指定keepends为True,则保留所有的换行符。

  1. >>> 'ab c\n\nde fg\rkl\r\n'.splitlines()
  2. ['ab c', '', 'de fg', 'kl']
  3. >>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True)
  4. ['ab c\n', '\n', 'de fg\r', 'kl\r\n']

将split()和splitlines()相比较一下:

  1. #### split()
  2. >>> ''.split('\n')
  3. [''] # 因为没换行符可分割
  4. >>> 'One line\n'.split('\n')
  5. ['One line', '']
  6. #### splitlines()
  7. >>> "".splitlines()
  8. [] # 因为没有换行符可分割
  9. >>> 'Two lines\n'.splitlines()
  10. ['Two lines']

7.join

S.join(iterable)

将可迭代对象(iterable)中的元素使用S连接起来。注意,iterable中必须全部是字符串类型,否则报错。

如果你还是python的初学者,还不知道iterable是什么,却想来看看join的具体语法,那么你可以暂时将它理解为:字符串string、列表list、元组tuple、字典dict、集合set。

例如:

1.字符串

  1. >>> L='python'
  2. >>> '_'.join(L)
  3. 'p_y_t_h_o_n'

2.元组

  1. >>> L1=('1','2','3')
  2. >>> '_'.join(L1)
  3. '1_2_3'

3.集合。注意,集合无序。

  1. >>> L2={'p','y','t','h','o','n'}
  2. >>> '_'.join(L2)
  3. 'n_o_p_h_y_t'

4.列表

  1. >>> L2=['py','th','o','n']
  2. >>> '_'.join(L2)
  3. 'py_th_o_n'

5.字典

  1. >>> L3={'name':"malongshuai",'gender':'male','from':'China','age':18}
  2. >>> '_'.join(L3)
  3. 'name_gender_from_age'

6.iterable参与迭代的每个元素必须是字符串类型,不能包含数字或其他类型。

  1. >>> L1=(1,2,3)
  2. >>> '_'.join(L1)
  3. Traceback (most recent call last):
  4. File "<stdin>", line 1, in <module>
  5. TypeError: sequence item 0: expected str instance, int found

以下两种也不能join。

  1. >>> L1=('ab',2)
  2. >>> L2=('AB',{'a','cd'})

将join()时的元素连接符指定为空时,则会将可迭代对象的每个元素组成一个连接起来的字符串。有时候,这是很有用的。

  1. >>> L=['a','b','c','d']
  2. >>> ''.join(L)
  3. 'abcd'

8.修剪:strip、lstrip和rstrip

S.strip([chars])

S.lstrip([chars])

S.rstrip([chars])

分别是移除左右两边、左边、右边的字符char。如果不指定chars或者指定为None,则默认移除空白(空格、制表符、换行符)。

唯一需要注意的是,chars可以是多个字符序列。在移除时,只要是这个序列中的字符,都会被移除。

例如:

1.移除单个字符或空白。

  1. >>> ' spacious '.lstrip()
  2. 'spacious '
  3.  
  4. >>> ' spacious '.rstrip()
  5. ' spacious'
  6.  
  7. >>> 'spacious '.lstrip('s')
  8. 'pacious '
  9.  
  10. >>> 'spacious'.rstrip('s')
  11. 'spaciou'

2.移除字符序列中的字符。

  1. >>> print('www.example.com'.lstrip('cmowz.'))
  2. example.com
  3. >>> print('wwwz.example.com'.lstrip('cmowz.'))
  4. example.com
  5. >>> print('wwaw.example.com'.lstrip('cmowz.'))
  6. aw.example.com
  7. >>> print('www.example.com'.strip('cmowz.'))
  8. 'example'

由于www.example.com的前4个字符都是字符序列cmowz.中的字符,所以都被移除,而第五个字符e不在字符序列中,所以修剪到此结束。同理wwwz.example.com

wwaw.example.com中第3个字符a不是字符序列中的字符,所以修剪到此结束。

python字符串(string)方法整理的更多相关文章

  1. python字符串replace()方法

    python字符串replace()方法 >>> help(str.replace)Help on method_descriptor:replace(...)    S.repla ...

  2. python字符串的方法

    python字符串的方法 ############7个基本方法############ 1:join def join(self, ab=None, pq=None, rs=None): # real ...

  3. 7. python 字符串格式化方法(2)

    7. python 字符串格式化方法(2) 紧接着上一章节,这一章节我们聊聊怎样添加具体格式化 就是指定替换字段的大小.对齐方式和特定的类型编码,结构如下: {fieldname!conversion ...

  4. 7. python 字符串格式化方法(1)

    7. python 字符串格式化方法(1) 承接上一章节,我们这一节来说说字符串格式化的另一种方法,就是调用format() >>> template='{0},{1} and {2 ...

  5. python字符串排序方法

    一般情况下,python中对一个字符串排序相当麻烦: 一.python中的字符串类型是不允许直接改变元素的.必须先把要排序的字符串放在容器里,如list. 二.python中的list容器的sort( ...

  6. python字符串处理方法

    一.combine & duplicate 字符串结合和复制 字符和字符串可以用来相加来组合成一个字符串输出: 字符或字符串复制输出. 二.Extract &Slice 字符串提取和切 ...

  7. Python 字符串 String 内建函数大全(1)

    关于 Python 的字符串处理相关的方法还是许多的.因为我正在学习 Python,于是就把 Python 中这些混杂的用于 string 的函数总结出来,在自己忘记的时候便于查找,希望对于有相似需求 ...

  8. python字符串格式化方法 format函数的使用

      python从2.6开始支持format,新的更加容易读懂的字符串格式化方法, 从原来的% 模式变成新的可读性更强的 花括号声明{}.用于渲染前的参数引用声明, 花括号里可以用数字代表引用参数的序 ...

  9. python 字符串 string

    字符串 string 语法: a = 'hello world!' b = "hello world!" 常用操作: 1.乘法操作是将字符串重复输出2遍 >>> ...

随机推荐

  1. mybatis 中使用oracle merger into

    项目背景:设计到excel导入,数据量也比较大,保证性能的情况下还要考虑到:如果数据中有这条数据的主键,则更新(update),不存在的情况,执行插入(insert). mybatis代码: < ...

  2. linux系统中使用socket直接发送ARP数据

    这个重点是如这样创建socket:  sock_send = socket ( PF_PACKET , SOCK_PACKET , htons ( ETH_P_ARP) ) ; 其后所有收发的数据都是 ...

  3. 修改MariaDB 路径

    1.把mariadb服务停掉: service mariadb stop 2.把/var/lib/mysql整个目录复制到/work, sudo mkdir /work/data sudo cp -a ...

  4. PMP:8.项目质量管理

    内容中包含 base64string 图片造成字符过多,拒绝显示

  5. Jeecg框架简介

    官方地址:http://www.jeecg.org/

  6. Redis-08.命令参数详解

    1. redis-cli -r(repeat)选项代表江命令执行多次 # 执行3次ping命令 redis-cli -r 3 ping -i(interval)选项代表每个几秒执行一次命令(必须和-r ...

  7. 自动化单元测试工具 EvoSuite 的简单使用 【转载】

    转载:https://www.cnblogs.com/hughding/p/evosuite.html 一.EvoSuite简介 EvoSuite是由Sheffield等大学联合开发的一种开源工具,用 ...

  8. 背水一战 Windows 10 (93) - 选取器: FileOpenPicker, FolderPicker, FileSavePicker

    [源码下载] 背水一战 Windows 10 (93) - 选取器: FileOpenPicker, FolderPicker, FileSavePicker 作者:webabcd 介绍背水一战 Wi ...

  9. 「ZJOI2017」树状数组(二维线段树)

    「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...

  10. js 大厦之JavaScript事件

    1.js事件简介 事件(Event) 是 JavaScript 应用跳动的心脏 ,进行交互,使网页动起来.也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了 ...