- 📢博客主页:盾山狂热粉的博客_CSDN博客-C、C++语言,机器视觉领域博主
- 📢努力努力再努力嗷~~~✨
💡大纲
👉数字类型:分类(整数、浮点数、复数)、数字运算操作符与操作函数
👉字符串类型:基本性质(索引、切片)、操作符与操作函数
👉布尔类型:逻辑运算
👉类型转换:类型判断、类型转换
一、数字类型(不可变)
(一)分类
1、整数---不同进制的转换
👉默认输入十进制
👉二进制0b、八进制0o、十六进制0x
16 == 0b10000 == 0o20 == 0x10
#True
-
十进制转换为其他进制---bin、oct、hex
a = bin(16) # 转二进制
b = oct(16) # 转八进制
c = hex(16) # 转十六进制
print(a, b, c) # 0b10000 0o20 0x10
type(a) # str
⚠️转换后结果为字符串类型
-
其他进制转十进制---int(变量,进制类型)
d = int(a, 2) # 二进制转十进制
e = int(b, 8) # 八进制转十进制
f = int(c, 16) # 十六进制转十进制
print(d, e, f) # 16 16 16
⚠️布尔类型是整型的子类
2、浮点数---不确定性
💡浮点数在计算过程中不确定小数问题。因为计算机是使用二进制小数来表示浮点数的小数部分的,但是部分小数不能用二进制小数完全表示,二进制小数会无限逼近浮点数小数,通常不会影响计算精度
0.1 + 0.7 # 0.7999999999999999 四舍五入获得精确解0.8
a = 3*0.1
print(a) # 0.30000000000000004
b = round(a, 1) # 四舍五入,保留一位小数
print(b) # 0.3
b == 0.3 # True
- 导入decimal模块,表示十进制
import decimal
a = decimal.Decimal("0.1")
b = decimal.Decimal("0.2")
c = a + b
print(c) # 0.3 精确答案
- 科学计数法
0.00005 = 5e-05 # 5*10^-5
3、复数---a+bj
👉大写J或小写j均可
👉虚部系数为1时,需要显式写出
x = 1 + 2j # 实部与虚部都是浮点数
x.real # 1.0
x.imag # 2.0
complex(1,2) # 返回一个复数
(二)运算操作符(a 操作符 b)
⚠️整数与浮点数运算结果是浮点数
⚠️除法运算的结果是浮点数
1、加减乘除 + - * /
2、取反 -
x = 1
-x # -1
3、乘方 **
2**3 == 2*2*2 == 8
4、整数商、模运算
👉整数商//
13//5 # 2,整数商,相当于x/y 向下取整数
-3//2 # -2 取比目标结果小的最大整数
👉模运算%
13 % 5 # 3,模运算,求余数 13=2*5+3
⭕ 发现
- x == ( x // y ) * y + ( x % y )
(三)数字运算操作函数
1、绝对值 abs()
⚠️需要注意的是对复数求绝对值,其实是求模运算
abs(3+4j) # 5,(3^2+4^2)^0.5
2、幂次方 pow(x,n)
pow(2, 3) # 2的3次方,等价于2**3
pow(2, 5, 3) # 2^5%3,等于2
3、四舍五入 round(x,n)
a = 3.14159926
round(a) # 3,默认四舍五入为整数
round(a, 2) # 3.14,参数2表示四舍五入后保留2位小数
round(a, 10) # 3.14159926,位数不足无需补齐
4、整数商和模运算 divmod(x,y)
👉等价于返回二元元组(x//y,x%y)
👉较(x//y,x % y)更快,只执行了一次x/y
x,y = divmod(13,5) # 解包赋值
print(x) # 2
print(y) # 3
5、序列最大值最小值 max( )/min( )
👉括号里面可以直接给一系列的数,或者给列表、元组的变量
max(3, 2, 3, 6, 9, 4, 5) # 9
a = [3, 2, 3, 6, 9, 4, 5]
print("max:", max(a)) # 9
print("min:", min(a)) # 2
6、求和 sum(x)
👉对列表、元组等进行求和运算,参数是序列类型(元组、列表)
sum((1, 2, 3, 4, 5)) # 15
7、借助科学计算库 math/scipy/numpy
import math # 导入库
import numpy as np
二、字符串类型(不可变)
(一)表达
1、用""或''括起来的任意字符都表示字符串
print("Python") # Python
print('Python')
2、当字符串中有双引号或单引号时,用另一种方式来包含
-
双中有单(字符串中有单引号,则用双引号表达字符串)
print("I'm 18 years old")
- 单中有双
print('"Python" is good') # "Python" is good
- 双中有双,单中有单
print(""Python" is good")
⚠️不可以直接以这样的形式在双引号里再出现双引号,单引号同理。需要借助转义符\
👉\"在输出的时候表现为"
👉在转义字符后面添加'\'表示该行还没有写完,例如:\n\,表示换行后继续输入,实现长字符串
👉在字符串前加 r 可以让反斜杠 / 不发生转义
3、长字符串
👉使用""" """或''' '''对一段字符进行表示
x = """我是帅哥"""
(二)字符串的性质---索引
1、正向索引:从0开始递增
2、反向索引:从-1开始递减
👉不可以通过索引的方式改变对应的值,例如str[0] = "B",想要将"R"改为"B",这样是错的
👉位置编号不能超过字符串的长度
⚠️经观察发现索引只能获得一个字符,如何获得多个字符?
str = "Runoob"
print(str)
print(str[0])
print(str[6]) # 超出长度
(三)字符串的性质---切片
1、定义
💡变量名[开始位置:结束位置:切片间隔]
👉切片间隔如不设置默认为1,可省略
👉切片范围不包含结束位置。如s[a,b],不包含b,可以看作一个左闭右开的区间
👉起始位置是0 可以省略
👉结束位置省略,代表可以取到最后一个字符
👉可以使用反向索引
⚠️从左到右切
2、反向切片
👉起始位置是-1也可以省略
👉结束位置省略,代表可以取到第一个字符
⚠️间隔不能省略
⚠️从右到左切
print(str[0:-1])
print(str[::])
print(str[-1:-7:-1]) # 不包括结束位置
(四)字符串操作符
1、字符串的拼接:字符串1+字符串2
a = "I love "
b = "you "
a+b # 'I love you '
2、字符串的成倍复制:字符串 * n
c = a+b
print(c*3) # I love you I love you I love you
3、成员运算
👉子集 in 全集:任何一个连续的切片都是原字符串的子集(这是逻辑判断,返回True或False)
👉遍历字符串字符:for 字符 in 字符串
(五)字符串处理函数
1、长度 len
👉返回字符串所含字符的个数
s = "python"
len(s) # 6
2、字符编码(不重要)
💡将中文字库,英文字母、数字、特殊字符等转化成计算机可识别的二进制数
👉每个单一字符对应一个唯一的互不重复的二进制编码
👉Python 中使用的是Unicode编码
- 将字符转化为Unicode码---ord(字符)
print(ord("中")) # 20013
print(ord("国")) # 22269
- 将Unicode码转化为字符---chr(Unicode码)
print(chr(1010)) # c
(六)字符串的处理方法
1、字符串的分割
- 字符串.partition(分割字符)/.rpartition(分割字符)
👉返回一个三元组,默认是(分割左边,分隔符,分割右边)
👉默认从左到右进行切割
"www.ilovefishc.com".partition(".") # .作为分隔符,返回一个三元组('www', '.', 'ilovefishc.com')分别是分隔符左边内容,分隔符,分隔符右边内容。分割方向是从左到右
"www.ilovefishc.com".rpartition(".") # ('www.ilovefishc', '.', 'com'),从右到左进行分割
- 字符串.split(分割字符)/rsplit(分割字符)
👉原字符串不变,返回一个列表
👉可以指定切割次数
👉默认从左到右进行切割
languages = "Python C C++ Java PHP R"
languages_list = languages.split(" ")
print(languages_list) # ['Python', 'C', 'C++', 'Java', 'PHP', 'R']
print(languages) # Python C C++ Java PHP R
"www.ilovefishc.com".split(".",1) # 根据.切割一次 ['www', 'ilovefishc.com']
"www.ilovefishc.com".rsplit(".",1) # ['www.ilovefishc', 'com']
"www.ilovefishc.com".split(".") # ['www', 'ilovefishc', 'com']
- 字符串.splitlines(keepends = False)
👉默认分割所有系统环境下的换行符
👉参数表示分割结果是否包含换行符,Ture表示包含
"www\nilovefishc\ncom".splitlines() # ['www', 'ilovefishc', 'com']
"www\nilovefishc\ncom".splitlines(True) # ['www\n', 'ilovefishc\n', 'com']
2、字符串的拼接---“聚合字符”.join(可迭代数据类型)
👉原字符串不变,返回一个字符串
👉可迭代类型如:字符串、列表,序列类型的元素必须是字符类型
👉其实就是用聚合字符将可迭代数据类型分隔开
s = "12345"
",".join(s) # '1,2,3,4,5'
s = ["1", "2", "3", "4", "5"]
"*".join(s) # '1*2*3*4*5'
".".join(['www', 'ilovefishc', 'com']) # 'www.ilovefishc.com'
"".join(["fishc","fishc"]) # 'fishcfishc'
3、截取字符串
-
删除两端特定字符---字符串.strip(删除字符)
👉原字符串不变,返回一个字符串
👉strip从两侧开始搜索,遇到指定字符执行删除(可以是一段字符,根据该段字符在字符串中逐一查找删除),遇到非指定字符,搜索停止
👉类似的还有左删除lstrip和右删除rstrip
s = "**********I have many books*****"
print(s.strip("*")) # I have many books
print(s.lstrip("*")) # I have many books*****
print(s.rstrip("*")) # **********I have many books
print(s) # **********I have many books*****
" 左侧不要留白".lstrip() # 默认是删除空白,'左侧不要留白'
# 对参数中的字符逐一删除
"www.ilovefishc.com".lstrip("wcom.") # 'ilovefishc.com'
"www.ilovefishc.com".rstrip("wcom.") # 'www.ilovefish'
"www.ilovefishc.com".strip("wcom.") # 'ilovefish'
- 删除指定的前缀或后缀---字符串.removeprefix/removesuffix(删除字符)
👉可以删除字符串的前缀或后缀,不是逐个字符的删除
"www.ilovefishc.com".removeprefix("www.") # 'ilovefishc.com'
"www.ilovefishc.com".removesuffix(".com") # 'www.ilovefishc'
4、字符串的替换
👉将字符串中的Tab换为空格
code = """
print("I Love")
print("I")"""
new_code = code.expandtabs(4)
print(new_code)
'''
print("I Love")
print("I")
'''
👉字符串.replace("被替换","替换成"),原字符串不变,返回一个字符串
s = "Python is good"
s1 = s.replace("Python","C++")
print(s1) # C++ is good
👉translate(table) 根据table进行字符串的转换
table = str.maketrans("ABCDEFG","1234567") # 规定一个变化表格
"I Love FishC".translate(table) # 根据变化表格进行转换
table = str.maketrans("ABCDEFG","1234567","Love") # 第三个参数是将指定的字符串忽略
"I Love FishC".translate(table) # 'I 6ish3'
5、字符串查找统计
👉字符串.count("待统计字符",起始位置,结束位置) 统计字符串中某子字符的数量
👉字符串.find("待查找字符") 从左往右查找字符
👉字符串.rfind("待查找字符") 从右往左查找字符
👉字符串.index("待查找字符") 查找字符串
x = "上海自来水来自海上"
# 统计字符
x.count("海") # 2
x.count("海",0,5) # 1
# 返回字符下标
x.find("海") # 1 该字符下标
x.rfind("海") # 7
x.find("龟") # -1 对于字符串中没有的字符,返回下标-1
x.index("龟") # 会报错
6、字符串字母大小写
👉字符串.capitalize() 首字母大写,其他字母变为小写
👉字符串.casefold() 全部小写(可以处理多种语言)
👉字符串.title()
👉字符串.swapcase() 字符串的所有单词大小写反转
👉字符串.upper()
👉字符串.lower()
s = "Python"
s.upper() # 全部大写,'PYTHON'
s.lower() # 全部小写,'python'
s.title() # 首字母大写,'Python'
7、左中右对齐
x = '有内鬼,停止交易!'
x.center(15,"*") # 可以用*来填充,更改填充符
x.center(15) # ' 有内鬼,停止交易! '
x.rjust(15) # ' 有内鬼,停止交易!'
x.ljust(15) # '有内鬼,停止交易! '
x.zfill(15) # '000000有内鬼,停止交易!'
"520".zfill(5) # '00520'
"-520".zfill(5) # '-0520'
8、字符串的判断和检测(返回是bool类型)
x.isdigit()/x.isdecimal()/x.isnumeric() | 纯数字 |
x.isalpha() | 纯字母 |
x.isalnum() | 由数字和字母组成 |
x.startswith()/字符串.endswith() | 字符是否在字符串开头或结尾 |
x.istitle() | 大写字母开头,其他字母均为小写 |
x.isupper()/x.islower() | 全为大写字母或小写字母 |
x.isspace()/x.isprintable() | 判断是不是空白字符串/可打印字符串 |
x.isidentifier() | 是不是一个合格的python标识符 |
keyword.iskeyword('if') | 是不是关键字 |
👉比如可用于判断用户名是否合法
age = "20"
name = "wang"
fix = "wang24"
age.isdigit() # True
name.isdigit() # False
name.isalpha() # True
fix.isalnum() # True
x = "I love Python"
x.istitle() # False,因为l没有大写
x.isupper() # 判断是不是均为大写
x.islower()
# 判断是不是数字
x.isdecimal()
x.isdigit()
x.isnumeric() # 可以处理所有数字类型(中文、罗马数字、繁体字)
x = "i am boy"
x.isidentifier() # False
👉比如可用于判断子字符串在字符串中的位置是否为首尾
x = "我爱python"
x.startswith('我') # startswith 判断某个子字符的位置是否在字符串的开始位置 Ture
x.startswith('爱', 1) # 规定从爱开始进行查找
x.endswith('n') # endswith 判断某个子字符的位置是否在字符串的末尾位置 Ture
x.endswith('py', 0, 4)
# 可以传入元组
x = "他爱python"
if x.startswith(("你","我","他","她")):
print("总有人喜欢python")
👉判断是不是空白字符串、可打印的字符串
x = " \n"
x.isspace() # 判断字符串是不是空白字符串,不仅仅只空格键
"I love you\n".isprintable() # False,因为\n转义字符不是可打印的字符串
👉判断是不是关键字
import keyword
keyword.iskeyword('if') # Ture
9、格式化字符串的方法:format
👉基本格式:"字符{ 0 }字符{ 1 }字符".format(v0,v1)
👉位置索引:参数中的字符串会当作元组的元素来对待,所以有自己的索引值
👉关键字索引:不用关注索引值,根据给定的关键字进行赋值
👉两者联合使用的话,位置参数要放在前面
"我叫{name},我爱{fiv}".format(name="小甲鱼",fiv="python")
"我叫{name},我爱{0},喜欢{0}的人,运气都不会差".format("python",name="小甲鱼")
"{},{{}},{}".format(1,2) # '1,{},2' 里面的花括号被注释了
- 填充与对齐
print("{0:_^20}".format(PI)) #用下划线_符号进行填充,整个字符串宽度为20,数据居中对齐
- 数字千分位分隔符
print("{0:,}".format(10000000))
#1,000,000
print("{0:&>20,}".format(10000000))
#&&&&&&&&&&10,000,000
- 浮点数类型输出
"{0:.2f}".format(3.1415) # 3.14
"{:.2g}".format(3.1415) # 3.1
"{:.6}".format("I Love FishC") # 'I Love'
-
按百分数输出,保留一位小数
print("{0:.1%}".format(0.818727)) # 81.9%
-
科学计数法输出
print("{0:.2e}".format(0.818727)) # 8.19e-01
👉十进制整数转二进制、unicode码、十进制、八进制、十六进制输出
"二进制{0:b},Unicode码{0:c},十进制{0:d},八进制{0:o},十六进制{0:x}".format(450)
# '二进制111000010,Unicode码ǂ,十进制450,八进制702,十六进制1c2'
# "{:#b}".format(80) # '0b1010000',添加前缀0b
⭕总结
👉"字符{0:修饰}字符{1:修饰}".format(v0,v1)
10、f-字符串
👉在字符串前面添加'f'或'F',向系统表示这是format语句
三、布尔类型TRUE/False
- 定义为False的对象:None、False
- 值为0的数字类型:0、0.0、0j、Decimal(0)
- 空的序列和集合:''、()、[]、{}、set()、range(0)
(一)逻辑运算的结果
a = 11
print(a > 4) # True
print(a == 13) # False
print(a < 5) # False
(二)操作函数
1、any()
👉有一个为真就返回True
2、all()
👉全真,则返回True
print(any([False,1,0,None]))
print(all([False,1,0,None]))
(三)作为指示条件,用于循环判断
(四)作为掩码(numpy)
四、类型判别和转换
(一)类型判别
1、type(变量)
age = 22
print(type(age)) # <class 'int'>
2、isinstance(变量,预判类型)
👉承认继承
👉变量类型是预判类型的子类型为真,否则为假
print(isinstance(age, int)) # True,承认继承
print(isinstance(age, object)) # True,object是最高等级的老祖宗
(二)字符串检查方法
(三)类型转换
1、数字类型转字符串---str(数字类型)
age = 24
print("My age is "+str(age)) # My age is 24
2、仅有数字组成的字符串转数字---int()/float()/eval()
s1 = "24"
s2 = "2022.1"
int(s1) # 24
float(s1) # 24.0
int(s2) # 报错,int只能将整型字符串转换为整型数字
float(s2) # 2020.1
eval(s1) # 24,去引号
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!