Python每日一学 02——对象与变量
一、对象
Python中所有数字、序列、集合、映射、类、实例、异常、模块、类与类的实例、函数、方法、布尔值、空值等都被称为对象。
二、对象属性
每个对象都有3个基本属性:
类型(type)
身份标识(id)
值(value)
type(object) 函数可以返回对象 object 的数据类型,对象一旦创建其类型便不可再变。
id(object) 函数可返回表示对象object的身份标识,也就是系统为这个对象分配的内存的首地址编号,用一个整数表示。对象创建后,其身份标识 id 绝对不会改变。
value就是这个对象存储的值。
有些对象的值可以改变,称为可变数据类型,与之相对,值不可以改变的对象称为不可变数据类型。
print(type(500)) # 类型为:整型 <class 'int'>
print(id(500)) # 内存地址为:139798173271824,与机器有关,每次运行不同
<class 'int'>
139798173271824
程序先创建一个整数对象“500”,500 称为这个对象的值,该对象的数据类型为整型int,可用函数type(500)来获取。系统会为其分配一个内存区域,可用函数id(500)获取,返回值“2562179721328”为该对象在内存地址的起始编号。
每个对象除了这三个基本属性以外,在使用过程中,用户经常会通过加标签的方式给对象附加一个标识符,也称为名字(name),以方便在程序中通过这个名字引用该对象。这个名字与其他程序设计语言中的变量作用相似,所以 Python 中也经常称之为变量。Python中用赋值符号(=)给对象加标识符,也可以说是给对象增加名字或是没用传统称为给变量赋值。同一个对象可以命多个名字,不同对象命相同名字时,应用时访问最邻近命名的那个对象。
num = 500 # 名字为num
print(type(num)) # <class 'int'>
print(id(num)) # 2562179721328
print(num) # 值为500
<class 'int'>
139798173272080
500
三、赋值
将一个标签名字绑定到一个对象上的操作,命名后可以用这个名字来引用或者说访问该对象,这个操作用赋值符号“=”完成。Python中的变量在使用前不需要声明,也不需要声明其类型。但每个变量在使用前都必须先有值才可以使用,也就是说变量首次出现必须是在赋值符号的左侧。只有当一个对象被赋值给一个变量后,该变量才会被创建。
x = 5 # 名字x 绑定到整数5上
print(x)
y = 'hello' # 名字y 绑定到字符串'hello' 上
print(y)
z = [1, 2, 3, 4] # 名字z 绑定到列表[1, 2, 3, 4]上
print(z)
x = (16 + (8 ** 2 - 4 * 6 * 2) ** 0.5) / (2 * 5) # 名字x 绑定到表达式求值得到的浮点数对象上
print(x)
5
hello
[1, 2, 3, 4]
2.0
在同一个程序中对一个变量重复赋值,或者说重复使用同一个变量名时,起作用的是最近的语句。下面程序中先将浮点型对象“3.14”和整型对象“4”分别与变量名“pi”和“radius”绑定,此时计算面积时,参与运算的是“3.14”和“4”,得到的浮点型对象“50.24”与变量名“area”绑定。 当程序执行到 radius = 6 时,“radius”这个名字将先与对象“4”解绑,再重新绑定到对象“6”上。类似的操作,执行area = pi * (radius ** 2) 时,“area”也会与对象“50.24”解除绑定并重新绑定到对象“113.24”上。
pi = 3.14 # 变量pi赋值为3.14
radius = 4 # 变量radius赋值为4
area = pi * (radius ** 2) # 计算圆面积
print(area) # 输出面积值 50.24
radius = 6 # 变量radius赋值为6,后面使用这个值
area = pi * (radius ** 2) # 计算圆面积
print(area) # 输出面积值 113.04
50.24
113.04
需要命名的对象可以是包含于圆括号、方括号、大括号或引号内的可迭代对象。如果赋值号左边是一个名字,则将名字直接绑定到右侧对象上。若左边名字多于一个时,名字数量必须与右侧的可迭代对象中的元素或字符数量相同,这些名字将按从左至右的顺序被绑定到对应元素或字符,这种操作称为同步赋值。
x = 1, 2
print(x) # (1, 2),名字 x 绑定到元组(1, 2)上,后面用x访问这个元组
(1, 2)
x, y = 1, 2 # 左侧有2个名字,右侧对象中有2个元素1和2,数量相同
print(x, y) # 1 2,要求右侧对象中元素数量与左侧变量数量相同
1 2
x, y = {1, 2}
print(x, y) # 1 2,要求右侧对象中元素数量与左侧变量数量相同
1 2
x, y, z = 'abc'
print(x, y, z) # a b c,要求右侧对象中字符数量与左侧变量数量相同
a b c
利用同步赋值方法可以实现两个变量指向对象的交换:
m, n = 5, 10 # m,n = (5,10),将5 赋值给m, 将10赋值给n
print(m, n) # 输出 5 10
print(f'm = {m}, n = {n}') # 输出 m = 5, n = 10
m, n = n, m # 交换变量 m 和 n 所指向的对象
print(m, n) # 输出 10 5
print(f'm = {m}, n = {n}') # 输出 m = 10, n = 5
5 10
m = 5, n = 10
10 5
m = 10, n = 5
从上面输出中可以看到,同步赋值可以方便的交换两个变量的值。用f-string格式输出语义更清晰明了,推荐使用。split()方法可根据指定分隔符将对象切分为列表,可将这个方法作用于input()函数上,将在一行内输入的多个数据切分为一个列表,被分隔符分开的多个数据作为列表的元素。参数缺省时,默认用空格切分对象,如果指定了分隔符,则用分隔符进行切分。
m,n = input().split() # split()参数缺省时,可根据空格将输入切分为列表
# 例如输入 “100 200”,可被切分为[100,200],然后将列表中的元素分别赋值给m,n
print(m,n) # 输出 100,200
print(f'm = {m}, n = {n}') # 输出 m = 5, n = 10
100 200
100 200
m = 100, n = 200
split()可根据逗号(‘,’)若其他符号将输入切分为列表,用于切分的符号放到括号中作为参数。
m,n = input().split(',') # split()可根据逗号(',')将输入切分为列表
# 例如输入 “100,200”,可被切分为[100,200],然后将列表中的元素分别赋值给m,n
print(m,n) # 输出 100,200
print(f'm = {m}, n = {n}') # 输出 m = 5, n = 10
100,200
100 200
m = 100, n = 200
例如:用hour, minute, second做变量名,在一行内输入一个包含小时、分钟和秒的时间,按测试用例格式输出(表示时间的数字根据自己的输入变化)。
# 补充你的代码
hour, minute, second = input().split(':')
print(f'现在是北京时间{hour}时{minute}分{second}秒')
23:07:58
现在是北京时间23时07分58秒
Python提供了“+=、-=、*=、/=、//=、%=、**%=”等增强赋值语句,在单个语句中将二元运算和赋值语句合为一体,具体描述参见下表。
c = 100 # 将数字100命名为c
print(c)
c = c + 8 # 将 100 + 8 的运算结果命名为 c,c值为108
print(c)
c += 8 # 与c = c + 8相同,将 108 + 8 的运算结果命名为 c,c值为116
print(c)
100
108
116
符号 | 描述 | 实例 | 解释 |
---|---|---|---|
+= | 加法运算赋值符 | c += a | c = c + a |
-= | 减法运算赋值符 | c -= a | c = c - a |
*= | 乘法运算赋值符 | c *= a | c = c * a |
/= | 除法运算赋值符 | c /= a | c = c / a |
%= | 取模运算赋值符 | c %= a | c = c % a |
**= | 幂运算赋值符 | c **= a | c = c ** a |
//= | 整除运算赋值符 | c //= a | c = c // a |
Python 3.8 以后的版本增加了一个称为赋值表达式(也称海象运算符)的新特性,语法为:
name := expression
赋值表达式把一个表达式的值赋给一个标识符,返回表达式的值。例如,经常需要重复输入并进行处理,当输入回车时结束输入,实现代码如下:
# 下面代码作用是重复接受收入,输入非空时输出输入的字符串,输入为空时结束程序
while True: # 构建无限循环
user_name = input() # 循环内重复输入用户名
if not user_name: # 若直接输入回车时,user_name为空字符串,值为False
break # 结束循环
print(user_name) # 输入非空字符串时输出
1
1
2
2
上述代码可用赋值表达式更简洁的实现(解释器版本高于3.8时才可用),代码如下:
# 下面代码作用是重复接受收入,输入非空时输出输入的字符串,输入为空时结束程序
while user_name := input(): # 输入回车时,user_name值为空字符串,表达式值为False,结束循环
print(user_name) # 输入不是回车时进入循环执行处理语句
1
1
2
2
0
0