Python 变量、数据类型、运算符
1. 变量与数据类型
2. Python中的“引用”概念
3. 常用的数据类型转换
4. 运算符
1. 变量与数据类型
1.1 什么是变量
在Python中,存储一个数据,需要一个叫做变量的东西。
程序就是用来处理数据的,而变量就是用来存储数据的。
1 num1 = 100 # num1就是一个变量,好比一个菜篮子 2 3 num2 = 87 # num2也是一个变量 4 5 result = num1 + num2 # 把num1和num2这两个"菜篮子"中的数据进行累加,然后放到result变量中
1.2 Python中的命名规范
什么是标识符?
- 标识符是开发人员在程序中自定义的一些符号和名称,如变量名 、函数名等。
- 标示符由字母、下划线和数字组成,且数字不能开头。
命名规范
-
小驼峰式命名法(lower camel case): 第一个单词以小写字母开始;第二个单词的首字母大写,例如:myName、aDog
-
大驼峰式命名法(upper camel case): 每一个单字的首字母都采用大写字母,例如:FirstName、LastName
-
在程序员中还有一种命名法比较流行,就是用下划线“_”来连接所有的单词,比如send_buf
关键字
- 关键字,是Python已经使用的了,一些具有特殊功能的标示符,所以不允许开发者自己定义和关键字相同的名字。
- 查看Python中关键字的方法:
1 >>> import keyword 2 >>> keyword.kwlist 3 ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
注释
- 在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。
1 >>> # 单行注释 2 >>> """ 3 ... 多行注释 4 ... …… 5 ... """
1.3 数据类型
在Python中,只要定义了一个变量,而且它有数据,那么它的类型就已经确定了,不需要开发者主动地声明它的类型,系统就会自动识别。
想一想,我们应该让变量占用多大的空间,保存什么样的数据?
在程序中,为了更充分地利用内存空间以及更有效率地管理内存,数据是有不同的类型的,如下所示:
- Number(数字)
- int(有符号整型)
- long(python2有,而3没有)
- float(浮点型)
- complex(复数)
- bool(布尔)
- String(字符串)
- List(列表)
- Tuple(元组)
- Dictionary(字典)
- Set(集合)
bool(布尔):
- 在 Python2 中是没有布尔型的,它用数字 0 表示 False,用 1 表示 True;
- 在 Python3 中,把 True 和 False 定义成关键字了,但它们的值还是 1 和 0,它们可以和数字相加。
1 >>> True + 2 2 3 3 >>> False / 2 4 0.0
可以使用 type() 函数来查看变量的类型:
1 >>> a = 1 2 >>> type(a) 3 <class 'int'> 4 >>> b = 1.0 5 >>> type(b) 6 <class 'float'> 7 >>> c = 1+1j 8 >>> type(c) 9 <class 'complex'> 10 >>> d = True 11 >>> type(True) 12 <class 'bool'> 13 >>> e = [1, 2, b] 14 >>> type(e) 15 <class 'list'> 16 >>> f = (1, 2, b) 17 >>> type(f) 18 <class 'tuple'> 19 >>> g = {1: a, "b": 2} 20 >>> type(g) 21 <class 'dict'> 22 >>> h = {1, a, 2} 23 >>> type(h) 24 <class 'set'>
还可以使用 isinstance() 函数来判断:
1 >>> a = 1 2 >>> isinstance(a, int) 3 True
type() 与 isinstance() 的区别:
-
type():认为子类与父类不是同一类型。
-
isinstance():认为子类与父类是同一类型。
1 >>> class A: 2 ... pass 3 ... 4 >>> class B(A): 5 ... pass 6 ... 7 >>> isinstance(B(), A) 8 True 9 >>> type(B()) == A 10 False
1.4 可变类型与不可变类型
不可变类型,即其值不可改变(当变量的值发生改变时,其引用的内存地址也发生改变):
- 数值
- 字符串
- 元组
可变类型,即其值可以改变(当变量的值发生改变时,其引用的内存地址不发生改变):
- 列表
- 字典
- 集合
1 >>> a = 1 2 >>> id(a) 3 1349380016 4 >>> a = 2 # 此时已改变了引用的内存地址 5 >>> id(a) 6 1349380032 7 >>> 8 >>> a = "a" 9 >>> id(a) 10 15288384 11 >>> a = "b" # 此时已改变了引用的内存地址 12 >>> id(a) 13 15320000 14 >>> 15 >>> a = [1, 2] 16 >>> id(a) 17 51719336 18 >>> a[0] = 2 # 此时是在原有内存地址上进行修改 19 >>> a 20 [2, 2] 21 >>> id(a) 22 51719336
2. Python中的“引用”概念
在 python 中,值是靠引用来传递的,如下图所示:
- 在C语言中,变量a和变量b均各自保存着100的值;
- 而在python中,变量a和变量b引用的是同一份(即100这个值的)内存地址。
可以用 id() 函数来判断两个变量是否为同一个值的引用,可以将 id 值理解为那块内存地址标示。
示例1:不可变类型的引用
1 1 >>> a = 1 2 2 >>> b = 1 3 3 >>> id(a) 4 4 1349380016 5 5 >>> id(b) 6 6 1349380016 # 两个变量的id值相同 7 7 >>> a = 2 8 8 >>> id(a) 9 9 1349380032 # 变量a的id值已改变 10 10 >>> id(b) 11 11 1349380016 # 变量b的id值未变
示例2:可变类型的引用
1 >>> a = [1, 2] 2 >>> b = a 3 >>> id(a) 4 51719368 5 >>> id(b) 6 51719368 7 >>> a.append(3) 8 >>> a 9 [1, 2, 3] 10 >>> id(a) 11 51719368 12 >>> id(b) 13 51719368 # 变量a和变量b的id值始终一致
3. 常用的数据类型转换
函数 | 说明 |
---|---|
int(x) | 将x转换为一个整数 |
long(x) | 将x转换为一个长整数 |
float(x) | 将x转换到一个浮点数 |
complex(real) | 创建一个复数 |
str(x) | 将对象 x 转换为字符串 |
repr(x) | 将对象 x 转换为表达式字符串 |
eval(str) | 用来计算在字符串中的有效Python表达式,并返回一个对象 |
tuple(s) | 将序列 s 转换为一个元组 |
list(seq) | seq:要转换为列表的元组或字符串 |
dict(x) | 将对象如(a=1, b=2, c=3)转换为一个字典 |
set(x) | 将对象x转换为一个无序不重复的元素集合 |
chr(x) | 将一个整数转换为一个字符 |
unichr(x) | 将一个整数转换为Unicode字符 |
ord(x) | 将一个字符转换为它的整数值 |
hex(x) | 将一个整数转换为一个十六进制字符串 |
oct(x) | 将一个整数转换为一个八进制字符串 |
示例1:
1 >>> int("100") 2 100 3 >>> float(100) 4 100.0 5 >>> str(100.0) 6 '100.0' 7 >>> complex(100) 8 (100+0j) 9 >>> repr(1+1) 10 '2' 11 >>> eval("1+1") 12 2
示例2:tuple()
1 >>> tuple() # 创建空元组 2 () 3 >>> tuple([1, 2, 3]) # 传入列表 4 (1, 2, 3) 5 >>> tuple("www") # 拆分每个字符 6 ('w', 'w', 'w') 7 >>> tuple({1: 2, "a": 2}) # 仅返回字典的键 8 (1, 'a') 9 >>> tuple((1, 2 ,3)) # 传入元组 10 (1, 2, 3) 11 >>> tuple({"a", 2, 3}) # 传入集合 12 (2, 3, 'a')
示例3:list()
1 >>> li = list() # 创建空列表 2 >>> li 3 [] 4 >>> list((1, "a")) # 传入元组 5 [1, 'a'] 6 >>> list([1, 2]) # 传入列表 7 [1, 2] 8 >>> list("abcd") # 传入字符串 9 ['a', 'b', 'c', 'd'] 10 >>> list({1:2, "a":3}) # 传入字典,仅返回键 11 [1, 'a'] 12 >>> list({1, 2, 3}) # 传入集合 13 [1, 2, 3]
示例4:set()
1 >>> set("aabc") # 传字符串 2 {'a', 'c', 'b'} 3 >>> 4 >>> set([1, 1, "a"]) # 传列表 5 {1, 'a'} 6 >>> 7 >>> set((1, 2, 2)) # 传元组 8 {1, 2} 9 >>> 10 >>> set({1, 2, 2}) # 传集合 11 {1, 2} 12 >>> 13 >>> set({1:2, 2:3}) # 传字典,仅返回键 14 {1, 2}
示例4:dict()
1 >>> dict() 2 {} 3 >>> 4 >>> dict({1: 2, 2: 3}) # 传一个字典 5 {1: 2, 2: 3} 6 >>> 7 >>> dict(one=2, two=3) # 传关键字(等号前只能是字母) 8 {'one': 2, 'two': 3} 9 >>> 10 >>> dict([(1, 2), ("a", 2)]) # 传包含一个或多个元组的列表 11 {1: 2, 'a': 2} 12 >>> 13 >>> dict(zip(["one", "two"], [1, 2])) # 传zip函数 14 {'one': 1, 'two': 2}
4. 运算符
4.1 算数运算符
运算符 | 描述 | 实例 |
---|---|---|
+ | 加 | 两个对象相加 |
- | 减 | 得到负数或是一个数减去另一个数 |
* | 乘 | 两个数相乘,或是返回一个被重复若干次的字符串 |
/ | 除 | x 除以 y |
// | 取整除 | 返回商的整数部分 |
% | 取余 | 返回除法的余数 |
** | 幂 | 返回x的y次幂 |
1 >>> 3/2 2 1.5 3 >>> 3//2 4 1 5 >>> 3%2 6 1 7 >>> 3**2 8 9
4.2 赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | c = a + b,将 a + b 的运算结果赋值为 c |
+= | 加法赋值运算符 | 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 |
:= | 海象运算符,可在表达式内部为变量赋值(Python3.8 版本新增运算符) |
在这个示例中,赋值表达式可以避免调用 len() 两次: if(n := len(a))>10:print(f"List is too long ({n} elements, expected <= 10)") |
注意 x += y 与 x = x + y 的区别:
- x += y 不会创建新的对象
- x = x + y 会创建新的对象
>>> a = [1, 2] >>> id(a) 16101608 >>> a += [3] >>> a [1, 2, 3] >>> id(a) 16101608 # 仍是相同id >>> >>> a = a + [4] >>> a [1, 2, 3, 4] >>> id(a) 16002920 # 此时id已改变
4.3 位运算符
按位运算符是把数字看作二进制来进行计算的。Python中的按位运算法则如下:
下表中变量 a 为 60,b 为 13 二进制格式如下:
a = 0011 1100 b = 0000 1101 ----------------- a & b = 0000 1100 a | b = 0011 1101 a ^ b = 0011 0001 ~a = 1100 0011
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释: 0000 1100 |
| | 按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。 | (a | b) 输出结果 61 ,二进制解释: 0011 1101 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
~ |
按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1。~x 类似于 -x-1 |
(~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
>> | 右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数 | a >> 2 输出结果 15 ,二进制解释: 0000 1111 |
注意:如果一个操作数A连续异或同一个操作数两次,那么结果还是操作数A。异或的元素的顺序不影响最终结果。
4.4 比较(关系)运算符
运算符 | 描述 | 示例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果是则条件变为真。 | 如a=3,b=3,则(a == b) 为 true。 |
!= | 检查两个操作数的值是否相等,如果值不相等,则条件变为真。 | 如a=1,b=3,则(a != b) 为 true。 |
<> | 检查两个操作数的值是否相等,如果值不相等,则条件变为真。 | 如a=1,b=3,则(a <> b) 为 true。 |
> | 检查左操作数的值是否大于右操作数的值,如果是,则条件成立。 | 如a=7,b=3,则(a > b) 为 true。 |
< | 检查左操作数的值是否小于右操作数的值,如果是,则条件成立。 | 如a=7,b=3,则(a < b) 为 false。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是,则条件成立。 | 如a=3,b=3,则(a >= b) 为 true。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是,则条件成立。 | 如a=3,b=3,则(a <= b) 为 true。 |
注意 == 与 is 的区别:
- == 检查的是两个操作数的值(内容)是否相等
- is 检查的是两个操作数的内存地址是否相同,即两个引用是否指向同一个对象
1 >>> a = [1, 2] 2 >>> b = [1, 2] 3 >>> a == b 4 True # 元素值相同,因此为真 5 >>> a is b 6 False # 内存id不同,因此为假
4.5 逻辑运算符
运算符 | 逻辑表达式 | 描述 |
---|---|---|
and | x and y | 从左到右计算表达式,遇到一个假时,满足一假俱假,不在执行后面的语句,返回第一个假值;若所有的都为真,则返回最后一个值。 |
or | x or y | 从左到右计算表达式,只要遇到一个真值时,满足一真俱真,不再执行后面的语句,返回第一个真值;若所有的都为假,则返回最后一个假值。 |
not | not x | 布尔"非",如果 x 为 True,返回 False ;如果 x 为 False,它返回 True。 |
1 >>> 1 and 0 and 2 2 0 3 >>> 1 and 2 and 3 4 3 5 >>> 0 or 1 or 2 6 1 7 >>> 0 and {} and None 8 0 9 >>> 0 or {} or () 10 ()
练习题
Python 中如何交换两个变量的值?
1 >>> # 方法一:利用第三个变量 2 >>> a = 2 3 >>> b = 3 4 >>> 5 >>> c = a 6 >>> a = b 7 >>> b = c 8 >>> a 9 3 10 >>> b 11 2 12 >>> # 方法二:利用算术运算符 13 >>> a = 2 14 >>> b = 3 15 >>> 16 >>> a = a + b 17 >>> b = a - b 18 >>> a = a - b 19 >>> a 20 3 21 >>> b 22 2 23 >>> # 方法三:Python独有的赋值方式 24 >>> a = 2 25 >>> b = 3 26 >>> a, b = b, a 27 >>> a 28 3 29 >>> b 30 2 31 >>> # 方法四:使用异或 32 >>> a = 2 33 >>> b = 3 34 >>> a = a^b 35 >>> b = a^b # == a^b^b == a 36 >>> a = a^b # == a^b^a^b^b == b 37 >>> a 38 3 39 >>> b 40 2