数据类型
如前面提到的字符串(str)和整型(int),以及还没提到的浮点型(float)和布尔值(bool),都是Python中的基础数据类型。每一个值,都有自己对应的数据类型。
对于字面量"我是一条字符串"而言,字符串就是他的类型;对于字面量9331而言,整型就是他的类型;对于被赋值为4637的变量a而言,整型就是他的数据类型;对于被赋值为"九三三一"的变量b而言,字符串就是他的数据类型。
想要知道每个数据对应的数据类型,可以使用type()函数。在括号内放入想知道类型的值,则type()的返回值是其类型。
print(type(1234028))
print(type("1234241"))
a = 0
b = "0"
print(type(a))
print(type(b))
# 运行结果:
# <class 'int'>
# <class 'str'>
# <class 'int'>
# <class 'str'>
整型int 浮点型float
在生活中,有整数和小数,而Python中,对应的就有整型和浮点型。
这两种类型的值都可以用字面量生成。
a = 108
b = 10.8
print(type(a))
print(type(b))
# 运行结果:
# <class 'int'>
# <class 'float'>
在整型和整型,浮点型和浮点型,整型和浮点型之间,可以做数学运算。
常见的运算符号有+,-,*(乘号),/(除号),除此之外还有**(幂运算符),%(取模),//(商为整数是为取商的整数部分,商为负数时为原商的向下取整)。
两个int或float类型的值中间放上运算符,就能生成运算结果,获取结果只需要把整个运算式作为值调用即可,类似于获取函数的返回值。
其中,整型与整型运算返回值任然是整型。但是,如果任意一个参与运算(哪怕是多项式运算)的数据是浮点型,那么返回值类型就是浮点型。
a = 178
b = 13
print(a + b)
c = a + b
print(c)
print(type(a + b))
print(type(10 - 99))
print(type(1 + 0.5))
print(type(0.5 + 0.1))
print(type(0.5 + 0.5))
print(0.5 + 0.5)
# 运行结果:
# 191
# 191
# <class 'int'>
# <class 'int'>
# <class 'float'>
# <class 'float'>
# <class 'float'>
# 1.0
可以看到,即使0.5+0.5的结果应当是1,但是Python输出的类型任然是float,并且结果为1.0。
在Python内,有许多函数可以为int和float的计算提供帮助。使用f(你的数据)可以生成所需的返回值。
| abs(x) | 返回数字的绝对值,如abs(-10) 返回 10 |
| ceil(x) | 返回数字的上入整数,如math.ceil(4.1) 返回 5 |
| exp(x) | 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045 |
| fabs(x) | 以浮点数形式返回数字的绝对值,如math.fabs(-10) 返回10.0 |
| floor(x) | 返回数字的下舍整数,如math.floor(4.9)返回 4 |
| log(x) | 如math.log(math.e)返回1.0,math.log(100,10)返回2.0 |
| log10(x) | 返回以10为基数的x的对数,如math.log10(100)返回 2.0 |
| max(x1, x2,...) | 返回给定参数的最大值,参数可以为序列。 |
| min(x1, x2,...) | 返回给定参数的最小值,参数可以为序列。 |
| modf(x) | 返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。 |
| pow(x, y) | x**y 运算后的值。 |
| round(x [,n]) | 返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。其实准确的说是保留值将保留到离上一位更近的一端。 |
| sqrt(x) | 返回数字x的平方根。 |
字符串str
前面我们了解了,字符串类型可以用引号创建,如"我是字符串"。
这里补充一下,单引号和双引号都可以在Python中创建字符串,效果相同。
在Python中,代码被一行一行的读取,这也就意味着我们无法跨行写多行字符串,那么,有没有什么方法,可以实现多行字符串?
首先,是三对引号("""我是字符串"""),被三对引号包裹的字符串可以跨行,任然可以被正常print()。
print("""第一行
第二行
第三行""")
# 运行结果:
# 第一行
# 第二行
# 第三行
其次,还有一种方法——转义符号\n。在Python中,反斜杠\加上一些特定的字符可以触发特殊的效果,我们称这种把正常字符前加上\来改变用法的行为为转义。
| \' | 代表一个单引号 |
| \" | 代表一个双引号 |
| \\ | 代表一个反斜杠 |
| \n | 换行 |
| \r | 返回光标至首行 |
| \f | 换页 |
| \v | 垂直制表符 |
| \t | 水平制表符 |
| \b | 删除一个字符再打印,相当于 Backspace 按键 |
| \0 | 空字符 Null |
| \0oo | 三位的八进制数表示的字符 |
| \xXX | 两位的十六进制数表示的字符 |
我们常用的是\n,\',\",\\。因为引号为被Python识别为字符串标识,所以想要在字符串内打出引号就要使用反斜杠+引号来表示;反斜杠是同理,因为会被识别为转义标识,所以想要在字符串内打出反斜杠就要使用双反斜杠\\。
而\n代表的是换行,可以在同一行Python代码内对字符串执行换行操作。
print("第一行\n第二行\n第三行")
# 运行结果:
# 第一行
# 第二行
# 第三行
而print()执行输出的时候,其实自动在每个字符串末尾加上了\n,所以我们每使用一次print()就会换到下一行输出新内容,而不是在原先的行内输出。
print("第一行")
print("第二行")
print("第三行")
# 运行结果:
# 第一行
# 第二行
# 第三行
如果你不想要print()的自动换行操作,你可以对print()进行参数设置。
像print()这样的函数括号内填入的值叫参数,我们在print()内常填入的字符串就是一种参数。
而print()有一个隐藏参数——end。他的作用是改变print()在字符串末尾添加的值,当你不启用时,end默认为'\n',也就是换行。而我们只需要把end换成空字符串'',就可以实现不自动换行。
print("a", end='')
print("b")
print("c")
# 运行结果:
# ab
# c
print("a", end='')
print("b\n", end='')
print("c\n", end='')
# 运行结果:
# ab
# c
上面的两种代码实际上是等价的,通过对比你可以清晰地看出end的实质——不填写时在字符串末尾加'\n',填写时在字符串末尾加填入的值。
字符串可以通过str[int]的索引方式索引对应位置的字符。
比如,字符串a = "Hello World",其长度为11。索引会为字符串中的每个字符都分配一个对应的号数,叫做下标。从"H"到"d"分别为0、1、2、3、4、5、6、7、8、9、10。Python中的下标都是从0开始数,这是编程语言的惯例。而我们想知道对应位置的字符,只需要在字符串后面加上中括号,括号内放入字符对应的下标即可。
例如,对于"H",我们可以通过a[0]的方式得到"H"这个值。这个逻辑可以从0到10类推,但不能超过最大下标,否则会报错。
我们可以通过负数下标从字符串最后一个字符往前查找,例如,对于"d",我们可以通过a[-1]的方式获取值。此时,顺序就是-1到-11,比如"H"既可以表示为a[0],又可以表示为a[-11]。
为防止因超出最大下标而导致的错误,我们可以使用len()函数。把想知道长度的字符串作为参数,就可以得到其长度的返回值,返回值类型为int。此时,假如len(a)为n,则a的下标范围是0到n-1。
a = "ladder"
b = 'step'
print(a[0])
print(b[-4])
print(len(a))
print(b[len(b)-1])
# 运行结果:
# l
# s
# 6
# p
字符串可以通过切片操作获取其中的部分字符,操作为str[int:int:int],其中,中括号内的三个值分别代表起始位置,结束位置,步长。其中,起始位置和结束位置遵循左闭右开原则,也就是[start, end),因此,end的最小值为1,最大值为最大下标+1,而start的最小值为0,最大值为最大下标。而步长则代表了每间隔多少字符取一个字符。
在不填写的情况下(str[::]),起始位置默认值为0,结束位置默认值为最大下标+1,步长默认值为1。
a = "ladder step"
b = a[:6:]
c = a[7::]
print(b)
print(c)
# 运行结果:
# ladder
# step
字符串可以通过+进行拼接。(str+str+...+str)
a = "ladder"
b = "step"
print(a+' '+b)
# 运行结果:
# ladder step
字符串可以通过*复制。(str*int)
a = "ladder"
print(a*3)
# 运行结果:
# ladderladderladder
字符串的拼接只限于str类型与str类型之间,那么,如果我们想同时输出str与int类型,应该怎么做呢?
第一个方法是在print()内使用逗号隔开,但这个方法只能在print()内使用,并且隔开的两个值之间会被插入一个空格。
如果想要两个值之间不插入空格,可以修改print()的sep参数。
这个参数类似于end,其在默认状态下为在逗号隔开的值中间插入' '(空格),你可以通过修改sep为''(啥也没有)来达成完美的拼接效果。
a = "ladder"
b = 666
print(a, b)
print(a, b, sep='')
# 运行结果:
# ladder 666
# ladder666
第二个方法是把int转化为字符串。
首先我们要知道,1和'1'是有着本质区别的。前者是int,后者是str;前者可以参与数学计算,但不可以拼接于字符串;后者可以拼接于字符串,但不能参与数学计算。
我们想让int和字符串拼接,只需要把int转为str就可以了,也就是把1转化为'1'。
这里可以用str()生成,只需要把int类型的值放入括号并重新赋值,就可以变成str类型的值。
注意,这里的str()并不是函数,而是一个类,返回值也不是一个单纯的值,而是一个对象,在后期会学习到,这里可以先把str()当转化为str类型的函数用。
a = "ladder"
b = 666
b = str(b)
print(a+b)
# 运行结果:
# ladder666
顺带一提,input()函数的返回值是str类型的,所以不能参与数学运算。但是,当我们希望用户输入的值可以参与数学运算时,我们就可以在input()外套一层int()把str转化为int类型,int()于str()原理类似。
num = int(input("请输入你的年龄:"))
print("你十年后"+str(num+10)+"岁")
# 用户输入:
# 18
# 运行结果:
# 你十年后28岁
第三个方法是利用格式化字符串。我认为string.format的方式有点落后难用,我这里介绍f-string这种格式化字符串。
首先,格式化字符串不是"我是字符串",而是f"我是字符串",区别就在于在引号前加了一个f,代表格式化。
然后,你就可以在字符串中插入大括号,并在大括号内填入不同类型的值或表达式。如果是值,值会被转为字符串类型并拼接;如果是变量,就会取变量内的值转为字符串类型并拼接;如果是表达式,例如1+1,那么就会把表达式的结果,也就是2,转化为字符串类型并拼接。
num = int(input("请输入你的年龄:"))
print(f"你十年后{num+10}岁")
# 用户输入:
# 18
# 运行结果:
# 你十年后28岁
怎么样,用f-string改过后的程序,是不是明显比上面的更简洁,可读性更高了?

Comments NOTHING