变量的命名规则
- 由数字、字母、下划线构成,其中数字不能开头
- 系统关键字不能用在变量名中(保留关键字)
- python中区分大小写
# 变量
a = [1, 2, 3, 4] # 定义一个变量
type = 1
print(type)
type(1) # 此时的type是1 相当于是1(1) 因此int 不是可调用的
# 输出结果
1
TypeError: 'int' object is not callable
值类型和引用类型
- 常见的值类型:
int str tuple
不可改变 - 常见的引用类型:
list set dict
可改变
# 值类型
a = 1
b = a
a = 3
print(a)
print(b)
# 引用类型
list1 = [1, 2, 3, 4]
list2 = list1
list1[1] = '2'
print(list1)
print(list2)
# 输出结果
3
1
[1, '2', 3, 4]
[1, '2', 3, 4]
上述值类型和引用类型要进行区分,其中值类型会常见一块新的内存空间来存储,对于引用类型仅仅是一个指针,指向的还是同一个内存区域
string = 'hello'
id(string) # id方法可以展示出来某个变量在内存中的地址
string = string + ' python'
id(string) # 可以发现string已经发生了改变 指向了一个新的内存区域
string[0] = 'a' # str一旦定义 不可改变
# 输出结果
57705504
12109688
'str' object does not support item assignment
tuple list类型区别
list 是可变的对象,元组 tuple 是不可变的对象
由于 tuple 不可变,所以使用 tuple 可以使代码更安全
tuple 不可变的好处
相对于 list 而言,tuple 是不可变的,这使得它可以作为 dict 的 key,或者扔进 set 里,而 list 则不行。
tuple 放弃了对元素的增删(内存结构设计上变的更精简),换取的是性能上的提升:创建 tuple 比 list 要快,存储空间比 list 占用更小。所以就出现了“能用 tuple 的地方就不用 list”的说法。
多线程并发的时候,tuple 是不需要加锁的,不用担心安全问题,编写也简单多了。
# 不可修改值
a = [1, 2, 3]
print(id(a))
print(hex(id(a)))
a[0] = '1'
print(id(a))
a= (1, 2, 3)
a[0] = '1' # error
# append 操作
b = [1, 2, 3]
b.append(4)
print(b)
c = (1, 2, 3)
c.append(4) # tuple类型没有append的方法
# 输出结果
69249416
0x420a988
69249416
'tuple' object does not support item assignment
[1, 2, 3, 4]
'tuple' object has no attribute 'append'
python 运算符号
算术运算符
+
-
*
/ 除以 得到的都是float
// 整除 向下取整
% 求余
** 次方 2**3 2的三次方
赋值运算符
=
+=
*=
/=
//=
%=
**=
# 注意 python中没有++ -- 运算符
关系运算符
== # 对于number类型来说 == 判断是相等的
!=
>
<
>=
<=
# 返回的是一个bool类型
d = 1
d+=d>=1
print(d) # 2
# == 的特殊性
a = 0
b = False
print(a == b) # True
逻辑运算符
and
or
not 返回的都是bool类型
'''
逻辑短路原则
and 第一个为真 那么返回第二个;如果第一个为假,返回第一个
or 第一个为假,那么返回第二个;如果第一个为真,返回第一个
同时要注意 基本类型 和 True False的转化
'''
成员运算符
判断一个元素是否在另外的一组元素当中
in
not in
# 成员运算符可以在字符串、列表、元祖、集合、字典中进行应用,返回结果为布尔类型
b = 'c'
print(b in {'c':1})
# 输出结果
True # 字典判断的是key是否在字典中
身份运算符
is
not
# 如果两个变量取值相等,则is返回True
a = 1
b = 2
a is b # False
b = 1
a is b # True
# is和 == 的区别
'''
== 表示的是值是否相等
is 表示的是所指向的内存地址是否相等
'''
a = 1
b = 1.0
a == b # True
a is b # False
# 思考题目
a = {1,2,3}
b = {2,1,3}
a == b # True 集合是无序的
a is b # False 由于是引用类型 因此表示的是两个集合 可以用id()测试
c = (1,2,3)
d = (2,1,3)
c == d # False 元组属于序列 它是无序的
c is d # False 虽然是值类型 因为值类型是两个值 因此内存地址也不同
扩充:三种判断
- is 判断id是否相同,就是进行身份的判断,判断两个变量所对应的内存地址是否相等
- == 判断值是否相同,注意number类型来说,0和False的值是相同的
- 类型判断,判断两个变量的类型是否相同
# 判断方法一
a = 1
type(a) == int # True 不推荐使用 不能判断变量的子类是否为该类型
# 判断方法二
isinstance(a,str) # False
isinstance(a,(int,str,float)) # 这个方法的第二个参数可以接受一个元组,那么就判断a是否为元组中的任意一种 True
# 注意说明:
对象的三个特征:id value type
位运算符
都是把数当做二进制进行运算
& 按位与
| 按位或
^ 按位异或 相同为0 相反为1
- 按位取反
<< 左移运算符
>> 右移运算符
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。