数字和字符串
数字
属于不可变类型(immutable)
使用字面量直接创建 包括:
十进制整型int
浮点型float
复数complex
布尔型bool
基本操作
和其他语言一样使用算术运算符+
, -
, *
和 /
取模%
在整数除法中,除法 /
总是返回一个浮点数,
如果只想得到整数的结果,丢弃可能的分数部分,可以使用运算符 //
使用 **
操作来进行幂运算
位运算符和其他语言一样 左移右移异或等
利用位运算将变量 a 和 b 的值交换
pythona = a ^ b b = a ^ b a = a ^ b
常见属性
.real
实部.imag
虚部(字面量的虚数单位为j
)。
整型:.numerator
分子 是它本身。
整型:.denominator
分母 恒为 1。
常用方法
.bit_length()
得到指定数值的二进制的长度数
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
类型,也可以相互运算
0x29A
# 666
进制转换(字符串)
bin(255)
# '0b11111111'
oct(255)
# '0o377'
hex(255)
# '0xff'
若内置函数 int()
传入了两个参数,int(x, base)
则第一个参数必需是字符串类型,其第二个参数是原进制。
int("0xff", 16)
# 255
转换为 ↓ | 2 进制 | 8 进制 | 10 进制 | 16 进制 |
---|---|---|---|---|
2 进制 | x | bin(int(x, 8)) | bin(int(x, 10)) | bin(int(x, 16)) |
8 进制 | oct(int(x, 2)) | x | oct(int(x, 10)) | oct(int(x, 16)) |
10 进制 | int(x, 2) | int(x, 8) | x | int(x, 16) |
16 进制 | hex(int(x, 2)) | hex(int(x, 8)) | hex(int(x, 10)) | x |
有关模块
decimal
模块提供了 Decimal
数据类型用于浮点数计算,拥有更高的精度用来解决如下情况:
0.1 + 0.2
# 0.30000000000000004
但是在精度要求不高的时候可以使用字符串格式化来解决。
math
模块:提供基本的三角函数指数对数等方法,数域只到实数(负数不能用它开平方)cmath
模块:同math
模块, 数域扩充到复数 ,还提供了转换极坐标系的方法numpy
模块:用于复杂的数学问题:排列组合 矩阵等 这里不过多讨论
字符串
str
可下标类型(subscriptable) 可迭代类型(Iterable) 不可变类型(immutable).
使用字面量引号(
'
或"
)来创建字符串
在 python3 中,字符串都是 Unicode 字符,相当于 python2 中字面量前面加u
pythonvar1 = "我想起高兴的事情!" # python2中的中文字符最好在前面加u # var1 = u'我想起高兴的事情!'
索引和切片
var1[0]
var1[1:5]
对于切片:
- 切片遵循左闭右开原则。
- 切片的冒号左边不写默认是 0,右边不写默认是长度-1。
- 切片还可以使用第二个冒号
[::step]
,代表间距,为-1 时可以倒序。
切片和索引只读(只有 getitem 操作)
转义字符
\n
换行、 \t
制表符键盘的 tab、 \\
反斜线\ 、 \/
斜线/
\'
\"
引号前面的\有时候必须有,有时候不能有,有时候是可有可无的。
# 第二个单引号前不能有\
>>> '\\\\\'
SyntaxError: EOL while scanning string literal
#第二个单引号前必须有\
>>> eval("'\\\\\'")
'\\'
用原始字符串就能解决这个问题。
关于换行
换行风格有多种,转义字符组合各不相同,可以参阅有关文档
原始字符串
在字符串的前面加r
可以显示原始字符串(Raw String)
原始字符串常被用来书写正则表达式
内置函数repr()
可以查看原始字符串
>>> 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 中使用字符串
循环字符串,将会逐个字符的打印:
a = "你想吃桃子"
for char in a:
print(char)
当然,你也可以:
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
类型的方法如下:
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
类型的方法如下:
>>> 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
类型的下标和循环可以得到字节数字
>>> '你好'.encode('GB2312')
b'\xc4\xe3\xba\xc3'
>>> '你好'.encode('GB2312')[0]
196
>>> '你好'.encode('GB2312')[1]
227
>>> '你好'.encode('GB2312')[2]
186
>>> '你好'.encode('GB2312')[3]
195
字节数字可以直接用于 c 语言输出中文
#include <stdio.h>
int main()
{
printf("%c%c%c%c!\n",196,227,186,195);// 你好!
return 0;
}