Python Course之Python Strings
中国hadoop大数据峰会2016北京站3月18-19日在北京即将召开,现在购买门票优惠多多!!!机不可失,快快动起来!报名可以点击阅读原文
原文链接:https://developers.google.com/edu/python/strings
文章来自:Google Class
本文由chinahadoop.com翻译
关于转载授授权
China Hadoop文章,欢迎个人转发朋友圈,自媒体、媒体、机构转载务必申请授权,后台留言“机构名称+文章标题+转载”,申请过授权的不必再次申请,只要按约定转载即可,但文末需放置China Hadoop二维码。
配套视频链接:https://www.youtube.com/watch?v=tKTZoB2Vjuk(建议在Wifi环境下看)
Python有一个带着许多方便的功能叫做“str”的内置字符串(有一个更老的叫做“string”的模块你应该没有用过)。虽然串文字既可以使用双引号又可以使用单引号,但是我们更多的是使用单引号。Backslash escapes work the usual way within both single and double quoted literals(例如\n \' \")。毫无疑问双引号字符串可以包含单引号(例如"I didn't do it"),同样单引号字符串中可以包含双引号。字符串文字可以跨越多行,但必须在每一行以backslash \结尾以便摆脱换行符。三重引号内的字符串常量“,"""" or ''',可以多行文本。
Python的字符串是“不可改变的”,这表示他们在创建后就不能被更改(Java字符串也使用了这种不可变的风格)。因为字符串不能改变,我们构造*新的*字符串来作为我们计算的值。因此,例如表达式('hello' + 'there')发生在2个字符串'hello' and 'there'之间,那么就建立一个新的字符串“hellothere”。
字符串中的字符可以使用标准[]语法来访问,像Java和C ++一样,Python使用从零开始的索引,所以如果str是’hello’ str[1]是“e”。如果该指数超出字符串的范围,Python就会出现一个错误。Python的风格(不像Perl的)是如果不能告诉它做什么,那么他就会停止,而不是仅仅做了一个默认值。”slice”语法(下面会有)还致力于从字符串中提取子链。该len(string)函数返回字符串的长度。[]语法和len()函数实际上可胜任任何序列类型的工作 – 字符串,列表等。Python试图使其业务始终在不同类型的工作中发挥作用。Python新手的疑难杂症:不使用“len”作为变量名,以避免阻塞了len()函数。该“+”操作符可以连接两个字符串。注意下面的代码:变量没有预申报-只是分配给他们并进行。
s = 'hi'
prints[1] ## i
printlen(s) ## 2
print s + ' there' ## hi there
不像Java中,“+”不会自动转化为数字或其他类型的字符串形式。该str()函数将值转换为字符串形式,使他们能够与其他字符串相结合。
pi = 3.14
##text= 'The value of pi is ' + pi ## NO, does not work
text = 'The value of pi is ' + str(pi) ## yes
对于数字来说,该标准操作符,+ / *以通常的方式工作。没有++运算符,但有+ =, – =等方面的。如果你想整除,使用2 slashes是最正确的- 例如,6 // 5是1(以前的python 3000,单个的/ 使用ints来进行int division,但发展到现在//是表达你想要的int division的首选方式。)
"print"操作符打印出一个或多个后跟一个换行符的python items(在项目结束后留下尾随逗号来抑制行)。一个“raw”字符串文字是由一个“r”开头,并在没有反斜杠的特殊处理下传送所有字符,因此r'x\nx' evaluates to the length-4 string'x\nx'。一个'u'前缀支持你写一个unicode字符串(Python有很多其他的Unicode支持的功能 – 请参见下面的文档)。
raw = r'this\t\n and that'
print raw ##this\t\n and that
multi = """It was the best of times.
It was the worst of times."""
String Methods
下面是一些最常见字符串方法。一种方法就像一个函数,但是它运行在一个对象之上。如果变量s是一个字符串,则代码s.lower()在字符串对象上运行lower() method并返回结果(这个在对象上运行的想法是构成面向对象编程OOP的一种基本思路)。下面是一些最常见字符串方法:
· s.lower(), s.upper() — returns the lowercase oruppercase version of the string
· s.strip() — returns a string with whitespace removed from the start andend
· s.isalpha()/s.isdigit()/s.isspace()… — tests if allthe string chars are in the various character classes
· s.startswith('other'), s.endswith('other') — tests ifthe string starts or ends with the given other string
· s.find('other') — searches for the given other string(not a regular expression) within s, and returns the first index where itbegins or -1 if not found
· s.replace('old', 'new') — returns a string where alloccurrences of 'old' have been replaced by 'new'
· s.split('delim') — returns a list of substringsseparated by the given delimiter. The delimiter is not a regular expression,it's just text. 'aaa,bbb,ccc'.split(',') -> [‘aaa’, ‘bbb’, ‘ccc’]. As aconvenient special case s.split() (with no arguments) splits on all whitespacechars.
· s.join(list) — opposite of split(), joins the elementsin the given list together using the string as the delimiter. e.g.'—'.join([‘aaa’, ‘bbb’, ‘ccc’]) ->aaa—bbb—ccc
谷歌搜索"python str"会出现官方的文件python.org string methods (http://docs.python.org/library/stdtypes.html#string-methods),其中列出了所有的str方法。
Python没有单独的字符类型。相反,像s[8]表达式返回一个包含的特征的string-length-1。使用string-length-1,像==,<=,……等等的所有操作符都会如你所期望的那样工作,所以并不需要知道Python没有单独标“char”类型。
String Slices
"slice"语法是了解序列的子部分的简便方法 – 通常是字符串和列表。slice s[start:end]开始的元素并延伸但是不包括结束。假设我们定s =“Hello”
· s[1:4] is 'ell' — chars starting at index 1 andextending up to but not including index 4
· s[1:] is 'ello' — omitting either index defaults to thestart or end of the string
· s[:] is 'Hello' — omitting both always gives us a copyof the whole thing (this is the pythonic way to copy a sequence like a stringor list)
· s[1:100] is 'ello' — an index that is too big istruncated down to the string length
在字符串的开头标准的zero-based索引号可以轻松的访问chars。作为替代方案,Python使用负数来方便地前往字符的字符串的结尾:s[-1]是最后一个char’o’,s[-2]是'l' next-to-last char等等。负索引号从字符串的结尾计数回:
· s[-1] is 'o' — last char (1st from the end)
· s[-4] is 'e' — 4th from the end
· s[:-3] is 'He' — going up to but not including the last3 chars.
· s[-3:] is 'llo' — starting with the 3rd char from theend and extending to the end of the string.
对于任何指数n这是真理,s[:n] + s[n:] == s。这个工作甚至可以用于n负或超出界限的领域。或者换一种说法s[:n]和s [n:]总是把字符串分割成两个串部分,并保存所有字符。正如我们将在后面的列表中所看到的,slices也需要用到lists。
String %
Python有一个printf() – 就像把字符串放在一起的工厂。%运算符在左边采取一个printf类型的格式字符串(%d int, %s string, %f/%g 浮点),并在右边的元组匹配值(匹配值的元组是由逗号被分隔的值,通常在括号内分组):
# % operator
text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')
上面一行是你想把它分成几行的那种long — suppose。在其他的语言中,在“%”后,你不能只拆分行,因为在默认情况下的Python把每行作为一个单独的声明(这个优点就是为什么我们不需要键入每个分号线)。为了解决这个问题,请用外组括号括住整个表达式 – 则表达式允许跨越多行。这个code-across-lines技术也适用于各种分组构建。详述如下:( ), [ ], { }.
# add parens to make the long-line work:
text = ("%d little pigs come out or I'll %s and %s and %s" %
(3, 'huff', 'puff', 'blow down'))
i18n Strings (Unicode)
常规的Python字符串是*not* unicode,他们只是简单的字节。为了创建一个unicode字符串,请在字符串中使用'u'前缀:
>ustring = u'Aunicode \u018e string \xf1'
>ustring
u'Aunicode \u018estring \xf1'
Unicode字符串是来自常规的“str”不同的字符串对象,但Unicode字符串是兼容的(它们共享的公共超“即basestring”),如果通过一个unicode字符串来代替一个常规的字符,那么正则表达式的不同库都可正常工作。
使用'utf-8'编码来将Unicode字符串转换为字节,在unicode字符串上调用ustring.encode(“utf-8”)方法。另一个方向,unicode(s,encoding)函数把纯字节转换编码为Unicode字符串:
## (ustring from above contains a unicode string)
> s = ustring.encode('utf-8')
> s
'A unicode\xc6\x8e string \xc3\xb1' ## bytes of utf-8 encoding
> t = unicode(s, 'utf-8') ## Convert bytes back to a unicodestring
> t == ustring ## It's the same as the original, yay!
True
使用unicode 字符串内置打印不能充分工作。You can encode() first to print in utf-8 or whatever。在文件读取部分,有说明如何打开一个文本文件的一些编码和读取unicode字符串的例子。需要注意的是unicode处理是一个领域—Python 3000显著清理VS此处描述的Python 2.x版本的行为。
If Statement
Python不使用{}来括住if/loops/函数等代码块。相反,Python使用冒号(:)和缩进/空格将语句分组。对于布尔测试,如果不需要在括号里(与C ++ / Java的大区别),它可以有*elif *和*else*条款(帮助记忆:单词“elif”与“else”是长度相同的单词)。
任何值可被用作一个if-test。“zero”的价值观都算为假:None, 0, empty string, empty list, emptydictionary。还有一个布尔类型包含两个值:true和false(转换为int,这些是1和0)。Python有常用的比较运算:==, !=, <, <=, >, >=。不像Java和C,== is overloaded to work correctly with strings。布尔运算符是拼写出的单词*and*, *or*, *not*(Python不使用C语言风格&& ||!)。下面的代码可能看起来像一个警察责备超速者 – 请注意,then/ else语句的每个块是如何以a:开始的以及那些语句是如何通过他们的indentation来分组的:
ifspeed >= 80:
print'Licenseand registration please'
ifmood == 'terrible'or speed >= 100:
print'Youhave the right to remain silent.'
elifmood == 'bad'or speed >= 90:
print"I'mgoing to have to write you a ticket."
write_ticket()
else:
print"Let'stry to keep it under 80 ok?"
我发现忽略“.”是我在打上面的代码的时候最常见的语法错误,大概因为这是我的使用C ++ / Java的习惯。另外,不要把布尔测试放在括号里 – 这是一个C / Java的习惯。如果代码是简短的,你可以把它放在同一行代码“:”的后面,像这样的(这也适用于functions, loops,等等),虽然有些人觉得这更具可读性。
ifspeed >= 80: print'You are sobusted'
else: print'Have a niceday'
练习:string1.py
想要操作本节中的练习,请尝试string1.py练习习基本练习(https://developers.google.com/edu/python/exercises/basic)。
本节完
对文章有疑问或者任何意见欢迎留言
China Hadoop大数据研究网:
http://chinahadoop.com/
中国hadoop技术峰会2016北京站报名参会网站:
http://www.chinahadoop.com/signup.php(也可点击阅读原文来了解详情)
门票价格表
微信名:
HadoopSummit
微信ID:
hadoopinchina
中国Hadoop技术峰会是亚太地区举办最早、规模最大、影响力最广阔的大数据盛会。
Chinahadoop.com是China Hadoop Summit的内容网站。
HadoopSummit是Chinahadoop.com的微信发布平台。