输出
对于一个变量,可以使用 type(object)
返回变量的类型,例如 type(8)
和 type('a')
的值分别为 <class 'int'>
和 <class 'str'>
。
Python 中,还可以使用 **
运算符和内置的 pow(base, exp, mod=None)
函数进行幂运算,使用 abs(x)
求数的绝对值。
>>> 3 ** 4 # 幂运算
81
>>> 2 ** 512
13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084096
>>> pow(2, 512, int(1e4)) # 即 2**512 % 10000 的快速实现, 1e4 是 float 所以要转 int
4096
>>> 2048 ** 2048 # 在IDLE里试试大整数?
>>> 0.1 + 0.1 + 0.1 - 0.3 == 0. # 和 C/C++ 一样需要注意浮点数不能直接判相等
False
字符串
Python 3 提供了强大的基于 Unicode 的字符串类型,使用起来和 C++ 中的 string 类似,一些概念如转义字符也都相通,除了加号拼接和索引访问,还额外支持数乘 *
重复字符串,和 in
操作符。
>>> s1 = "O" # 单引号和双引号都能包起字符串,有时可节省转义字符
>>> s1 += 'I-Wiki' # 为和 C++ 同步建议使用双引号
>>> 'OI' in s1 # 检测子串很方便
True
>>> len(s1) # 类似 C++ 的 s.length(),但更通用
7
>>> s2 = """ 感谢你的阅读
... 欢迎参与贡献!
""" # 使用三重引号的字符串可以跨越多行
>>> s1 + s2
'OI-Wiki 感谢你的阅读\n欢迎参与贡献!'
>>> print(s1 + s2) # 这里使用了 print() 函数打印字符串
OI-Wiki 感谢你的阅读
欢迎参与贡献!
>>> s2[2] * 2 + s2[3] + s2[-1] # 负数索引从右开始计数,加上len(s),相当于模n的剩余类环
'谢谢你!'
>>> s1[0] = 'o' # str 是不可变类型,不能原地修改,其实 += 也是创建了新的对象
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
Python 支持多种复合数据类型,可将不同值组合在一起。最常用的 list
,类型是用方括号标注、逗号分隔的一组值。例如,[1, 2, 3]
和 ['a','b','c']
都是列表。
除了索引,字符串还支持切片,它的设计非常精妙又符合直觉,格式为 s[左闭索引:右开索引:步长]
:
>>> s = 'OI-Wiki 感谢你的阅读\n欢迎参与贡献!'
>>> s[:8] # 省略左闭索引则从头开始
'OI-Wiki '
>>> s[8:14] # 左闭右开设计的妙处,长度恰好为14-8=6,还和上一个字符串无缝衔接
'感谢你的阅读'
>>> s[-4:] # 省略右开索引则直到结尾
'与贡献!'
>>> s[8:14:2] # 步长为2
'感你阅'
>>> s[::-1] # 步长为 -1 时,获得了反转的字符串
'!献贡与参迎欢\n读阅的你谢感 ikiW-IO'
>>> s # 但原来的字符串并未改变
'OI-Wiki 感谢你的阅读\n欢迎参与贡献!'
C/C++ 中 char
类型可以和 对应的 ASCII 码互转,而在 Python 中你可以对一个 Unicode 字符使用内置函数 ord()
将其转换为对应的 Unicode 编码,逆向的转换使用内置函数 chr()
。
如果想把数字转换成对应的字符串,可以使用内置函数 str()
,反之可以使用 int()
和 float()
,你可以类比为 C/C++ 中的强制类型转换,但括号不是加在类型上而是作为函数的一部分括住参数。
Python 的字符串类型提供了许多强大的方法,包括计算某字符的索引与出现次数,转换大小写等等,这里就不一一列举,强烈建议查看 官方文档 熟悉常用方法,遇到字符串操作应当首先考虑使用这些方法而非自力更生。