基本变量类型与运算符

时间:2021-08-22 11:34:34

基本变量类型

Python的变量本身没有类型,通常说类型指的是变量对应的对象类型。这种特性的语言称之为动态语言,区别于变量必须指定类型且不能存入其他类型数据的静态语言。

Python能处理的对象类型包括数字、布尔值、字符串、列表、元组、字典和集合等。其中前三种为基本变量类型,后四种为集合类变量,由基本变量组成。

- 数字

数字类型变量用于存储数据,包括整形int、浮点float和复数comlex。

-整数

Python可以存储计算任意大小的整数,包括正负和0。同时也可以用前缀0x表示十六进制数、前缀0o表示八进制。

- 浮点数

Python中浮点数可以使用小数形式如1.23和科学计数法如1.23e51.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,但是当程序存储到磁盘或进行网络传输时,需要以字节段形式保存,字符串类型需要转换为bytesbytes类型的字符串在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

身份运算符

isnot is是两个身份运算符,用来判断两个标识符是不是引用自同一个对象。