python 部分知识回顾
-
列表的存储方式,对于列表 list[5] 来说,他在内存中的存储形式为:
- 因为列表中的元素可以是任意类型的,所以列表不能像C中的数组那样,划分一块连续的空间,并在其中直接存储数据。她的索引划分一块连续的空间,在其中存入指向对象的引用(指针)
-
变量值的修改
a = 123 a = "abc"
当第二条代码运行时,系统再内存中新申请一片内存,并存入“abc“,之后将新内存的引用,而旧内存将由垃圾回收机制回收,垃圾回收机制的介绍
-
这里有个基本数据类型,相同的基本数据在内存中只存在一份,上面代码中的123 和 “abc”都是基本数据类型,这意味着你第二次给 a 赋值的时候,a 先与 123 的内存地址解绑,然后再与“abc”的内存地址绑定,并不是直接在 123 的内存块上将内容123 删除,换成abc
- 数值、布尔类型、字符串、字节都是基本的数据类型
-
其他的类型就不是这样了,你比如说列表,即使两个列表的内容都一样,但他们也有不同的内存地址
-
-
“```````“ 注释多行注释,其实三引号注释的方式是定义了一个字符串
# 可以试一下将多行注释的内容赋给一个变量 s = ```如果些内容可以正常运行输出,那么证明三引号中的内容是一个字符串``` print(s)
-
运算符
-
算术运算符
- 这里有个挺好玩的事儿,我们都知道 7%2 = 1,那么 (-7)&2 呢?答案也是 1,为什么呢?
- 通过 7%2 = 1 我们可以发现,7/2 = 3.5 然后我们取小于3.5的最大整数,是3,然后 7 - 2*3 = 1 是余数,按这个道理推广到负数,(-7)/2 = -3.5 然后我们取小于-3.5 的最大整数,注意这里取得不是 -3,而是-4,-4 < -3.5,而 -3 > -3.5, 然后-7 - 2*(-4) = 1
- python 与 C 不同得一个运算符是 “/”,在 C 中,这个符号是取整除法,而在python 中,这个符号得意义与数学中一致,就是普通的求商,python 中的取整运算符为“//”
-
关系运算符
- 运算符“<>”在python3中已经取消,python2中还可以使用
- “==” 和“!=” 判断的变量指向的对象“内容”是否一致,对象的地址可以不一样
-
身份运算符
- is 和 is not 用来判断是否为一个地址。指向一个地址,也就是说,两个变量指向的是一个对象
-
逻辑运算符
-
最常用的与(and)、或(or)、非(not),网上资料很多,具体的可以去搜一下,就不说了。
-
对于或、非运算,数学中的短路现象,在python中也有。
-
对于 或 运算,短路现象表现为:当第一个式子为true时,系统不执行第二个式子
-
对于 与 运算,短路现象表现为:当第一个式子为false时,系统不执行第二个式子
10>0 or print("sdf") 10<0 and print("aaa") # 运行后可以发现,两个print语句都没有得到执行
-
有些很别扭的人会写这种代码
balance or print("我太难了") # 什么意思呢 # 当 balance == 0 时,输出"我太难了" # 注意,balance 为负数和正数时,在这里相当于true,不会执行print语句
-
-
-
位运算符
-
&、|、^、~、<<、>>分别对应:与、或、按位异或、取反、左移、右移
-
首先要知道一个知识点,电脑再进行位运算时,使用的是补码。
-
我们由原码到补码的过程为:原码->符号位以外的每位取反->得到反码->之后加1->获得补码。
-
计算机为什么要使用补码呢?原码不好吗?
-
-
好,普通计算的时候方便又直观。但是,碰到负数怎么办?想过吗?感兴趣的同学可以去搜一搜
-
上面说了有原码到补码的过程,接下来由补码到原码的过程:补码->符号位以外的每位取反->得到反码->之后加1->获得原码
-
之前写0/1背包的穷举法时用过一次,程序时用C++写的,也可以尝试改为 python 的
#include<iostream> using namespace std; int num=7; void main() { double *p = new double[num] { 5, 8, 4, 6, 3, 2, 1 }; // 物品的价值 double *w = new double[num] { 8, 1, 5, 3, 6, 5, 4 }; // 物品的重量 int i, j, k; double max = 0; // 背包中物品价值的最大值 int c = 20; // 背包容量 int n = 1 << 7; double sum = 0; int x; int temp = c; // 方便对容量操作 for (i = n-1; i >=0; i--) { for (k = 0; k < 7; k++) { if ((i >> k & 1) == 1) // 判断第 k 位是否为1 { if (temp - w[k] >= 0) { temp = temp - w[k]; sum = sum + p[k]; } else break; } } if (k == 7) { if (sum > max) { max = sum; x = i; } } sum = 0; temp = c; } cout << "物品的放入情况:"; for (k = 0; k < 7; k++) { if (((x >> k) & 1) == 1) cout << 1 << " "; else cout << 0 << " "; } cout << endl <<"最大值为:"<< max << endl; system("pause"); }
-
成员运算符
-
in 和 not in 用来判断某元素是否在当前对象中
print('h' in ['h','e','l','l','o']) print(['h','e'] in ['h','e','l','l','o'])
猜猜输出结果是什么
第一个是true,第二个也是true。是不是感觉不对劲?有这个感觉的证明你是个明白人。第二个应该是false,我们说 in 和not in 使用来判断元素是否在对象中,[‘h’,‘e’]是一个元素,那[‘h’,‘e’,‘l’,‘l’,‘o’] 中有这个元素吗?显然没有。
-
-