字符串
转义字符:在字符串的引号内,\不表示反斜杠,而表示转义字符;\\才表示反斜杠。如对于地址D:\Adobe\Acrobat,如果写成可以被计算机识别的字符串,需写成"D:\\Adobe\\Acrobat",要写成双反斜杠才可以被识别。
python中还可以在\后加入八进制或十六进制数字形成字符编码来表示字符,同样亦可以在\后加Unicode编码来表示字符:(来自骆昊的博客)
s1 = '\141\142\143\x61\x62\x63'
s2 = '\u9a86\u660a'
print(s1, s2)
输出为
abcabc
骆昊
原始字符串:原始字符串的意思就是忽略转义字符的功能,完全按照字符串的原始摸样输出,’\n’就输出为’\n’,’\‘就输出为’\’,而不是换行或者单个反斜杠。
用法为在字符串引号前加r,如r'D:\Adobe\Acrobat',输出就是D:\Adobe\Acrobat;r"D:\\Adobe\\Acrobat"输出就是D:\\Adobe\\Acrobat。
字符串运算符:python的字符串运算符非常丰富且方便。
我们可以使用+运算符来实现字符串的拼接,可以使用*运算符来重复一个字符串的内容;可以使用in和not in来判断一个字符串是否包含另外一个字符串(成员运算);还可以认为字符串是由单个字符组成的列表,可以用下标来单独调用某一字符,或用[]和[:]运算符从字符串取出某些字符(切片运算)。(来自骆昊的博客)
s1 = 'hello ' * 3
print(s1) # hello hello hello
s2 = 'world'
s1 += s2
print(s1) # hello hello hello world
print('ll' in s1) # True
print('good' in s1) # False
str2 = 'abc123456'
# 从字符串中取出指定位置的字符(下标运算)
print(str2[2]) # c
# 字符串切片(从指定的开始索引到指定的结束索引)
print(str2[2:5]) # c12
print(str2[2:]) # c123456
print(str2[2::2]) # c246
print(str2[::2]) # ac246
print(str2[::-1]) # 654321cba
print(str2[-3:-1]) # 45
其中注意
print(str2[::-1]) # 654321cba
是一种非常简便的倒序输出的方式。
格式化输出字符串:有三种常用方式:
a, b = 5, 10
print('%d * %d = %d' % (a, b, a * b))
print('{0} * {1} = {2}'.format(a, b, a * b))#注意从0开始
print(f'{a} * {b} = {a * b}')
第一种与c语言不同的是用%加元组来表示输出内容,而c语言使用逗号分隔,这里必须前后类型要一致,不然会报错。第二种是用字符串提供的方法,好处是不用单独考虑输出格式,会完全按照变量本身的格式输出。第三种是3.6版本以后的方式,更简便,只需在字符串前面加入一个f。
列表生成式和生成器
生成式(Comprehensions):f = [x ** 2 for x in range(1, 1000)]
生成器(Generator):g = (x ** 2 for x in range(1, 1000))
区别是生成器从输入完的那一刻就已经生成完整的列表,会占据大量的内存,空间换时间。而生成器则不会生成任何列表,它需要通过迭代(next()或者for循环)一个一个算出数值(每次只输出一个数值,而不是列表),时间换空间。
>>> print(f) #print生成式会直接输出生成的列表结果
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361,...]
>>> print(g) #print生成器则只会输出generator对象即编号
<generator object <genexpr> at 0x0000016E41BD40C0>
>>> for val in g: #要输出生成器的值需要经过循环迭代
... print(val)
...
1
4
9
16
25
36
49
64
81
...
函数生成器:通过yield关键字将一个普通函数改造成生成器函数。
def fib(max): #斐波那契数列生成器
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
Generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
>>> for n in fib(6):
... print(n)
...
1
1
2
3
5
8
可以看到这种生成器generator都可以作为for循环的循环体,我们称具有这种功能的数据类型为可迭代对象。
可迭代对象和迭代器
可迭代对象(Iterable):可以直接作用于for循环的对象。
包括集合数据类型:list、tuple、dict、set、str等;还有生成器和生成器函数generator。
迭代器(Iterator):在Iterable的基础上,还可以被next()函数不断调用并返回下一个值。
基本只有generator及其函数。迭代器的一大特点是其为惰性的,且可以容纳几乎无穷的的数据空间。
可以用iter()函数将Iterable对象转换为Iterator对象。
Python的for循环本质上就是通过不断调用next()函数实现的(来自廖雪峰的博客),例如:
for x in [1, 2, 3, 4, 5]:
pass
实际上完全等价于
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
except StopIteration:
# 遇到StopIteration就退出循环
break
本文介绍了Python中的字符串,包括转义字符、原始字符串、字符串运算符和格式化输出。接着探讨了列表生成式和生成器的区别,生成器通过yield关键字实现,并且详细解释了可迭代对象与迭代器的概念。
419

被折叠的 条评论
为什么被折叠?



