Skip to content

数字和字符串

数字

属于不可变类型(immutable)

使用字面量直接创建 包括:
十进制整型int 浮点型float 复数complex 布尔型bool

基本操作

和其他语言一样使用算术运算符+-*  和  / 取模%
在整数除法中,除法  /  总是返回一个浮点数,
如果只想得到整数的结果,丢弃可能的分数部分,可以使用运算符  //
使用  **  操作来进行幂运算
位运算符和其他语言一样 左移右移异或等

利用位运算将变量 a 和 b 的值交换

python
a = a ^ b
b = a ^ b
a = a ^ b

常见属性

.real 实部
.imag 虚部(字面量的虚数单位为j)。
整型:.numerator 分子 是它本身。
整型:.denominator 分母 恒为 1。

常用方法

.bit_length() 得到指定数值的二进制的长度数

python
i = 100
print(i.bit_length())
"""
                  bit_length
1     0000 0001       1
2     0000 0010       2
3     0000 0011       2

"""

常用内置函数

  • abs()求绝对值 复数求模
  • max()/min()求最值
  • int(x)  将 x 转换为一个整数
  • float(x)  将 x 转换到一个浮点数
  • pow(a,b) 相当于a**b
  • pow(a,b,c) 相当于a**b%c
  • round(num) 四舍五入(实际是不是真正的四舍五入,是以 5.0 为界)
  • divmod(被除数,除数) 返回元组:(商,余数)
  • complex(x, y)  以 x 为实部,y 为虚部,实例化一个复数

有关进制

其他进制的字面量可以直接转换为int类型,也可以相互运算

python
0x29A
# 666

进制转换(字符串)

python
bin(255)
# '0b11111111'
oct(255)
# '0o377'
hex(255)
# '0xff'

若内置函数 int() 传入了两个参数,
int(x, base) 则第一个参数必需是字符串类型,其第二个参数是原进制。

python
int("0xff", 16)
# 255
转换为 ↓2 进制8 进制10 进制16 进制
2 进制xbin(int(x, 8))bin(int(x, 10))bin(int(x, 16))
8 进制oct(int(x, 2))xoct(int(x, 10))oct(int(x, 16))
10 进制int(x, 2)int(x, 8)xint(x, 16)
16 进制hex(int(x, 2))hex(int(x, 8))hex(int(x, 10))x

有关模块

decimal模块提供了 Decimal 数据类型用于浮点数计算,拥有更高的精度用来解决如下情况:

python
0.1 + 0.2
# 0.30000000000000004

但是在精度要求不高的时候可以使用字符串格式化来解决。

  • math模块:提供基本的三角函数指数对数等方法,数域只到实数(负数不能用它开平方)
  • cmath模块:同math模块, 数域扩充到复数 ,还提供了转换极坐标系的方法
  • numpy模块:用于复杂的数学问题:排列组合 矩阵等 这里不过多讨论

字符串

str

可下标类型(subscriptable) 可迭代类型(Iterable) 不可变类型(immutable).

使用字面量引号('")来创建字符串
在 python3 中,字符串都是 Unicode 字符,相当于 python2 中字面量前面加u

python
var1 = "我想起高兴的事情!"

# python2中的中文字符最好在前面加u
# var1 = u'我想起高兴的事情!'

索引和切片

python
var1[0]
var1[1:5]

对于切片:

  • 切片遵循左闭右开原则。
  • 切片的冒号左边不写默认是 0,右边不写默认是长度-1。
  • 切片还可以使用第二个冒号[::step],代表间距,为-1 时可以倒序。

切片和索引只读(只有 getitem 操作)

转义字符

\n换行、 \t制表符键盘的 tab、 \\反斜线\ 、 \/斜线/

\' \"引号前面的\有时候必须有,有时候不能有,有时候是可有可无的。

shell
# 第二个单引号前不能有\
>>> '\\\\\'
SyntaxError: EOL while scanning string literal

#第二个单引号前必须有\
>>> eval("'\\\\\'")
'\\'

用原始字符串就能解决这个问题。

关于换行

换行风格有多种,转义字符组合各不相同,可以参阅有关文档

原始字符串

在字符串的前面加r可以显示原始字符串(Raw String)
原始字符串常被用来书写正则表达式

内置函数repr()可以查看原始字符串

shell
>>> r"\n"
'\\n'
>>> print(r"\n")
\n
>>> repr(r"\n")
"'\\\\n'"
>>> print(repr(r"\n"))
'\\n'

运算符操作

  • str+str 拼接
  • str*int 重复拼接
  • in not in是否包含给定的字符
  • % 格式化 后面专门讲

常用方法

转换为字节串

  • .encode()编码,默认编码为 utf-8,最终返回值是 bytes 类型
  • .decode()解码,已废弃,但 python2 中依然可用来转换中文等的编码

替换分割

不会修改原字符串,只会返回预期的字符串。

  • .split(str)以 str 分割为 list,不能传空字符串。
  • .join(list)(将可迭代对象)以字符串拼接
  • .replace() 替换
  • .strip() .lstrip() .rstrip()去掉两端空格/指定字符
  • .partition(str)分割返回元组
  • .translate(翻译表)过滤

查找

  • .find(str)找不到返回-1
  • .index(str)找不到报错
  • .count(str)返回出现次数

模板

  • .format()格式化字符串 后面专门讲
  • .expandtabs(int)用制表符占位分组
  • .zfill(2) 不足两位开头补 0,功能与'%02d'%num一样
  • .center() .ljust() .rjust() 几种填充方法

大小转换

  • .swapcase()大小写翻转
  • .title()首字母大写
  • .capitalize()首字母大写
  • .upper()全部罗马字大写
  • .lower()全部罗马字小写
  • .casefold()全部字符小写

更多方法可以使用内置函数dir(str)来查看

isdigit() 是否纯数字 isascii() 是否纯 ascii 字符 等。。。

相关的内置函数

  • repr()转化为原始字符串类型(调用魔术方法__repr__
  • str()转化为字符串类型(调用魔术方法__str__,不存在则调用__repr__
    将二进制字符串转为字符串类型:str(msg,'utf-8')
  • len(var1)返回字符串长度
  • bytes(str, encoding='utf-8')编码
  • print()在控制台中调用__str__并显示

for in 中使用字符串

循环字符串,将会逐个字符的打印:

python
a = "你想吃桃子"
for char in a:
    print(char)

当然,你也可以:

python
print("\n".join("你想吃桃子"))

Unicode

字符串前面加 u 变成 Unicode 字符串。

python2 的字符串本质是二进制字符串,输出的时候不支持非 ASCII,

python2 需要 Unicode 字符串如u"你好"才能被正确输出。

python3 中的字符串本质是解码为 utf8 的 Unicode 字符串

解码 unicode 的字面量:

  • python2:'\\u98ce'.decode('unicode_escape').encode('utf8')
  • python3:'\\u98ce'.encode('utf8').decode('unicode_escape')

字节串

与字符串的转换

str类型转化为bytes类型的方法如下:

python
b"eJwLKs3NTNRRKC7NzgQAF/kEBw=="  # 字面量 只包含ASCII字符
# b'eJwLKs3NTNRRKC7NzgQAF/kEBw=='
bytes("eJwLKs3NTNRRKC7NzgQAF/kEBw==", "utf-8")
# b'eJwLKs3NTNRRKC7NzgQAF/kEBw=='
"eJwLKs3NTNRRKC7NzgQAF/kEBw==".encode()  # 默认utf-8
# b'eJwLKs3NTNRRKC7NzgQAF/kEBw=='
str.encode("eJwLKs3NTNRRKC7NzgQAF/kEBw==")  # 同上,静态方法的形式调用
# b'eJwLKs3NTNRRKC7NzgQAF/kEBw=='

bytes类型转化为str类型的方法如下:

shell
>>> str(b'\xe4\xbd\xa0\xe5\xa5\xbd','utf-8')
'你好'
>>> b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8')
'你好'
>>> bytes.decode(b'\xe4\xbd\xa0\xe5\xa5\xbd','utf-8') # 同上,静态方法的形式调用
'你好'

静态方法的方式来调用

类上定义的对象方法以静态方法的形式调用,只需要第一个参数是实例对象(self)即可。
这将在会在之后面向对象章节中介绍。

for in 中使用字节串

bytes类型的下标和循环可以得到字节数字

shell
>>> '你好'.encode('GB2312')
b'\xc4\xe3\xba\xc3'
>>> '你好'.encode('GB2312')[0]
196
>>> '你好'.encode('GB2312')[1]
227
>>> '你好'.encode('GB2312')[2]
186
>>> '你好'.encode('GB2312')[3]
195

字节数字可以直接用于 c 语言输出中文

c
#include <stdio.h>
int main()
{
    printf("%c%c%c%c!\n",196,227,186,195);// 你好!
    return 0;
}