基本变量类型
Python的变量本身没有类型,通常说类型指的是变量对应的对象类型。这种特性的语言称之为动态语言,区别于变量必须指定类型且不能存入其他类型数据的静态语言。
Python能处理的对象类型包括数字、布尔值、字符串、列表、元组、字典和集合等。其中前三种为基本变量类型,后四种为集合类变量,由基本变量组成。
- 数字
数字类型变量用于存储数据,包括整形int、浮点float和复数comlex。
-整数
Python可以存储计算任意大小的整数,包括正负和0。同时也可以用前缀0x表示十六进制数、前缀0o表示八进制。
- 浮点数
Python中浮点数可以使用小数形式如1.23
和科学计数法如1.23e5
、1.23e-3
的形式表示。
- 复数
Python中复数由实部和虚部两个浮点数组成,用a+bj或complex(a,b)表示。
- 数字相关的函数
- int(x),将x转换为整数,舍弃小数部分;
- float(x),将x转换为浮点数;
- complex(x),将x转换为复数,实部为x,虚部为0;
- complex(x,y),将x转换为复数,实部为x,虚部为y。
- abs(x),返回x的绝对值
- round(x,n),返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数,n为负则舍入到小数点前。
- 除了基本数字函数外,可以加载数学函数库,使用更多函数进行数学计算。
import math
通过此语句可以加载数学函数库,使用数学常量和数学函数方便进行数学计算。
- 布尔值
True和False。在很多计算和判断中,非0值和True是等价的,0和False是等价的。
- 字符串
使用’单引号’”双引号”包裹的内容为字符串。
转义字符
当字符串内需要包括如\、#、’、”、换行、制表符等特殊符号时,需要在前面加反斜杠\进行转义。
如:
>>> print("Hello,\tworld!\n\\")
Hello, world!
\
当不需要进行转义而是要正常显示引号内的所有内容的话,只需要在字符串前加一个r即可。如:
>>> print(r"Hello,\tworld!\n\\")
Hello,\tworld!\n\\
如果如要用多行文字来表示字符串时,字符串前加上三个单引号”’标记,即可进行多行输入,命令行模式下输入的提示会从>>>变为…。输入完成后,再次使用”’标记结束输入。如:
>>> print('''abc def ghi''')
输出:
abc
def ghi
字符串占位符
通过占位符以及占位符格式化,可以控制在字符串中按指定格式加入数字,输出格式化的字符串。例如话费短信:“尊敬的用户,截至x月x日您的话费还剩xx.xx元。”
在字符串中插入相应的占位符,在字符串后加上%变量的内容
,有几个占位符就加几个变量,多个变量使用%(var1,var2,...)
的形式。
字符串中出现%又要使用占位符时,使用%%进行转义。
占位符的表达式:
%[[flags][width].[precision]typecode
其中:
flags 位可供选择的值有:
- + 正数前加正号,负数前加负号;
- - 正数前无符号,负数前加负号;
- 空格 正数前加空格;
- 0 正数前用0填充;
width表示flag位中空格或0的位数;
.precision 小数点后保留的位数;
typecode必填,为占位符的类型,通常包括下列几种类型
typecode | 占位符类型 |
---|---|
s | 字符串(当不确定类型时可以用%s,任何变量均可转换为字符串进行输出。) |
d | 十进制整数 |
f | 浮点数 |
x | 十六进制整数 |
e(E) | 科学记数法,e可选大小写 |
g(G) | 自适应科学记数法,e可选大小写 |
下面是一些占位符的使用例子:
# %+'0:补0;无:补空'+'补0或补空的位数'+占位符类型
>>> print('%02d-%2d' % (3, 1))
03- 1
>>> print('%.2f%%'% 31.3412)
31.34%
>>> print('0x%x'% 1231)
0x4cf
>>> print('%.3g'% 13949900)
1.39e+07
字符编码转换
使用ord()
函数可以获得一个字符的十进制整数编码,使用chr()
函数可以将一个十进制整数编码转换为字符。
字符也可以直接写作\u+十六进制编码
的形式。
Python使用的是Unicode编码,程序在内存中以Unicode编码运行,此时字符串类型为str
,但是当程序存储到磁盘或进行网络传输时,需要以字节段形式保存,字符串类型需要转换为bytes
。bytes
类型的字符串在Python中以b'字符串'
的形式表示。两者间的转换需要使用encode和decode方法进行转换。
>>> str1='一条字符串'
>>> str2=(str1.encode('utf-8')) #指定编码方式为utf-8
>>> str2
b'\xe4\xb8\x80\xe6\x9d\xa1\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
>>> print(str2.decode('utf-8')) #指定解码方式为utf-8
一条字符串
用于字符串的函数
-
len()
,长度函数,对str字符串返回字符数,对bytes字符串返回字节数。
>>> len(str1) #以上面的字符串为例
5
>>> len(str2)
15 #在unicode中一个中文汉字占用三个字节,因此字节数为15。
-
max()
,最大值函数,返回字符串中对应整数最大的字符。
>>> str='AaBbCc'
>>> max(str)
'c'
字符串方法
字符串方法是属于字符串类型变量对象的内建函数,使用时需先指定对象,形如: 字符串.方法名(参数)
。
字符串处理和转换
-
capitalize()
首字母转换为大写,返回。
>>> str3='string'
>>> str3.capitalize()
'String'
lower()
将字符串转换成小写,使用英文字母。另有casefold()
适用于unicode中的其他区分大小写的字符。upper()
将字符串转换成大写。swapcase()
将字符串大小写调转。title()
将字符串转换为标题格式,即每个单词首字母大写,其余小写。center(width,fillchar)
字符串转换为长度为width、居中、两侧用指定单个字符填充的字符串,返回。
>>> str3='string'
>>> str3.center(10,'.')
'..string..'
-
strip()、lstrip()
和rstrip()
截掉字符串左右两侧、左侧和右侧的空格或指定字符,返回截取后的剩余字符串。参数中填入截掉的字符串,不填则截掉空格。
-ljust(width,fillchar)、rjust(width,fillchar)
对字符串进行左对齐或右对齐操作,将字符串用fillchar字符填充至长度为width,不给出fillchar参数时用空格进行填充,返回对齐后的新字符串。
>>> str3='string'
>>> str3.rjust(10)
' string'
>>> str3.ljust(10,'*')
'string****'
-
replace(new,old,maxtimes)
对字符串进行替换操作,使用new字符串替换掉字符串中的old字符串,可以指定maxtimes限制替换的次数,如不给出参数则全部替换。
>>> str4='language'
>>> str4.replace('a','e')
'lenguege'
>>> str4.replace('a','e',1)
'lenguage'
maketrans(old,new)
创建字符串映射表,一般搭配translate使用,以进行字符串的替换。输入参数为两个字符串,分别是待替换的字符组成的字符串以及映射目标组成的字符串,两个字符串数量必须相等,根据映射关系一一对应。该方法的返回值为一个包含字符值映射关系的字典。一个字符串创建的映射表可以用于任意同类型的字符串,也可以直接使用str.maketrans()、bytearray.maketrans()或bytes.maketrans()创建对应类型的字符串。translate(transtable)
以maketrans创建的映射表为参数,也可以是手动指定的字典变量。
>>> str5='python'
>>> custable={116:84} #t和T的ascii
>>> table=str5.maketrans('pn','PN')
>>> table
{112: 80, 110: 78}
>>> str5.translate(table)
'PythoN'
>>> str5.translate(custable)
'pyThon'
-
splitlines(keepends)
将字符串按\r和\n自动分割为多个字符串组成的列表,可以输入参数True使每个字符保留\n和\r,默认为False。
>>> str7='''NIHIL DOGMA RAGE'''
>>> str7.splitlines()
['NIHIL', 'DOGMA', 'RAGE']
>>> str7.splitlines(True)
['NIHIL\n', 'DOGMA\n', 'RAGE']
查询、判断和统计
-
count(str, beg=0,end=len(stringname))
字符计数,返回str在整个字符串中出现的次数。
>>> str3='string'
>>> str3.count('tr')
1
>>> str3.count('tr',0,6) #第0~(6-1)位中查找'tr'
1
>>> str3.count('tr',2,len(str3)) #第2位~字符串末尾查找'tr'
0
-
find(str, beg=0,end=len(stringname))
字符查找,返回找到的第一个str在字符串中的位置,未找到则返回-1。 -
rfind()
的功能与find()
相同,但在执行时从右往左查找。 - 此外还有
index()
和rindex()
方法,功能和用法与find基本相同,但无结果时不返回-1而是报错。
>>> str3='string'
>>> str3.find('tr')
1
>>> str3.find('tr',2,5)
-1
>>> str3.find('tr',0,len(str3))
1
如果有多个匹配值,find方法和index方法也只会返回找到的第一个位置。尝试写了下面这段小程序在字符串中查找出所有匹配值位置:
string='q1w1e1r1t1yuio1p' #一长串夹杂'1'的字符串,找出'1'的位置
position_of_1=[] #使用一个列表来记录位置
flag=0 #记录每次查找的结果
length=len(string)
while (string.find('1',flag,length)!=-1): #从上次记录的匹配位置后开始查找直至无结果
flag=string.find('1',flag,length)
position_of_1.append(flag) #记录位置
flag+=1 #下次查找从此次结果的后一位开始,否则会死循环
print(position_of_1)
执行结果
>>>
==================== RESTART: C:/Users/l1z/Desktop/11.py ==================== [1, 3, 5, 7, 9, 14]
-
endswith(str, beg=0,end=len(stringname))
结束位判断,判断字符串的结尾是否为指定字符串str,返回布尔值。
>>> str3='string'
>>> str3.endswith('g')
True
>>> str3.endswith('g',0,5)
False
>>> str3.endswith('n',0,5)
True
stratswith(str, beg=0,end=len(stringname))
起始位判断,和结束位判断的用法相同。is系列方法,判断字符串的组成形式的方法,当字符串中至少有一个字符且满足特定条件时返回True,否则返回false,具体条件如下表。
方法名 | 返回True的条件 |
---|---|
isalnum() | 所有字符为字母或数字 |
isalpha() | 所有字符为字母 |
isdigit() | 所有字符为数字,支持bytes型字符串 |
isnumeric() | 所有字符为数字符号,包括汉字数字,不支持bytes |
isdecimal() | 所有字符为数字符号,不支持bytes |
isidentifier() | 字符串符合标识符的要求,首位为字母或_,由字母数字或_组成 |
isupper() | 所有区分大小写的字符为大写 |
islower() | 所有字符大小写的字符为小写 |
isspace() | 所有字符为空格 |
istitle() | 所有单词为首字符大写,其余小写的标题格式 |
写了下面这段代码,通过执行结果可以了解isdigit、isnumeric和isdecimal对数字字符的判断差别。
# coding:utf-8
decimal=[]
digit=[]
numeric=[] #定义存储字符的列表
for x in range(0,2**16): #遍历Unicode从0到2的16次方的所有字符
s=chr(x)
if s.isdecimal():
decimal.append(s) #将满足三种判断结果的字符写入到各自的列表中
if s.isdigit():
digit.append(s)
if s.isnumeric():
numeric.append(s)
print('Decimal:',decimal) #查看结果
print('Digit:',digit)
print('Numeric:',numeric)
字符串应用
-
join(seq)
用字符串为间隔,将序列seq拼接成一个长序列,返回这一长序列。
>>> seq=['H','e','l','l','o','!']
>>> str=','
>>> str.join(seq)
'H,e,l,l,o,!'
运算符
Python的基本运算和其他语言类似,分为赋值运算、算术运算、比较运算、身份运算、成员运算、逻辑运算和位运算。
算术运算符
算术运算符 | 运算 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法,结果为浮点数 |
// | 整除,结果为整数 |
% | 求余,结果为整数 |
** | 幂运算 |
赋值运算符
赋值运算符为=。
算术运算符后跟随赋值运算符可以构成相应的赋值运算符,如a+=b等价于a=a+b。
比较运算符
比较运算符 | 运算 |
---|---|
== | 等于 |
!=或<> | 不等于 |
>< | 大于和小于 |
>=和<= | 大于等于和小于等于 |
位运算符
位运算符将变量作为二进制数进行操作,逐位计算。
位运算符 | 运算 |
---|---|
& | 按位取与 |
按位取或 | |
^ | 按位取异或 |
~ | 按位取非,得到的数作为补码 |
>>a | 按位右移a位,空位补0 |
< |
>>> a=0b01011010 #90
>>> b=0b10001101 #141
>>> a&b
8 #00001000
>>> a|b
223 #11011111
>>> a^b
215 #11010111
>>> ~a
-91 #10100101作为补码
>>> a>>2
22 #00010110
>>> a<<2
360 #0101101000
逻辑运算符
逻辑运算符包括两个布尔值的与:and
或:or
运算和单个布尔值的非(not)运算。其逻辑如下,注意这里运算数x和y均可不是布尔值,若不是布尔值,除0外均看作True:
逻辑运算形式 | 逻辑 |
---|---|
x and y | 与逻辑 - 如果 x 为 False,返回 False,否则返回 y 的值 |
x or y | 或逻辑 - 如果 x 是 True,返回 x 的值,否则返回 y 的值 |
not x | 非逻辑,x的布尔值取反 |
成员运算符
成员运算符,判断元素是否在指定字符串,列表或元组中。
成员运算符 | 运算 |
---|---|
in | 成员在在指定序列中为true,否则false |
not in | 成员不在在指定序列中为true,否则false |
身份运算符
is
和not is
是两个身份运算符,用来判断两个标识符是不是引用自同一个对象。